[Mesa-dev] [PATCH 07/20] glsl: clean-up link uniform code

Ilia Mirkin imirkin at alum.mit.edu
Wed Jul 29 07:14:40 PDT 2015


On Wed, Jul 29, 2015 at 9:56 AM, Timothy Arceri <t_arceri at yahoo.com.au> wrote:
> These changes are also needed to allow linking of
> struct and interface arrays of arrays.
> ---
>  src/glsl/link_uniforms.cpp | 16 ++++++----------
>  1 file changed, 6 insertions(+), 10 deletions(-)
>
> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
> index 254086d..42f75e9 100644
> --- a/src/glsl/link_uniforms.cpp
> +++ b/src/glsl/link_uniforms.cpp
> @@ -72,6 +72,7 @@ void
>  program_resource_visitor::process(ir_variable *var)
>  {
>     const glsl_type *t = var->type;
> +   const glsl_type *t_without_array = var->type->without_array();
>     const bool row_major =
>        var->data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR;
>
> @@ -141,12 +142,8 @@ program_resource_visitor::process(ir_variable *var)
>        char *name = ralloc_strdup(NULL, var->name);
>        recursion(var->type, &name, strlen(name), row_major, NULL, false);
>        ralloc_free(name);
> -   } else if (t->is_interface()) {
> -      char *name = ralloc_strdup(NULL, var->type->name);
> -      recursion(var->type, &name, strlen(name), row_major, NULL, false);
> -      ralloc_free(name);
> -   } else if (t->is_array() && t->fields.array->is_interface()) {
> -      char *name = ralloc_strdup(NULL, var->type->fields.array->name);
> +   } else if (t_without_array->is_interface()) {
> +      char *name = ralloc_strdup(NULL, t_without_array->name);
>        recursion(var->type, &name, strlen(name), row_major, NULL, false);
>        ralloc_free(name);
>     } else {
> @@ -217,8 +214,8 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>           (*name)[name_length] = '\0';
>           this->leave_record(t, *name, row_major);
>        }
> -   } else if (t->is_array() && (t->fields.array->is_record()
> -                                || t->fields.array->is_interface())) {
> +   } else if (t->without_array()->is_record()
> +              || t->without_array()->is_interface()) {
>        if (record_type == NULL && t->fields.array->is_record())
>           record_type = t->fields.array;

Presumably here you want

if (record_type == NULL)
  record_type = t->without_array();

Also in e.g. parcel_out_uniform_storage::visit_field, there's code like

      if (type->is_array()) {
         this->uniforms[id].array_elements = type->length;
         base_type = type->fields.array;

and base_type is then used to determine things like if it's a
sampler/etc. Not sure if you fix that up elsewhere.

I highly recommend taking Ian's random_ubo.sh script
(http://cgit.freedesktop.org/~idr/piglit/log/?h=ubo-lolz), and fixing
it up for arrays-of-arrays. It helped me find a bunch of issues in the
fp64 stuff. [Note that the script itself has some fp64-related
issues... I should probably push my fixes somewhere.]

>
> @@ -810,8 +807,7 @@ link_update_uniform_buffer_variables(struct gl_shader *shader)
>
>        if (var->type->is_record()) {
>           sentinel = '.';
> -      } else if (var->type->is_array()
> -                 && var->type->fields.array->is_record()) {
> +      } else if (var->type->without_array()->is_record()) {
>           sentinel = '[';
>        }
>
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list