[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