On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri <timothy.arc...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Reviewed-by: Anuj Phogat <anuj.pho...@gmail.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev