iris: Fix SO stride units for DrawTransformFeedback
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 3 Jun 2019 23:52:59 +0000 (16:52 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 4 Jun 2019 05:51:18 +0000 (22:51 -0700)
Mesa measures in DWords.  The hardware also claims to measure in DWords.
Except the SO_WRITE_OFFSET field is actually bits 31:2, with 1:0 MBZ.
Which means that it really measures in bytes.  So, convert to bytes.

Without this, our offset / stride denominator was 1/4th the size it
should be, leading to 4x the vertex count that we should have had.

Fixes GTF-GL46.gtf40.GL3Tests.transform_feedback2.transform_feedback2_two_buffers

src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c

index 4e544f830fd9ad7722785cd4db0bbde0816b675b..e319ecb6df1a72d5afa3f0bc343e90c93af9b254 100644 (file)
@@ -396,7 +396,7 @@ struct iris_stream_output_target {
    /** Storage holding the offset where we're writing in the buffer */
    struct iris_state_ref offset;
 
-   /** Stride (dwords-per-vertex) during this transform feedback operation */
+   /** Stride (bytes-per-vertex) during this transform feedback operation */
    uint16_t stride;
 
    /** Has 3DSTATE_SO_BUFFER actually been emitted, zeroing the offsets? */
index 3f8896ffd7df68175f9a2a9d7bf410515b052bc5..d2a17b17ae7a5ef889b7a38f8ce48aab8837325e 100644 (file)
@@ -1666,7 +1666,7 @@ iris_update_compiled_shaders(struct iris_context *ice)
          struct iris_stream_output_target *so =
             (void *) ice->state.so_target[i];
          if (so)
-            so->stride = ish->stream_output.stride[i];
+            so->stride = ish->stream_output.stride[i] * sizeof(uint32_t);
       }
    }