summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/hsw_sol.c
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2016-05-08 22:48:02 -0700
committerKenneth Graunke <kenneth@whitecape.org>2016-05-20 19:55:42 -0700
commit9c0d16adc16e53f8d978eb0e8857071fbd1f07cd (patch)
treee2530c9607c369fa39869cf63dadaa06ab63f21d /src/mesa/drivers/dri/i965/hsw_sol.c
parent915f7c25fac2683f924fded2b47208c7fb850044 (diff)
downloadexternal_mesa3d-9c0d16adc16e53f8d978eb0e8857071fbd1f07cd.zip
external_mesa3d-9c0d16adc16e53f8d978eb0e8857071fbd1f07cd.tar.gz
external_mesa3d-9c0d16adc16e53f8d978eb0e8857071fbd1f07cd.tar.bz2
i965: Just read the existing tally on EndTransformFeedback if paused.
If the transform feedback object is paused when ending, then there are no new snapshots to add to the tally. In fact, we haven't written a starting snapshot, so we'd best not try and compute (end - start). Just load the existing tally so we can convert it to the number of vertices written and store it to the final result location. This is the Haswell+ equivalent of the previous commit. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/hsw_sol.c')
-rw-r--r--src/mesa/drivers/dri/i965/hsw_sol.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/mesa/drivers/dri/i965/hsw_sol.c b/src/mesa/drivers/dri/i965/hsw_sol.c
index ef8fcf4..e299b02 100644
--- a/src/mesa/drivers/dri/i965/hsw_sol.c
+++ b/src/mesa/drivers/dri/i965/hsw_sol.c
@@ -95,27 +95,29 @@ tally_prims_written(struct brw_context *brw,
I915_GEM_DOMAIN_INSTRUCTION,
I915_GEM_DOMAIN_INSTRUCTION,
TALLY_OFFSET + i * sizeof(uint32_t));
- /* GPR1 = Start Snapshot */
- brw_load_register_mem64(brw, HSW_CS_GPR(1), obj->prim_count_bo,
- I915_GEM_DOMAIN_INSTRUCTION,
- I915_GEM_DOMAIN_INSTRUCTION,
- START_OFFSET + i * sizeof(uint64_t));
- /* GPR2 = Ending Snapshot */
- brw_load_register_reg64(brw, GEN7_SO_NUM_PRIMS_WRITTEN(i), HSW_CS_GPR(2));
+ if (!obj->base.Paused) {
+ /* GPR1 = Start Snapshot */
+ brw_load_register_mem64(brw, HSW_CS_GPR(1), obj->prim_count_bo,
+ I915_GEM_DOMAIN_INSTRUCTION,
+ I915_GEM_DOMAIN_INSTRUCTION,
+ START_OFFSET + i * sizeof(uint64_t));
+ /* GPR2 = Ending Snapshot */
+ brw_load_register_reg64(brw, GEN7_SO_NUM_PRIMS_WRITTEN(i), HSW_CS_GPR(2));
- BEGIN_BATCH(9);
- OUT_BATCH(HSW_MI_MATH | (9 - 2));
- /* GPR1 = GPR2 (End) - GPR1 (Start) */
- OUT_BATCH(MI_MATH_ALU2(LOAD, SRCA, R2));
- OUT_BATCH(MI_MATH_ALU2(LOAD, SRCB, R1));
- OUT_BATCH(MI_MATH_ALU0(SUB));
- OUT_BATCH(MI_MATH_ALU2(STORE, R1, ACCU));
- /* GPR0 = GPR0 (Tally) + GPR1 (Diff) */
- OUT_BATCH(MI_MATH_ALU2(LOAD, SRCA, R0));
- OUT_BATCH(MI_MATH_ALU2(LOAD, SRCB, R1));
- OUT_BATCH(MI_MATH_ALU0(ADD));
- OUT_BATCH(MI_MATH_ALU2(STORE, R0, ACCU));
- ADVANCE_BATCH();
+ BEGIN_BATCH(9);
+ OUT_BATCH(HSW_MI_MATH | (9 - 2));
+ /* GPR1 = GPR2 (End) - GPR1 (Start) */
+ OUT_BATCH(MI_MATH_ALU2(LOAD, SRCA, R2));
+ OUT_BATCH(MI_MATH_ALU2(LOAD, SRCB, R1));
+ OUT_BATCH(MI_MATH_ALU0(SUB));
+ OUT_BATCH(MI_MATH_ALU2(STORE, R1, ACCU));
+ /* GPR0 = GPR0 (Tally) + GPR1 (Diff) */
+ OUT_BATCH(MI_MATH_ALU2(LOAD, SRCA, R0));
+ OUT_BATCH(MI_MATH_ALU2(LOAD, SRCB, R1));
+ OUT_BATCH(MI_MATH_ALU0(ADD));
+ OUT_BATCH(MI_MATH_ALU2(STORE, R0, ACCU));
+ ADVANCE_BATCH();
+ }
if (!finalize) {
/* Write back the new tally */