glsl: fix stream qualifier for blocks with an instance name
This also removes the validation from the parser as it is not required and once arb_enhanced_layouts comes along we wont be able to do validation on the stream qualifier in the parser anyway as it adds constant expression support to the stream qualifier. Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Cc: 11.0 <mesa-stable@lists.freedesktop.org>
This commit is contained in:
+15
-11
@@ -6293,6 +6293,18 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
|
||||
state->struct_specifier_depth--;
|
||||
|
||||
for (unsigned i = 0; i < num_variables; i++) {
|
||||
if (fields[i].stream != -1 &&
|
||||
(unsigned) fields[i].stream != this->layout.stream) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"stream layout qualifier on "
|
||||
"interface block member `%s' does not match "
|
||||
"the interface block (%d vs %d)",
|
||||
fields[i].name, fields[i].stream,
|
||||
this->layout.stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (!redeclaring_per_vertex) {
|
||||
validate_identifier(this->block_name, loc, state);
|
||||
|
||||
@@ -6633,6 +6645,8 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
var->data.explicit_binding = this->layout.flags.q.explicit_binding;
|
||||
var->data.binding = this->layout.binding;
|
||||
|
||||
var->data.stream = this->layout.stream;
|
||||
|
||||
state->symbols->add_variable(var);
|
||||
instructions->push_tail(var);
|
||||
}
|
||||
@@ -6651,6 +6665,7 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
var->data.centroid = fields[i].centroid;
|
||||
var->data.sample = fields[i].sample;
|
||||
var->data.patch = fields[i].patch;
|
||||
var->data.stream = this->layout.stream;
|
||||
var->init_interface_type(block_type);
|
||||
|
||||
if (var_mode == ir_var_shader_in || var_mode == ir_var_uniform)
|
||||
@@ -6663,17 +6678,6 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
var->data.matrix_layout = fields[i].matrix_layout;
|
||||
}
|
||||
|
||||
if (fields[i].stream != -1 &&
|
||||
((unsigned)fields[i].stream) != this->layout.stream) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"stream layout qualifier on "
|
||||
"interface block member `%s' does not match "
|
||||
"the interface block (%d vs %d)",
|
||||
var->name, fields[i].stream, this->layout.stream);
|
||||
}
|
||||
|
||||
var->data.stream = this->layout.stream;
|
||||
|
||||
if (var->data.mode == ir_var_shader_storage) {
|
||||
var->data.image_read_only = fields[i].image_read_only;
|
||||
var->data.image_write_only = fields[i].image_write_only;
|
||||
|
||||
@@ -2609,17 +2609,6 @@ interface_block:
|
||||
|
||||
block->layout.is_default_qualifier = false;
|
||||
|
||||
foreach_list_typed (ast_declarator_list, member, link, &block->declarations) {
|
||||
ast_type_qualifier& qualifier = member->type->qualifier;
|
||||
if (qualifier.flags.q.stream && qualifier.stream != block->layout.stream) {
|
||||
_mesa_glsl_error(& @1, state,
|
||||
"stream layout qualifier on "
|
||||
"interface block member does not match "
|
||||
"the interface block (%d vs %d)",
|
||||
qualifier.stream, block->layout.stream);
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
$$ = block;
|
||||
}
|
||||
| memory_qualifier interface_block
|
||||
|
||||
@@ -186,6 +186,7 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions)
|
||||
new_var->data.centroid = iface_t->fields.structure[i].centroid;
|
||||
new_var->data.sample = iface_t->fields.structure[i].sample;
|
||||
new_var->data.patch = iface_t->fields.structure[i].patch;
|
||||
new_var->data.stream = var->data.stream;
|
||||
|
||||
new_var->init_interface_type(iface_t);
|
||||
hash_table_insert(interface_namespace, new_var,
|
||||
|
||||
Reference in New Issue
Block a user