[Mesa-dev] [PATCH] glsl: remove excess location qualifier validation
Timothy Arceri
timothy.arceri at collabora.com
Wed Oct 21 23:41:56 PDT 2015
On Thu, 2015-10-22 at 08:55 +0300, Tapani Pälli wrote:
> On 10/22/2015 08:29 AM, Timothy Arceri wrote:
> > Location has never been able to be a negative value because it has
> > always been validated in the parser.
> >
> > Also the linker doesn't check for negatives like the comment
> > claims.
>
> Neither does the parser, if one utilizes negative explicit location,
> parser says:
>
> error: syntax error, unexpected '-', expecting INTCONSTANT or
> UINTCONSTANT
>
> I'm not sure if this is quite OK, it should rather accept the
> negative
> value and the fail here in this check you are about to remove?
Yes I did noticed this. However even if we changed it to accept a
negative value the is another check in the parser that would catch this
before the checks I'm removing here.
if ($3 >= 0) {
$$.location = $3;
} else {
_mesa_glsl_error(& @3, state, "invalid location %d specified", $3);
YYERROR;
}
I'm also working on ARB_enhanced_layouts which will allow negative
values to get passed the parser and will be moving the check out of the
parser and into the ast.
This patch is a clean-up before doing that, as the attributes code
doesn't do the validation at all and the one for uniforms should be
shared with the attibutes code.
>
> > ---
> >
> > No piglit regressions and an extra negative test sent for
> > ARB_explicit_uniform_location [1]
> >
> > [1] http://patchwork.freedesktop.org/patch/62573/
> >
> > src/glsl/ast_to_hir.cpp | 70 ++++++++++++++++--------------------
> > -------------
> > 1 file changed, 22 insertions(+), 48 deletions(-)
> >
> > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> > index 8549d55..0306530 100644
> > --- a/src/glsl/ast_to_hir.cpp
> > +++ b/src/glsl/ast_to_hir.cpp
> > @@ -2422,21 +2422,6 @@ validate_explicit_location(const struct
> > ast_type_qualifier *qual,
> > const struct gl_context *const ctx = state->ctx;
> > unsigned max_loc = qual->location + var->type
> > ->uniform_locations() - 1;
> >
> > - /* ARB_explicit_uniform_location specification states:
> > - *
> > - * "The explicitly defined locations and the generated
> > locations
> > - * must be in the range of 0 to MAX_UNIFORM_LOCATIONS
> > minus one."
> > - *
> > - * "Valid locations for default-block uniform variable
> > locations
> > - * are in the range of 0 to the implementation-defined
> > maximum
> > - * number of uniform locations."
> > - */
> > - if (qual->location < 0) {
> > - _mesa_glsl_error(loc, state,
> > - "explicit location < 0 for uniform %s",
> > var->name);
> > - return;
> > - }
> > -
> > if (max_loc >= ctx
> > ->Const.MaxUserAssignableUniformLocations) {
> > _mesa_glsl_error(loc, state, "location(s) consumed by
> > uniform %s "
> > ">= MAX_UNIFORM_LOCATIONS (%u)", var
> > ->name,
> > @@ -2527,41 +2512,30 @@ validate_explicit_location(const struct
> > ast_type_qualifier *qual,
> > } else {
> > var->data.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) {
> > - switch (state->stage) {
> > - case MESA_SHADER_VERTEX:
> > - var->data.location = (var->data.mode ==
> > ir_var_shader_in)
> > - ? (qual->location + VERT_ATTRIB_GENERIC0)
> > - : (qual->location + VARYING_SLOT_VAR0);
> > - break;
> > + switch (state->stage) {
> > + case MESA_SHADER_VERTEX:
> > + var->data.location = (var->data.mode == ir_var_shader_in)
> > + ? (qual->location + VERT_ATTRIB_GENERIC0)
> > + : (qual->location + VARYING_SLOT_VAR0);
> > + break;
> >
> > - case MESA_SHADER_TESS_CTRL:
> > - case MESA_SHADER_TESS_EVAL:
> > - case MESA_SHADER_GEOMETRY:
> > - if (var->data.patch)
> > - var->data.location = qual->location +
> > VARYING_SLOT_PATCH0;
> > - else
> > - var->data.location = qual->location +
> > VARYING_SLOT_VAR0;
> > - break;
> > + case MESA_SHADER_TESS_CTRL:
> > + case MESA_SHADER_TESS_EVAL:
> > + case MESA_SHADER_GEOMETRY:
> > + if (var->data.patch)
> > + var->data.location = qual->location +
> > VARYING_SLOT_PATCH0;
> > + else
> > + var->data.location = qual->location +
> > VARYING_SLOT_VAR0;
> > + break;
> >
> > - case MESA_SHADER_FRAGMENT:
> > - var->data.location = (var->data.mode ==
> > ir_var_shader_out)
> > - ? (qual->location + FRAG_RESULT_DATA0)
> > - : (qual->location + VARYING_SLOT_VAR0);
> > - break;
> > - case MESA_SHADER_COMPUTE:
> > - assert(!"Unexpected shader type");
> > - break;
> > - }
> > - } else {
> > - var->data.location = qual->location;
> > + case MESA_SHADER_FRAGMENT:
> > + var->data.location = (var->data.mode ==
> > ir_var_shader_out)
> > + ? (qual->location + FRAG_RESULT_DATA0)
> > + : (qual->location + VARYING_SLOT_VAR0);
> > + break;
> > + case MESA_SHADER_COMPUTE:
> > + assert(!"Unexpected shader type");
> > + break;
> > }
> >
> > if (qual->flags.q.explicit_index) {
>
More information about the mesa-dev
mailing list