[Mesa-dev] [PATCH 2/2] glsl: add fragdata arrays to program resource list

Lofstedt, Marta marta.lofstedt at intel.com
Tue Oct 27 06:21:08 PDT 2015


Reviewed-by: Marta Lofstedt <marta.lofstedt at intel.com>

> -----Original Message-----
> From: Palli, Tapani
> Sent: Tuesday, October 27, 2015 12:19 PM
> To: mesa-dev at lists.freedesktop.org
> Cc: Lofstedt, Marta; Palli, Tapani
> Subject: [PATCH 2/2] glsl: add fragdata arrays to program resource list
> 
> This makes sure that user is still able to query properties about variables that
> have gotten removed by opt_dead_builtin_varyings pass.
> 
> Fixes following OpenGL ES 3.1 test:
>    ES31-CTS.program_interface_query.output-layout
> 
> No Piglit regressions.
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
>  src/glsl/linker.cpp | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index cfd8f81..e9660fc
> 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -3386,6 +3386,12 @@ add_interface_variables(struct
> gl_shader_program *shProg,
>        if (strncmp(var->name, "packed:", 7) == 0)
>           continue;
> 
> +      /* Skip fragdata arrays, these are handled separately
> +       * by add_fragdata_arrays.
> +       */
> +      if (strncmp(var->name, "gl_out_FragData", 15) == 0)
> +         continue;
> +
>        if (!add_program_resource(shProg, programInterface, var,
>                                  build_stageref(shProg, var->name,
>                                                 var->data.mode) | mask)) @@ -3425,6 +3431,26 @@
> add_packed_varyings(struct gl_shader_program *shProg, int stage)
>     return true;
>  }
> 
> +static bool
> +add_fragdata_arrays(struct gl_shader_program *shProg) {
> +   struct gl_shader *sh = shProg-
> >_LinkedShaders[MESA_SHADER_FRAGMENT];
> +
> +   if (!sh || !sh->fragdata_arrays)
> +      return true;
> +
> +   foreach_in_list(ir_instruction, node, sh->fragdata_arrays) {
> +      ir_variable *var = node->as_variable();
> +      if (var) {
> +         assert(var->data.mode == ir_var_shader_out);
> +         if (!add_program_resource(shProg, GL_PROGRAM_OUTPUT, var,
> +                                   (1 << MESA_SHADER_FRAGMENT)))
> +            return false;
> +      }
> +   }
> +   return true;
> +}
> +
>  static char*
>  get_top_level_name(const char *name)
>  {
> @@ -3701,6 +3727,9 @@ build_program_resource_list(struct
> gl_shader_program *shProg)
>           return;
>     }
> 
> +   if (!add_fragdata_arrays(shProg))
> +      return;
> +
>     /* Add inputs and outputs to the resource list. */
>     if (!add_interface_variables(shProg, shProg-
> >_LinkedShaders[input_stage]->ir,
>                                  GL_PROGRAM_INPUT))
> --
> 2.4.3



More information about the mesa-dev mailing list