<div dir="auto">This is ok. It can still break if multiple stages contain different streamout info, which might happen with separate shader objects.<div dir="auto"><br></div><div dir="auto">Marek</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 19, 2018, 1:56 AM Gert Wollny <<a href="mailto:gw.fossdev@gmail.com">gw.fossdev@gmail.com</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Gert Wollny <<a href="mailto:gert.wollny@collabora.com" target="_blank" rel="noreferrer">gert.wollny@collabora.com</a>><br>
<br>
With 5d517a streamout info is only attached to the shader for which the <br>
transform feedback is actually recorded, but the driver set the context info <br>
with each state submitted, thereby always using the info data that was <br>
attached to the vertex shader.<br>
<br>
Pass the streamout stride info to the context only from the shader that <br>
actually has outputs. (Thanks to Marek Olšák for pointing me in the right <br>
direction) <br>
<br>
Fixes regresion with: dEQP-GLES31.functional.tessellation.invariance.*<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=108734" rel="noreferrer noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=108734</a><br>
Fixes: 5d517a599b1eabd1d5696bf31e26f16568d35770<br>
  st/mesa: Don't record garbage streamout information in the non-SSO case.<br>
<br>
Signed-off-by: Gert Wollny <<a href="mailto:gert.wollny@collabora.com" target="_blank" rel="noreferrer">gert.wollny@collabora.com</a>><br>
---<br>
 src/gallium/drivers/r600/r600_state_common.c | 12 +++++++++---<br>
 1 file changed, 9 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c<br>
index 2d36541787..f886a27170 100644<br>
--- a/src/gallium/drivers/r600/r600_state_common.c<br>
+++ b/src/gallium/drivers/r600/r600_state_common.c<br>
@@ -1020,7 +1020,9 @@ static void r600_bind_vs_state(struct pipe_context *ctx, void *state)<br>
<br>
        rctx->vs_shader = (struct r600_pipe_shader_selector *)state;<br>
        r600_update_vs_writes_viewport_index(&rctx->b, r600_get_vs_info(rctx));<br>
-       rctx->b.streamout.stride_in_dw = rctx->vs_shader->so.stride;<br>
+<br>
+        if (rctx->vs_shader->so.num_outputs)<br>
+           rctx->b.streamout.stride_in_dw = rctx->vs_shader->so.stride;<br>
 }<br>
<br>
 static void r600_bind_gs_state(struct pipe_context *ctx, void *state)<br>
@@ -1035,7 +1037,9 @@ static void r600_bind_gs_state(struct pipe_context *ctx, void *state)<br>
<br>
        if (!state)<br>
                return;<br>
-       rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;<br>
+<br>
+        if (rctx->gs_shader->so.num_outputs)<br>
+           rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;<br>
 }<br>
<br>
 static void r600_bind_tcs_state(struct pipe_context *ctx, void *state)<br>
@@ -1057,7 +1061,9 @@ static void r600_bind_tes_state(struct pipe_context *ctx, void *state)<br>
<br>
        if (!state)<br>
                return;<br>
-       rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;<br>
+<br>
+        if (rctx->tes_shader->so.num_outputs)<br>
+           rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;<br>
 }<br>
<br>
 void r600_delete_shader_selector(struct pipe_context *ctx,<br>
-- <br>
2.18.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank" rel="noreferrer">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>