[Mesa-dev] [PATCH 09/28] glsl: validate and store component layout qualifier in GLSL IR

Anuj Phogat anuj.phogat at gmail.com
Wed Jan 6 12:00:22 PST 2016


On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> We make use of the existing IR field location_frac used for tracking
> component locations.
> ---
>  src/glsl/ast_to_hir.cpp | 38 ++++++++++++++++++++++++++++++++++++++
>  src/glsl/ir.h           |  5 +++++
>  2 files changed, 43 insertions(+)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 1091c02..bb35d72 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3075,10 +3075,42 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual,
>
>     if (qual->flags.q.explicit_location) {
>        apply_explicit_location(qual, var, state, loc);
> +
> +      if (qual->flags.q.explicit_component) {
> +         unsigned qual_component;
> +         if (process_qualifier_constant(state, loc, "component",
> +                                        qual->component, &qual_component)) {
> +            const glsl_type *type = var->type->without_array();
> +            unsigned components = type->component_slots();
> +
> +            if (type->is_matrix() || type->is_record()) {
> +               _mesa_glsl_error(loc, state, "component layout qualifier "
> +                                "cannot be applied to a matrix, a structure, "
> +                                "a block, or an array containing any of "
> +                                "these.");
> +            } else if (qual_component != 0 &&
> +                (qual_component + components - 1) > 3) {
> +               _mesa_glsl_error(loc, state, "component overflow (%u > 3)",
> +                                (qual_component + components - 1));
> +            } else if (qual_component == 1 && type->is_double()) {
> +               /* We don't bother checking for 3 as it should be caught by the
> +                * overflow check above.
> +                */
> +               _mesa_glsl_error(loc, state, "doubles cannot begin at "
> +                                "component 1 or 3");
> +            } else {
> +               var->data.explicit_component = true;
> +               var->data.location_frac = qual_component;
> +            }
> +         }
> +      }
>     } else if (qual->flags.q.explicit_index) {
>        if (!qual->flags.q.subroutine_def)
>           _mesa_glsl_error(loc, state,
>                            "explicit index requires explicit location");
> +   } else if (qual->flags.q.explicit_component) {
> +      _mesa_glsl_error(loc, state,
> +                       "explicit component requires explicit location");
>     }
>
>     if (qual->flags.q.explicit_binding) {
> @@ -6660,6 +6692,12 @@ ast_interface_block::hir(exec_list *instructions,
>                         "Interface block sets both readonly and writeonly");
>     }
>
> +   if (this->layout.flags.q.explicit_component) {
> +      _mesa_glsl_error(&loc, state, "component layout qualifier cannot be "
> +                       "applied to a matrix, a structure, a block, or an "
> +                       "array containing any of these.");
> +   }
> +
>     unsigned qual_stream;
>     if (!process_qualifier_constant(state, &loc, "stream", this->layout.stream,
>                                     &qual_stream) ||
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index 159f94d..d604a1f 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -714,6 +714,11 @@ public:
>        unsigned explicit_binding:1;
>
>        /**
> +       * Was an initial component explicitly set in the shader?
> +       */
> +      unsigned explicit_component:1;
> +
> +      /**
>         * Does this variable have an initializer?
>         *
>         * This is used by the linker to cross-validiate initializers of global
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list