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.foss...@gmail.com wrote: > From: Gert Wollny <gert.wol...@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.wol...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev