[Mesa-dev] [RFC PATCH 20/26] glsl: use fully_specified_type rule with ast_function_expression

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Apr 12 10:51:45 UTC 2017



On 04/12/2017 03:12 AM, Timothy Arceri wrote:
> On 12/04/17 02:48, Samuel Pitoiset wrote:
>> Only ast_fully_specified_type is able to know if the underlying
>> type is bindless or not. Because type_specifier is a subrule of
>> fully_specified_type this shouldn't break anything.
>>
>> This will help for handling explicit conversions like
>> 'sampler2D tex = sampler2D(pair);' where sampler2D is a constructor.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>  src/compiler/glsl/ast.h            | 2 +-
>>  src/compiler/glsl/ast_function.cpp | 6 +++---
>>  src/compiler/glsl/glsl_parser.yy   | 2 +-
>>  3 files changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h
>> index 2a2dd4bcd9..4fb8b87286 100644
>> --- a/src/compiler/glsl/ast.h
>> +++ b/src/compiler/glsl/ast.h
>> @@ -305,7 +305,7 @@ public:
>>        /* empty */
>>     }
>>
>> -   ast_function_expression(class ast_type_specifier *type)
>> +   ast_function_expression(class ast_fully_specified_type *type)
>>        : ast_expression(ast_function_call, (ast_expression *) type,
>>                 NULL, NULL),
>>      cons(true)
>> diff --git a/src/compiler/glsl/ast_function.cpp 
>> b/src/compiler/glsl/ast_function.cpp
>> index 0665e0c393..95ec2db173 100644
>> --- a/src/compiler/glsl/ast_function.cpp
>> +++ b/src/compiler/glsl/ast_function.cpp
>> @@ -1942,8 +1942,8 @@ ast_function_expression::hir(exec_list 
>> *instructions,
>>      *
>>      */
>>     if (is_constructor()) {
>> -      const ast_type_specifier *type =
>> -         (ast_type_specifier *) subexpressions[0];
>> +      const ast_fully_specified_type *type =
>> +         (ast_fully_specified_type *) subexpressions[0];
>>        YYLTYPE loc = type->get_location();
>>        const char *name;
>>
>> @@ -1955,7 +1955,7 @@ ast_function_expression::hir(exec_list 
>> *instructions,
>>        if (constructor_type == NULL) {
>>           _mesa_glsl_error(& loc, state, "unknown type `%s' (structure 
>> name "
>>                            "may be shadowed by a variable with the 
>> same name)",
>> -                          type->type_name);
>> +                          type->specifier->type_name);
>>           return ir_rvalue::error_value(ctx);
>>        }
>>
>> diff --git a/src/compiler/glsl/glsl_parser.yy 
>> b/src/compiler/glsl/glsl_parser.yy
>> index 05171e53a3..a35a649879 100644
>> --- a/src/compiler/glsl/glsl_parser.yy
>> +++ b/src/compiler/glsl/glsl_parser.yy
>> @@ -573,7 +573,7 @@ function_call_header:
>>     ;
>>
>>  function_identifier:
>> -   type_specifier
>> +   fully_specified_type
> 
> I'm not so sure about this. Wouldn't this allow you to do things like:
> 
> sampler2D tex = precise sampler2D(pair)
> 
> Without triggering an error in the parser?

The compile throws a compile-time error in this situation.

Failed to compile vertex shader 
/home/hakzsam/programming/piglit/tests/spec/arb_bindless_texture/compiler/samplers/explicit-conversions.vert: 
0:14(26): error: syntax error, unexpected SAMPLER2D, expecting ',' or ';'

Shader source:
// [config]
// expect_result: pass
// glsl_version: 3.30
// require_extensions: GL_ARB_bindless_texture
// [end config]

#version 330
#extension GL_ARB_bindless_texture: require

void main()
{
	uvec2 pair = uvec2(0, 0);

	sampler2D tex = precise sampler2D(pair);
}

PIGLIT: {"result": "fail" }

> 
> 
>>     {
>>        void *ctx = state->linalloc;
>>        $$ = new(ctx) ast_function_expression($1);
>>


More information about the mesa-dev mailing list