[Mesa-dev] [PATCH] glsl: remove excess location qualifier validation

Tapani Pälli tapani.palli at intel.com
Wed Oct 21 23:56:12 PDT 2015


On 10/22/2015 09:41 AM, Timothy Arceri wrote:
> 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;
> }

OK, then removing the check for uniform loc should be fine. For the 
attributes change, I'm not sure yet, I believe the reason for the 
'silliness' (mentioned in the commit) is that all the built-in 
attributes have negative locations, we need to be careful to continue 
dealing gracefully with that.

> 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