On Sat, Apr 04, 2015 at 03:46:33AM -0700, Kenneth Graunke wrote: > Presumably no one has noticed this breakage because > ARB_transform_feedback3 isn't exposed on Haswell due to the ongoing > command streamer shenanigans, and ARB_gpu_shader5 isn't exposed on > Broadwell because we keep forgetting about it. > > Fixes 3 Piglit tests: > - spec/arb_gpu_shader5/emitstreamvertex_nodraw > - spec/arb_gpu_shader5/xfb-streams > - spec/arb_transform_feedback3/ext_interleaved_two_bufs_gs_max > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Cc: mesa-sta...@lists.freedesktop.org > --- > src/mesa/drivers/dri/i965/gen7_sol_state.c | 21 +++++++++++++++++++++ > src/mesa/drivers/dri/i965/gen8_sol_state.c | 20 ++++++++++++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c > b/src/mesa/drivers/dri/i965/gen7_sol_state.c > index 7e9b285..50aff14 100644 > --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c > +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c > @@ -223,6 +223,24 @@ upload_3dstate_streamout(struct brw_context *brw, bool > active, > uint32_t dw1 = 0, dw2 = 0; > int i; > > + /* On Haswell, enable the stream out function if the geometry shader uses > + * multiple streams, even if transform feedback is inactive. This is > + * required to prevent streams 1-3 from being rasterized. > + * > + * From the Haswell PRM, "Command Reference: Instructions", Page 797 > + * (3DSTATE_STREAMOUT DWord 1 bits 28:27 "Render Stream Select"): > + * > + * "[DevHSW+] SO Function Enable must also be ENABLED in order for this > + * field to select a stream for rendering. When SO Function Enable is > + * DISABLED and Render Disable is cleared (i.e., rendering is enabled), > + * StreamID is ignored downstream of the SO stage, allowing any stream > + * to be rendered." > + * > + * BRW_NEW_GEOMETRY_PROGRAM > + */ > + if (brw->is_haswell && brw->geometry_program && > brw->geometry_program->UsesStreams)
Just caught my eye, this is overflowing 80 columns in case you haven't pushed yet. > + dw1 |= SO_FUNCTION_ENABLE; > + > if (active) { > int urb_entry_read_offset = 0; > int urb_entry_read_length = (vue_map->num_slots + 1) / 2 - > @@ -282,6 +300,8 @@ upload_sol_state(struct brw_context *brw) > * the nonpipelined SOL state (3DSTATE_SO_BUFFER, 3DSTATE_SO_DECL_LIST) or > * MMIO register updates (current performed by the kernel at each batch > * emit). > + * > + * BRW_NEW_GEOMETRY_PROGRAM > */ > upload_3dstate_streamout(brw, active, &brw->vue_map_geom_out); > } > @@ -290,6 +310,7 @@ const struct brw_tracked_state gen7_sol_state = { > .dirty = { > .mesa = _NEW_LIGHT, > .brw = BRW_NEW_BATCH | > + BRW_NEW_GEOMETRY_PROGRAM | > BRW_NEW_VUE_MAP_GEOM_OUT | > BRW_NEW_TRANSFORM_FEEDBACK, > }, > diff --git a/src/mesa/drivers/dri/i965/gen8_sol_state.c > b/src/mesa/drivers/dri/i965/gen8_sol_state.c > index d98a226..4b2f377 100644 > --- a/src/mesa/drivers/dri/i965/gen8_sol_state.c > +++ b/src/mesa/drivers/dri/i965/gen8_sol_state.c > @@ -109,6 +109,24 @@ gen8_upload_3dstate_streamout(struct brw_context *brw, > bool active, > &xfb_obj->shader_program->LinkedTransformFeedback; > uint32_t dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0; > > + /* Enable the stream out function if the geometry shader uses multiple > + * streams, even if transform feedback is inactive. This is required > + * to prevent streams 1-3 from being rasterized. > + * > + * From the Haswell PRM, "Command Reference: Instructions", Page 797 > + * (3DSTATE_STREAMOUT DWord 1 bits 28:27 "Render Stream Select"): > + * > + * "[DevHSW+] SO Function Enable must also be ENABLED in order for this > + * field to select a stream for rendering. When SO Function Enable is > + * DISABLED and Render Disable is cleared (i.e., rendering is enabled), > + * StreamID is ignored downstream of the SO stage, allowing any stream > + * to be rendered." > + * > + * BRW_NEW_GEOMETRY_PROGRAM > + */ > + if (brw->geometry_program && brw->geometry_program->UsesStreams) > + dw1 |= SO_FUNCTION_ENABLE; > + > if (active) { > int urb_entry_read_offset = 0; > int urb_entry_read_length = (vue_map->num_slots + 1) / 2 - > @@ -170,6 +188,7 @@ upload_sol_state(struct brw_context *brw) > gen7_upload_3dstate_so_decl_list(brw, &brw->vue_map_geom_out); > } > > + /* BRW_NEW_GEOMETRY_PROGRAM */ > gen8_upload_3dstate_streamout(brw, active, &brw->vue_map_geom_out); > } > > @@ -177,6 +196,7 @@ const struct brw_tracked_state gen8_sol_state = { > .dirty = { > .mesa = _NEW_LIGHT, > .brw = BRW_NEW_BATCH | > + BRW_NEW_GEOMETRY_PROGRAM | > BRW_NEW_TRANSFORM_FEEDBACK | > BRW_NEW_VUE_MAP_GEOM_OUT, > }, > -- > 2.3.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev