*/
glsl_base_type image_base_type;
- /** Flag to know if this represents a default value for a qualifier */
- bool is_default_qualifier;
-
/**
* Return true if and only if an interpolation qualifier is present.
*/
*/
bool has_auxiliary_storage() const;
+ /**
+ * Return true if and only if a memory qualifier is present.
+ */
+ bool has_memory() const;
+
bool merge_qualifier(YYLTYPE *loc,
_mesa_glsl_parse_state *state,
const ast_type_qualifier &q,
virtual ir_rvalue *hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+ ast_type_qualifier default_layout;
ast_type_qualifier layout;
const char *block_name;
|| this->flags.q.patch;
}
+bool ast_type_qualifier::has_memory() const
+{
+ return this->flags.q.coherent
+ || this->flags.q._volatile
+ || this->flags.q.restrict_flag
+ || this->flags.q.read_only
+ || this->flags.q.write_only;
+}
+
/**
* This function merges both duplicate identifies within a single layout and
* multiple layout qualifiers on a single variable declaration. The
}
| interface_block
{
+ ast_interface_block *block = (ast_interface_block *) $1;
+ if (block->layout.has_layout() || block->layout.has_memory()) {
+ if (!block->default_layout.merge_qualifier(& @1, state, block->layout, false)) {
+ YYERROR;
+ }
+ }
+ block->layout = block->default_layout;
+
$$ = $1;
}
;
{
ast_interface_block *block = (ast_interface_block *) $2;
- if (!state->has_420pack_or_es31() && block->layout.has_layout() &&
- !block->layout.is_default_qualifier) {
+ if (!state->has_420pack_or_es31() && block->layout.has_layout()) {
_mesa_glsl_error(&@1, state, "duplicate layout(...) qualifiers");
YYERROR;
}
- if (!block->layout.merge_qualifier(& @1, state, $1, false)) {
+ if (!$1.merge_qualifier(& @1, state, block->layout, false)) {
YYERROR;
}
- block->layout.is_default_qualifier = false;
+ block->layout = $1;
$$ = block;
}
{
ast_interface_block *block = (ast_interface_block *)$2;
- if (!block->layout.flags.q.buffer) {
+ if (!block->default_layout.flags.q.buffer) {
_mesa_glsl_error(& @1, state,
"memory qualifiers can only be used in the "
"declaration of shader storage blocks");
}
- if (!block->layout.merge_qualifier(& @1, state, $1, false)) {
+ if (!$1.merge_qualifier(& @1, state, block->layout, false)) {
YYERROR;
}
+ block->layout = $1;
$$ = block;
}
;
ast_interface_block *const block = $6;
if ($1.flags.q.uniform) {
- block->layout = *state->default_uniform_qualifier;
+ block->default_layout = *state->default_uniform_qualifier;
} else if ($1.flags.q.buffer) {
- block->layout = *state->default_shader_storage_qualifier;
+ block->default_layout = *state->default_shader_storage_qualifier;
}
block->block_name = $2;
block->declarations.push_degenerate_list_at_head(& $4->link);
this->default_uniform_qualifier = new(this) ast_type_qualifier();
this->default_uniform_qualifier->flags.q.shared = 1;
this->default_uniform_qualifier->flags.q.column_major = 1;
- this->default_uniform_qualifier->is_default_qualifier = true;
this->default_shader_storage_qualifier = new(this) ast_type_qualifier();
this->default_shader_storage_qualifier->flags.q.shared = 1;
this->default_shader_storage_qualifier->flags.q.column_major = 1;
- this->default_shader_storage_qualifier->is_default_qualifier = true;
this->fs_uses_gl_fragcoord = false;
this->fs_redeclares_gl_fragcoord = false;
*/
uint64_t block_interface_qualifier = q.flags.i;
- block->layout.flags.i |= block_interface_qualifier;
+ block->default_layout.flags.i |= block_interface_qualifier;
if (state->stage == MESA_SHADER_GEOMETRY &&
state->has_explicit_attrib_stream() &&
- block->layout.flags.q.out) {
+ block->default_layout.flags.q.out) {
/* Assign global layout's stream value. */
- block->layout.flags.q.stream = 1;
- block->layout.flags.q.explicit_stream = 0;
- block->layout.stream = state->out_qualifier->stream;
+ block->default_layout.flags.q.stream = 1;
+ block->default_layout.flags.q.explicit_stream = 0;
+ block->default_layout.stream = state->out_qualifier->stream;
}
- if (state->has_enhanced_layouts() && block->layout.flags.q.out) {
+ if (state->has_enhanced_layouts() && block->default_layout.flags.q.out) {
/* Assign global layout's xfb_buffer value. */
- block->layout.flags.q.xfb_buffer = 1;
- block->layout.flags.q.explicit_xfb_buffer = 0;
- block->layout.xfb_buffer = state->out_qualifier->xfb_buffer;
+ block->default_layout.flags.q.xfb_buffer = 1;
+ block->default_layout.flags.q.explicit_xfb_buffer = 0;
+ block->default_layout.xfb_buffer = state->out_qualifier->xfb_buffer;
}
foreach_list_typed (ast_declarator_list, member, link, &block->declarations) {