mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 12:18:09 +02:00
glsl: rework parsing of blocks
Previously interface blocks were giving the global default flags of uniform blocks. This meant we could not check for invalid qualifiers on interface blocks because they always contained invalid flags. This changes parsing so that interface blocks now get an empty set of layouts. Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
This commit is contained in:
parent
d244986bf2
commit
78d3098c05
2 changed files with 24 additions and 32 deletions
|
|
@ -1061,10 +1061,9 @@ public:
|
|||
|
||||
class ast_interface_block : public ast_node {
|
||||
public:
|
||||
ast_interface_block(ast_type_qualifier layout,
|
||||
const char *instance_name,
|
||||
ast_interface_block(const char *instance_name,
|
||||
ast_array_specifier *array_specifier)
|
||||
: layout(layout), block_name(NULL), instance_name(instance_name),
|
||||
: block_name(NULL), instance_name(instance_name),
|
||||
array_specifier(array_specifier)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@ static bool match_layout_qualifier(const char *s1, const char *s2,
|
|||
%token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER
|
||||
%type <identifier> any_identifier
|
||||
%type <interface_block> instance_name_opt
|
||||
%type <interface_block> buffer_instance_name_opt
|
||||
%token <real> FLOATCONSTANT
|
||||
%token <dreal> DOUBLECONSTANT
|
||||
%token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT
|
||||
|
|
@ -220,6 +219,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2,
|
|||
%type <type_qualifier> subroutine_qualifier
|
||||
%type <subroutine_list> subroutine_type_list
|
||||
%type <type_qualifier> interface_qualifier
|
||||
%type <type_qualifier> uniform_interface_qualifier
|
||||
%type <type_qualifier> buffer_interface_qualifier
|
||||
%type <type_specifier> type_specifier
|
||||
%type <type_specifier> type_specifier_nonarray
|
||||
|
|
@ -2625,10 +2625,23 @@ basic_interface_block:
|
|||
|
||||
$$ = block;
|
||||
}
|
||||
| buffer_interface_qualifier NEW_IDENTIFIER '{' member_list '}' buffer_instance_name_opt ';'
|
||||
| uniform_interface_qualifier NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';'
|
||||
{
|
||||
ast_interface_block *const block = $6;
|
||||
|
||||
block->layout = *state->default_uniform_qualifier;
|
||||
block->block_name = $2;
|
||||
block->declarations.push_degenerate_list_at_head(& $4->link);
|
||||
|
||||
_mesa_ast_process_interface_block(& @1, state, block, $1);
|
||||
|
||||
$$ = block;
|
||||
}
|
||||
| buffer_interface_qualifier NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';'
|
||||
{
|
||||
ast_interface_block *const block = $6;
|
||||
|
||||
block->layout = *state->default_shader_storage_qualifier;
|
||||
block->block_name = $2;
|
||||
block->declarations.push_degenerate_list_at_head(& $4->link);
|
||||
|
||||
|
|
@ -2649,7 +2662,10 @@ interface_qualifier:
|
|||
memset(& $$, 0, sizeof($$));
|
||||
$$.flags.q.out = 1;
|
||||
}
|
||||
| UNIFORM
|
||||
;
|
||||
|
||||
uniform_interface_qualifier:
|
||||
UNIFORM
|
||||
{
|
||||
memset(& $$, 0, sizeof($$));
|
||||
$$.flags.q.uniform = 1;
|
||||
|
|
@ -2667,39 +2683,16 @@ buffer_interface_qualifier:
|
|||
instance_name_opt:
|
||||
/* empty */
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_uniform_qualifier,
|
||||
NULL, NULL);
|
||||
$$ = new(state) ast_interface_block(NULL, NULL);
|
||||
}
|
||||
| NEW_IDENTIFIER
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_uniform_qualifier,
|
||||
$1, NULL);
|
||||
$$ = new(state) ast_interface_block($1, NULL);
|
||||
$$->set_location(@1);
|
||||
}
|
||||
| NEW_IDENTIFIER array_specifier
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_uniform_qualifier,
|
||||
$1, $2);
|
||||
$$->set_location_range(@1, @2);
|
||||
}
|
||||
;
|
||||
|
||||
buffer_instance_name_opt:
|
||||
/* empty */
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_shader_storage_qualifier,
|
||||
NULL, NULL);
|
||||
}
|
||||
| NEW_IDENTIFIER
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_shader_storage_qualifier,
|
||||
$1, NULL);
|
||||
$$->set_location(@1);
|
||||
}
|
||||
| NEW_IDENTIFIER array_specifier
|
||||
{
|
||||
$$ = new(state) ast_interface_block(*state->default_shader_storage_qualifier,
|
||||
$1, $2);
|
||||
$$ = new(state) ast_interface_block($1, $2);
|
||||
$$->set_location_range(@1, @2);
|
||||
}
|
||||
;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue