[Mesa-dev] [PATCH] r600: Only set context streamout strides info from the shader that has outputs

Marek Olšák maraeo at gmail.com
Mon Nov 19 07:38:05 UTC 2018


This is ok. It can still break if multiple stages contain different
streamout info, which might happen with separate shader objects.

Marek

On Mon, Nov 19, 2018, 1:56 AM Gert Wollny <gw.fossdev at gmail.com wrote:

> From: Gert Wollny <gert.wollny at collabora.com>
>
> With 5d517a streamout info is only attached to the shader for which the
> transform feedback is actually recorded, but the driver set the context
> info
> with each state submitted, thereby always using the info data that was
> attached to the vertex shader.
>
> Pass the streamout stride info to the context only from the shader that
> actually has outputs. (Thanks to Marek Olšák for pointing me in the right
> direction)
>
> Fixes regresion with: dEQP-GLES31.functional.tessellation.invariance.*
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108734
> Fixes: 5d517a599b1eabd1d5696bf31e26f16568d35770
>   st/mesa: Don't record garbage streamout information in the non-SSO case.
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
>  src/gallium/drivers/r600/r600_state_common.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_state_common.c
> b/src/gallium/drivers/r600/r600_state_common.c
> index 2d36541787..f886a27170 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -1020,7 +1020,9 @@ static void r600_bind_vs_state(struct pipe_context
> *ctx, void *state)
>
>         rctx->vs_shader = (struct r600_pipe_shader_selector *)state;
>         r600_update_vs_writes_viewport_index(&rctx->b,
> r600_get_vs_info(rctx));
> -       rctx->b.streamout.stride_in_dw = rctx->vs_shader->so.stride;
> +
> +        if (rctx->vs_shader->so.num_outputs)
> +           rctx->b.streamout.stride_in_dw = rctx->vs_shader->so.stride;
>  }
>
>  static void r600_bind_gs_state(struct pipe_context *ctx, void *state)
> @@ -1035,7 +1037,9 @@ static void r600_bind_gs_state(struct pipe_context
> *ctx, void *state)
>
>         if (!state)
>                 return;
> -       rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;
> +
> +        if (rctx->gs_shader->so.num_outputs)
> +           rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;
>  }
>
>  static void r600_bind_tcs_state(struct pipe_context *ctx, void *state)
> @@ -1057,7 +1061,9 @@ static void r600_bind_tes_state(struct pipe_context
> *ctx, void *state)
>
>         if (!state)
>                 return;
> -       rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;
> +
> +        if (rctx->tes_shader->so.num_outputs)
> +           rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;
>  }
>
>  void r600_delete_shader_selector(struct pipe_context *ctx,
> --
> 2.18.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181119/77c3d2a8/attachment.html>


More information about the mesa-dev mailing list