summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen7_sol_state.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-12-29 23:26:48 -0800
committerEric Anholt <eric@anholt.net>2012-01-06 09:17:14 -0800
commit6c0b70e7740b30ee46ae28f6b3b7fe7223621ebd (patch)
treeda965313f3ffe6d2b8e7c7c2b93909b038ca17c6 /src/mesa/drivers/dri/i965/gen7_sol_state.c
parent7f91c8bf2bf08afd297314c02a8869d8919f5f0e (diff)
downloadexternal_mesa3d-6c0b70e7740b30ee46ae28f6b3b7fe7223621ebd.zip
external_mesa3d-6c0b70e7740b30ee46ae28f6b3b7fe7223621ebd.tar.gz
external_mesa3d-6c0b70e7740b30ee46ae28f6b3b7fe7223621ebd.tar.bz2
i965/gen7: Fix up the transform feedback buffer pointers on later batches.
Fixes piglit EXT_transform_feedback/intervening-read Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen7_sol_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen7_sol_state.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c b/src/mesa/drivers/dri/i965/gen7_sol_state.c
index 81ffc0e..04783ec 100644
--- a/src/mesa/drivers/dri/i965/gen7_sol_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c
@@ -56,6 +56,7 @@ upload_3dstate_so_buffers(struct brw_context *brw)
struct gl_buffer_object *bufferobj = xfb_obj->Buffers[i];
drm_intel_bo *bo;
uint32_t start, end;
+ uint32_t stride;
if (!xfb_obj->Buffers[i]) {
/* The pitch of 0 in this command indicates that the buffer is
@@ -72,17 +73,23 @@ upload_3dstate_so_buffers(struct brw_context *brw)
}
bo = intel_buffer_object(bufferobj)->buffer;
+ stride = linked_xfb_info->BufferStride[i] * 4;
start = xfb_obj->Offset[i];
assert(start % 4 == 0);
end = ALIGN(start + xfb_obj->Size[i], 4);
assert(end <= bo->size);
+ /* Offset the starting offset by the current vertex index into the
+ * feedback buffer, offset register is always set to 0 at the start of the
+ * batchbuffer.
+ */
+ start += brw->sol.offset_0_batch_start * stride;
+ assert(start <= end);
+
BEGIN_BATCH(4);
OUT_BATCH(_3DSTATE_SO_BUFFER << 16 | (4 - 2));
- OUT_BATCH((i << SO_BUFFER_INDEX_SHIFT) |
- ((linked_xfb_info->BufferStride[i] * 4) <<
- SO_BUFFER_PITCH_SHIFT));
+ OUT_BATCH((i << SO_BUFFER_INDEX_SHIFT) | stride);
OUT_RELOC(bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, start);
OUT_RELOC(bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, end);
ADVANCE_BATCH();