[Mesa-dev] [PATCH] glsl/linker: Link all out vars from a shader objects on a single stage

Timothy Arceri tarceri at itsqueeze.com
Wed Aug 29 10:05:44 UTC 2018


On 28/08/18 17:34, Vadim Shovkoplias wrote:
> Hi Timothy,
> 
> Thanks for the review! Space was removed. Can you please push this patch 
> since I haven't got write permissions ?

For some reason the space was still there but I removed it and pushed. 
Thanks for the patch.

> 
> Regards,
> Vadym
> 
> вт, 28 авг. 2018 г. в 10:32, Vadym Shovkoplias 
> <vadim.shovkoplias at gmail.com <mailto:vadim.shovkoplias at gmail.com>>:
> 
>     From: "vadym.shovkoplias" <vadym.shovkoplias at globallogic.com
>     <mailto:vadym.shovkoplias at globallogic.com>>
> 
>     During intra stage linking some out variables can be dropped because
>     it is not used in a shader with the main function. But these out vars
>     can be referenced on later stages which can lead to further linking
>     errors.
> 
>     Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105731
>     Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com
>     <mailto:vadym.shovkoplias at globallogic.com>>
>     ---
>       src/compiler/glsl/linker.cpp | 37 ++++++++++++++++++++++++++++++++++++
>       1 file changed, 37 insertions(+)
> 
>     diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
>     index 3ce78fe642..dbd76b7fcc 100644
>     --- a/src/compiler/glsl/linker.cpp
>     +++ b/src/compiler/glsl/linker.cpp
>     @@ -2187,6 +2187,40 @@ link_cs_input_layout_qualifiers(struct
>     gl_shader_program *prog,
>          }
>       }
> 
>     +/**
>     + * Link all out variables on a single stage which are not
>     + * directly used in a shader with the main function.
>     + */
>     +static void
>     +link_output_variables(struct gl_linked_shader *linked_shader,
>     +                      struct gl_shader **shader_list,
>     +                      unsigned num_shaders)
>     +{
>     +   struct glsl_symbol_table *symbols = linked_shader->symbols;
>     +
>     +   for (unsigned i = 0; i < num_shaders; i++) {
>     +
>     +      /* Skip shader object with main function */
>     +      if (shader_list[i]->symbols->get_function("main"))
>     +         continue;
>     +
>     +      foreach_in_list (ir_instruction, ir, shader_list[i]->ir) {
>     +         if (ir->ir_type != ir_type_variable)
>     +            continue;
>     +
>     +         ir_variable *const var = (ir_variable *) ir;
>     +
>     +         if (var->data.mode == ir_var_shader_out &&
>     +               !symbols->get_variable(var->name)) {
>     +            symbols->add_variable(var);
>     +            linked_shader->ir->push_head(var);
>     +         }
>     +      }
>     +   }
>     +
>     +   return;
>     +}
>     +
> 
>       /**
>        * Combine a group of shaders for a single stage to generate a
>     linked shader
>     @@ -2352,6 +2386,9 @@ link_intrastage_shaders(void *mem_ctx,
>             return NULL;
>          }
> 
>     +   if (linked->Stage != MESA_SHADER_FRAGMENT)
>     +      link_output_variables(linked, shader_list, num_shaders);
>     +
>          /* Make a pass over all variable declarations to ensure that
>     arrays with
>           * unspecified sizes have a size specified.  The size is
>     inferred from the
>           * max_array_access field.
>     -- 
>     2.18.0
> 
> 
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list