diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2016-06-22 00:33:46 -0700 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2016-06-23 11:58:50 -0700 |
commit | 4db98f8beb990676be0833dda6c37566d0283911 (patch) | |
tree | bfab0300dd444ce6eb7814e2c64df756e980028b /src/mesa/drivers/dri/i965/gen7_sol_state.c | |
parent | fb857b5eea43640bfe19dcc12a88a09a6448e55a (diff) | |
download | external_mesa3d-4db98f8beb990676be0833dda6c37566d0283911.zip external_mesa3d-4db98f8beb990676be0833dda6c37566d0283911.tar.gz external_mesa3d-4db98f8beb990676be0833dda6c37566d0283911.tar.bz2 |
i965: Combine 3DSTATE_STREAMOUT emitters and genX_sol_state atoms.
They're basically the same. Let's avoid the code duplication.
v2: Fix SO_BUFFER_ENABLE stuff to only happen on Gen < 8 (caught
by Jason Ekstrand).
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen7_sol_state.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_sol_state.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c b/src/mesa/drivers/dri/i965/gen7_sol_state.c index 4749cc8..6f51040 100644 --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c @@ -222,7 +222,9 @@ upload_3dstate_streamout(struct brw_context *brw, bool active, /* BRW_NEW_TRANSFORM_FEEDBACK */ struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; - uint32_t dw1 = 0, dw2 = 0; + const struct gl_transform_feedback_info *linked_xfb_info = + &xfb_obj->shader_program->LinkedTransformFeedback; + uint32_t dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0; int i; if (active) { @@ -237,10 +239,12 @@ upload_3dstate_streamout(struct brw_context *brw, bool active, if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) dw1 |= SO_REORDER_TRAILING; - for (i = 0; i < 4; i++) { - if (xfb_obj->Buffers[i]) { - dw1 |= SO_BUFFER_ENABLE(i); - } + if (brw->gen < 8) { + for (i = 0; i < 4; i++) { + if (xfb_obj->Buffers[i]) { + dw1 |= SO_BUFFER_ENABLE(i); + } + } } /* We always read the whole vertex. This could be reduced at some @@ -258,12 +262,30 @@ upload_3dstate_streamout(struct brw_context *brw, bool active, dw2 |= SET_FIELD(urb_entry_read_offset, SO_STREAM_3_VERTEX_READ_OFFSET); dw2 |= SET_FIELD(urb_entry_read_length - 1, SO_STREAM_3_VERTEX_READ_LENGTH); + + if (brw->gen >= 8) { + /* Set buffer pitches; 0 means unbound. */ + if (xfb_obj->Buffers[0]) + dw3 |= linked_xfb_info->Buffers[0].Stride * 4; + if (xfb_obj->Buffers[1]) + dw3 |= (linked_xfb_info->Buffers[1].Stride * 4) << 16; + if (xfb_obj->Buffers[2]) + dw4 |= linked_xfb_info->Buffers[2].Stride * 4; + if (xfb_obj->Buffers[3]) + dw4 |= (linked_xfb_info->Buffers[3].Stride * 4) << 16; + } } - BEGIN_BATCH(3); - OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (3 - 2)); + const int dwords = brw->gen >= 8 ? 5 : 3; + + BEGIN_BATCH(dwords); + OUT_BATCH(_3DSTATE_STREAMOUT << 16 | (dwords - 2)); OUT_BATCH(dw1); OUT_BATCH(dw2); + if (dwords > 3) { + OUT_BATCH(dw3); + OUT_BATCH(dw4); + } ADVANCE_BATCH(); } @@ -275,7 +297,11 @@ upload_sol_state(struct brw_context *brw) bool active = _mesa_is_xfb_active_and_unpaused(ctx); if (active) { - upload_3dstate_so_buffers(brw); + if (brw->gen >= 8) + gen8_upload_3dstate_so_buffers(brw); + else + upload_3dstate_so_buffers(brw); + /* BRW_NEW_VUE_MAP_GEOM_OUT */ gen7_upload_3dstate_so_decl_list(brw, &brw->vue_map_geom_out); } |