i965: Just read the existing tally on EndTransformFeedback if paused.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 9 May 2016 05:48:02 +0000 (22:48 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 21 May 2016 02:55:42 +0000 (19:55 -0700)
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>
src/mesa/drivers/dri/i965/hsw_sol.c

index ef8fcf48346966ee36f59b0a38d2f51c7e21c6ca..e299b02270630f06c75c0196bb7ce615baf7a4b3 100644 (file)
@@ -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 */