<div dir="ltr"><div>You can try to remove streamout.stride_in_dw and get it directly from the correct shader where stride_in_dw is used.</div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 14, 2018 at 12:55 PM 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">Hi Kenneth, <br>
<br>
unfortunately this patch breaks r600. I tried to dig into it to figure<br>
out where things going wrong but I was not very successful so far.<br>
While the right shader (TES) registers the stream output in the shader<br>
translation also with your patch, querying with GL_QUERY_RESULT just<br>
now returns zero. I've logged my findings in this bug:<br>
<br>
  <a href="https://bugs.freedesktop.org/show_bug.cgi?id=108734" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=108734</a><br>
<br>
Any idea where things could go wrong? <br>
<br>
Best, <br>
Gert<br>
<br>
Am Donnerstag, den 25.10.2018, 02:16 -0700 schrieb Kenneth Graunke:<br>
> In the non-SSO case, where multiple shader stages are linked<br>
> together,<br>
> we were recording garbage pipe_stream_output_info structures for all<br>
> but the last enabled geometry-processing stage.<br>
> <br>
> Specifically, we were using the gl_transform_feedback_info from<br>
> shader_program->last_vert_prog (the stage whose outputs will be<br>
> recorded)...but were pairing it with the output varying mappings<br>
> from the current shader stage.  For example, a program with a VS and<br>
> GS, the VS's pipe_shader_state would have a pipe_stream_output_info<br>
> based on the GS transform feedback info, but the VS output mapping.<br>
> <br>
> This generally worked out okay because only the<br>
> pipe_stream_output_info<br>
> for the last stage really matters - the others can be<br>
> ignored.  However,<br>
> we'd like to avoid confusing the pipe driver.  In particular, my new<br>
> driver translates the stream out information to hardware packets at<br>
> bind_{vs,tes,gs}_state() time...and was hitting asserts about garbage<br>
> varyings that didn't exist.<br>
> <br>
> This patch changes st/mesa to record a blank pipe_stream_output_info<br>
> with num_outputs = 0 for all stages prior to last_vert_prog.  The<br>
> last<br>
> one is captured as normal.<br>
> <br>
> (In the fully-SSO case, nothing should change - each program contains<br>
> a single shader stage, so last_vert_prog *is* the current shader.)<br>
> <br>
> Tested with llvmpipe (piglit's gpu profile), and freedreno (a3xx,<br>
> gpu profile with -t transform.feedback).  Fixes several hundred CTS<br>
> tests on my new driver.<br>
> ---<br>
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 20 ++++++--------------<br>
>  src/mesa/state_tracker/st_glsl_to_tgsi.h   |  7 +------<br>
>  src/mesa/state_tracker/st_program.c        | 19 ++++++++-----------<br>
>  3 files changed, 15 insertions(+), 31 deletions(-)<br>
> <br>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
> index dea91c7a189..19bd46d6097 100644<br>
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
> @@ -7467,25 +7467,17 @@ st_link_shader(struct gl_context *ctx, struct<br>
> gl_shader_program *prog)<br>
>  }<br>
>  <br>
>  void<br>
> -st_translate_stream_output_info(glsl_to_tgsi_visitor *glsl_to_tgsi,<br>
> -                                const ubyte outputMapping[],<br>
> -                                struct pipe_stream_output_info *so)<br>
> -{<br>
> -   if (!glsl_to_tgsi->shader_program->last_vert_prog)<br>
> -      return;<br>
> -<br>
> -   struct gl_transform_feedback_info *info =<br>
> -      glsl_to_tgsi->shader_program->last_vert_prog-<br>
> >sh.LinkedTransformFeedback;<br>
> -   st_translate_stream_output_info2(info, outputMapping, so);<br>
> -}<br>
> -<br>
> -void<br>
> -st_translate_stream_output_info2(struct gl_transform_feedback_info<br>
> *info,<br>
> +st_translate_stream_output_info(struct gl_transform_feedback_info<br>
> *info,<br>
>                                  const ubyte outputMapping[],<br>
>                                  struct pipe_stream_output_info *so)<br>
>  {<br>
>     unsigned i;<br>
>  <br>
> +   if (!info) {<br>
> +      so->num_outputs = 0;<br>
> +      return;<br>
> +   }<br>
> +<br>
>     for (i = 0; i < info->NumOutputs; i++) {<br>
>        so->output[i].register_index =<br>
>           outputMapping[info->Outputs[i].OutputRegister];<br>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.h<br>
> b/src/mesa/state_tracker/st_glsl_to_tgsi.h<br>
> index 8ccfff9bd37..fa6c0e02712 100644<br>
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.h<br>
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.h<br>
> @@ -58,12 +58,7 @@ void free_glsl_to_tgsi_visitor(struct<br>
> glsl_to_tgsi_visitor *v);<br>
>  GLboolean st_link_shader(struct gl_context *ctx, struct<br>
> gl_shader_program *prog);<br>
>  <br>
>  void<br>
> -st_translate_stream_output_info(struct glsl_to_tgsi_visitor<br>
> *glsl_to_tgsi,<br>
> -                                const ubyte outputMapping[],<br>
> -                                struct pipe_stream_output_info *so);<br>
> -<br>
> -void<br>
> -st_translate_stream_output_info2(struct gl_transform_feedback_info<br>
> *info,<br>
> +st_translate_stream_output_info(struct gl_transform_feedback_info<br>
> *info,<br>
>                                  const ubyte outputMapping[],<br>
>                                  struct pipe_stream_output_info *so);<br>
>  <br>
> diff --git a/src/mesa/state_tracker/st_program.c<br>
> b/src/mesa/state_tracker/st_program.c<br>
> index af86c47b945..3bc7b0649c4 100644<br>
> --- a/src/mesa/state_tracker/st_program.c<br>
> +++ b/src/mesa/state_tracker/st_program.c<br>
> @@ -458,12 +458,9 @@ st_translate_vertex_program(struct st_context<br>
> *st,<br>
>     }<br>
>  <br>
>     if (stvp->shader_program) {<br>
> -      struct gl_program *prog = stvp->shader_program-<br>
> >last_vert_prog;<br>
> -      if (prog) {<br>
> -         st_translate_stream_output_info2(prog-<br>
> >sh.LinkedTransformFeedback,<br>
> -                                          stvp->result_to_output,<br>
> -                                          &stvp-<br>
> >tgsi.stream_output);<br>
> -      }<br>
> +      st_translate_stream_output_info(stvp-<br>
> >Base.sh.LinkedTransformFeedback,<br>
> +                                      stvp->result_to_output,<br>
> +                                      &stvp->tgsi.stream_output);<br>
>  <br>
>        st_store_ir_in_disk_cache(st, &stvp->Base, true);<br>
>        return true;<br>
> @@ -505,7 +502,7 @@ st_translate_vertex_program(struct st_context<br>
> *st,<br>
>                                     output_semantic_name,<br>
>                                     output_semantic_index);<br>
>  <br>
> -      st_translate_stream_output_info(stvp->glsl_to_tgsi,<br>
> +      st_translate_stream_output_info(stvp-<br>
> >Base.sh.LinkedTransformFeedback,<br>
>                                        stvp->result_to_output,<br>
>                                        &stvp->tgsi.stream_output);<br>
>  <br>
> @@ -1417,7 +1414,7 @@ st_translate_program_common(struct st_context<br>
> *st,<br>
>     }<br>
>     ureg_destroy(ureg);<br>
>  <br>
> -   st_translate_stream_output_info(glsl_to_tgsi,<br>
> +   st_translate_stream_output_info(prog->sh.LinkedTransformFeedback,<br>
>                                     outputMapping,<br>
>                                     &out_state->stream_output);<br>
>  <br>
> @@ -1464,9 +1461,9 @@ st_translate_program_stream_output(struct<br>
> gl_program *prog,<br>
>        }<br>
>     }<br>
>  <br>
> -   st_translate_stream_output_info2(prog-<br>
> >sh.LinkedTransformFeedback,<br>
> -                                    outputMapping,<br>
> -                                    stream_output);<br>
> +   st_translate_stream_output_info(prog->sh.LinkedTransformFeedback,<br>
> +                                   outputMapping,<br>
> +                                   stream_output);<br>
>  }<br>
>  <br>
>  /**<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>