i965: Go back to using the kernel SOL reset feature.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 24 May 2013 03:19:19 +0000 (20:19 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 23 May 2013 20:32:02 +0000 (13:32 -0700)
It turns out the MI_LOAD_REGISTER_IMM approach doesn't work on Haswell,
and regressed essentially all the transform feedback Piglit tests.

This morally reverts eaa6fbe6d54dc99efac4ab8e800edef65ce8220d.  However,
the code is still simpler than it was.  On BeginTransformFeedback, we
simply flush the batch and set the SOL reset flag so that the next batch
will start with zeroed offsets.  There's still no software counting.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=64887
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/gen7_sol_state.c
src/mesa/drivers/dri/intel/intel_batchbuffer.c
src/mesa/drivers/dri/intel/intel_context.h

index 8dfac01ff022e40881a15ddfca84570dccb4cfe7..9e5f5f72e837bb5437dc9fd50dcd32ff75a755d4 100644 (file)
@@ -260,14 +260,8 @@ gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
    struct brw_context *brw = brw_context(ctx);
    struct intel_context *intel = &brw->intel;
 
-   /* Reset the SOL buffer offset register. */
-   for (int i = 0; i < 4; i++) {
-      BEGIN_BATCH(3);
-      OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2));
-      OUT_BATCH(GEN7_SO_WRITE_OFFSET(i));
-      OUT_BATCH(0);
-      ADVANCE_BATCH();
-   }
+   intel_batchbuffer_flush(intel);
+   intel->batch.needs_sol_reset = true;
 }
 
 void
index c7f6d56e5592423f8ca190e25ff9242a7b1f827a..8c6524e71af72205411a6d65487bacbbd52eb80c 100644 (file)
@@ -96,6 +96,7 @@ intel_batchbuffer_reset(struct intel_context *intel)
    intel->batch.reserved_space = BATCH_RESERVED;
    intel->batch.state_batch_offset = intel->batch.bo->size;
    intel->batch.used = 0;
+   intel->batch.needs_sol_reset = false;
 }
 
 void
@@ -198,6 +199,9 @@ do_flush_locked(struct intel_context *intel)
         flags = I915_EXEC_BLT;
       }
 
+      if (batch->needs_sol_reset)
+        flags |= I915_EXEC_GEN7_SOL_RESET;
+
       if (ret == 0) {
          if (unlikely(INTEL_DEBUG & DEBUG_AUB) && intel->vtbl.annotate_aub)
             intel->vtbl.annotate_aub(intel);
index 8c50e6e612117ca777c7fcc08bc27ef5e7056554..c0f07ff1f3c87e559f48f749389e4975e6961363 100644 (file)
@@ -135,6 +135,7 @@ struct intel_batchbuffer {
 
    uint32_t state_batch_offset;
    bool is_blit;
+   bool needs_sol_reset;
 
    struct {
       uint16_t used;