[Mesa-stable] [Mesa-dev] [PATCH 3/3] i965: Make sure GS output streams 1-3 aren't rasterized on Haswell+.

Pohjolainen, Topi topi.pohjolainen at intel.com
Sun Apr 5 00:47:32 PDT 2015


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 <kenneth at whitecape.org>
> Cc: mesa-stable at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-stable mailing list