[Mesa-dev] [PATCH 2/6] glsl: Extract explicit location code from apply_type_qualifier_to_variable
Paul Berry
stereotype441 at gmail.com
Tue Oct 29 18:43:05 CET 2013
On 27 October 2013 14:59, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Future patches will add some extra code to this path, and some of that
> code will want to exit from the explicit location code early.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> src/glsl/ast_to_hir.cpp | 159
> +++++++++++++++++++++++++-----------------------
> 1 file changed, 84 insertions(+), 75 deletions(-)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 561d942..05539b8 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -2043,6 +2043,89 @@ interpret_interpolation_qualifier(const struct
> ast_type_qualifier *qual,
>
>
> static void
> +validate_explicit_location(const struct ast_type_qualifier *qual,
> + ir_variable *var,
> + struct _mesa_glsl_parse_state *state,
> + YYLTYPE *loc)
> +{
> + const bool global_scope = (state->current_function == NULL);
> + bool fail = false;
> + const char *string = "";
> +
> + /* In the vertex shader only shader inputs can be given explicit
> + * locations.
> + *
> + * In the fragment shader only shader outputs can be given explicit
> + * locations.
> + */
> + switch (state->target) {
> + case vertex_shader:
> + if (!global_scope || (var->mode != ir_var_shader_in)) {
> + fail = true;
> + string = "input";
> + }
> + break;
> +
> + case geometry_shader:
> + _mesa_glsl_error(loc, state,
> + "geometry shader variables cannot be given "
> + "explicit locations");
> + break;
>
While you're at it (either in this patch or a separate patch) you might
want to change this "break;" to a "return;". That way we won't end up
trying to apply a bogus geometry shader location qualifier (which could
might cause cascading errors).
Either way, though, this patch is:
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
> +
> + case fragment_shader:
> + if (!global_scope || (var->mode != ir_var_shader_out)) {
> + fail = true;
> + string = "output";
> + }
> + break;
> + };
> +
> + if (fail) {
> + _mesa_glsl_error(loc, state,
> + "only %s shader %s variables can be given an "
> + "explicit location",
> + _mesa_glsl_shader_target_name(state->target),
> + string);
> + } else {
> + var->explicit_location = true;
> +
> + /* This bit of silliness is needed because invalid explicit
> locations
> + * are supposed to be flagged during linking. Small negative values
> + * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias
> + * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 =
> VERT_ATTRIB_POS).
> + * The linker needs to be able to differentiate these cases. This
> + * ensures that negative values stay negative.
> + */
> + if (qual->location >= 0) {
> + var->location = (state->target == vertex_shader)
> + ? (qual->location + VERT_ATTRIB_GENERIC0)
> + : (qual->location + FRAG_RESULT_DATA0);
> + } else {
> + var->location = qual->location;
> + }
> +
> + if (qual->flags.q.explicit_index) {
> + /* From the GLSL 4.30 specification, section 4.4.2 (Output
> + * Layout Qualifiers):
> + *
> + * "It is also a compile-time error if a fragment shader
> + * sets a layout index to less than 0 or greater than 1."
> + *
> + * Older specifications don't mandate a behavior; we take
> + * this as a clarification and always generate the error.
> + */
> + if (qual->index < 0 || qual->index > 1) {
> + _mesa_glsl_error(loc, state,
> + "explicit index may only be 0 or 1");
> + } else {
> + var->explicit_index = true;
> + var->index = qual->index;
> + }
> + }
> + }
> +}
> +
> +static void
> apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
> ir_variable *var,
> struct _mesa_glsl_parse_state *state,
> @@ -2194,81 +2277,7 @@ apply_type_qualifier_to_variable(const struct
> ast_type_qualifier *qual,
> }
>
> if (qual->flags.q.explicit_location) {
> - const bool global_scope = (state->current_function == NULL);
> - bool fail = false;
> - const char *string = "";
> -
> - /* In the vertex shader only shader inputs can be given explicit
> - * locations.
> - *
> - * In the fragment shader only shader outputs can be given explicit
> - * locations.
> - */
> - switch (state->target) {
> - case vertex_shader:
> - if (!global_scope || (var->mode != ir_var_shader_in)) {
> - fail = true;
> - string = "input";
> - }
> - break;
> -
> - case geometry_shader:
> - _mesa_glsl_error(loc, state,
> - "geometry shader variables cannot be given "
> - "explicit locations");
> - break;
> -
> - case fragment_shader:
> - if (!global_scope || (var->mode != ir_var_shader_out)) {
> - fail = true;
> - string = "output";
> - }
> - break;
> - };
> -
> - if (fail) {
> - _mesa_glsl_error(loc, state,
> - "only %s shader %s variables can be given an "
> - "explicit location",
> - _mesa_glsl_shader_target_name(state->target),
> - string);
> - } else {
> - var->explicit_location = true;
> -
> - /* This bit of silliness is needed because invalid explicit
> locations
> - * are supposed to be flagged during linking. Small negative
> values
> - * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias
> - * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 =
> VERT_ATTRIB_POS).
> - * The linker needs to be able to differentiate these cases. This
> - * ensures that negative values stay negative.
> - */
> - if (qual->location >= 0) {
> - var->location = (state->target == vertex_shader)
> - ? (qual->location + VERT_ATTRIB_GENERIC0)
> - : (qual->location + FRAG_RESULT_DATA0);
> - } else {
> - var->location = qual->location;
> - }
> -
> - if (qual->flags.q.explicit_index) {
> - /* From the GLSL 4.30 specification, section 4.4.2 (Output
> - * Layout Qualifiers):
> - *
> - * "It is also a compile-time error if a fragment shader
> - * sets a layout index to less than 0 or greater than 1."
> - *
> - * Older specifications don't mandate a behavior; we take
> - * this as a clarification and always generate the error.
> - */
> - if (qual->index < 0 || qual->index > 1) {
> - _mesa_glsl_error(loc, state,
> - "explicit index may only be 0 or 1");
> - } else {
> - var->explicit_index = true;
> - var->index = qual->index;
> - }
> - }
> - }
> + validate_explicit_location(qual, var, state, loc);
> } else if (qual->flags.q.explicit_index) {
> _mesa_glsl_error(loc, state,
> "explicit index requires explicit location");
> --
> 1.8.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131029/70e483a9/attachment.html>
More information about the mesa-dev
mailing list