summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/ast_to_hir.cpp
diff options
context:
space:
mode:
authorTimothy Arceri <timothy.arceri@collabora.com>2015-11-11 06:24:53 +1100
committerTimothy Arceri <timothy.arceri@collabora.com>2016-05-01 23:13:05 +1000
commit94438578d219d0f701a6324cf294ee23d102a978 (patch)
tree85a0dd6953381fa82e8f50d4ccf56a9bd6f750fe /src/compiler/glsl/ast_to_hir.cpp
parent2d9936a6862b371adcb48dbda8d521a76ce18871 (diff)
downloadexternal_mesa3d-94438578d219d0f701a6324cf294ee23d102a978.zip
external_mesa3d-94438578d219d0f701a6324cf294ee23d102a978.tar.gz
external_mesa3d-94438578d219d0f701a6324cf294ee23d102a978.tar.bz2
glsl: validate and store component layout qualifier in GLSL IR
We make use of the existing IR field location_frac used for tracking component locations. Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com> Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/compiler/glsl/ast_to_hir.cpp')
-rw-r--r--src/compiler/glsl/ast_to_hir.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
index dd8e4e0..c5cd48f 100644
--- a/src/compiler/glsl/ast_to_hir.cpp
+++ b/src/compiler/glsl/ast_to_hir.cpp
@@ -3346,10 +3346,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) {
@@ -7007,6 +7039,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) ||