iris: Fix DrawTransformFeedback math when there's a buffer offset
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 22 Mar 2019 07:42:56 +0000 (00:42 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 23 Apr 2019 22:57:07 +0000 (15:57 -0700)
We need to subtract the starting offset from the final offset before
dividing by the stride.  See src/intel/vulkan/genX_cmd_buffer.c:3142.

Not known to fix anything.

src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_query.c
src/gallium/drivers/iris/iris_state.c

index ab70fc58718cbd235987bf17ef19a30ac3214541..f660c9ae2513b66a4caae3d27efda15a583bedec 100644 (file)
@@ -782,6 +782,9 @@ bool iris_blorp_upload_shader(struct blorp_batch *blorp_batch,
 void iris_math_div32_gpr0(struct iris_context *ice,
                           struct iris_batch *batch,
                           uint32_t D);
+void iris_math_add32_gpr0(struct iris_context *ice,
+                          struct iris_batch *batch,
+                          uint32_t x);
 
 uint64_t iris_timebase_scale(const struct gen_device_info *devinfo,
                              uint64_t gpu_timestamp);
index 904feba39cc08c4696c937b213c90fa9df1e6c0d..eace45c64ed065536b8924290b658ac8749f67ab 100644 (file)
@@ -503,6 +503,15 @@ iris_math_div32_gpr0(struct iris_context *ice,
    }
 }
 
+void
+iris_math_add32_gpr0(struct iris_context *ice,
+                     struct iris_batch *batch,
+                     uint32_t x)
+{
+   emit_lri32(batch, CS_GPR(1), x);
+   emit_alu_add(batch, MI_ALU_R0, MI_ALU_R0, MI_ALU_R1);
+}
+
 /*
  * GPR0 = (GPR0 == 0) ? 0 : 1;
  */
index 55ed7be647ac52324ba4ef1aa9d4228a9301774e..f4d7c698a6c32025b31fceae5e63e2a37755941b 100644 (file)
@@ -5203,6 +5203,8 @@ iris_upload_render_state(struct iris_context *ice,
          lrm.MemoryAddress =
             ro_bo(iris_resource_bo(so->offset.res), so->offset.offset);
       }
+      if (so->base.buffer_offset)
+         iris_math_add32_gpr0(ice, batch, -so->base.buffer_offset);
       iris_math_div32_gpr0(ice, batch, so->stride);
       _iris_emit_lrr(batch, _3DPRIM_VERTEX_COUNT, CS_GPR(0));