[Mesa-dev] [PATCH 3/3] i965: Just read the existing tally on EndTransformFeedback if paused.

Kenneth Graunke kenneth at whitecape.org
Mon May 9 22:18:23 UTC 2016


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 at whitecape.org>
---
 src/mesa/drivers/dri/i965/hsw_sol.c | 42 +++++++++++++++++++------------------
 1 file 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 */
-- 
2.8.2



More information about the mesa-dev mailing list