summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/glsl/ast.h9
-rw-r--r--src/compiler/glsl/ast_type.cpp9
-rw-r--r--src/compiler/glsl/glsl_parser.yy24
-rw-r--r--src/compiler/glsl/glsl_parser_extras.cpp20
4 files changed, 40 insertions, 22 deletions
diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h
index 55f9a6c2e5a..e7c3aff6b82 100644
--- a/src/compiler/glsl/ast.h
+++ b/src/compiler/glsl/ast.h
@@ -725,9 +725,6 @@ struct ast_type_qualifier {
*/
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.
*/
@@ -748,6 +745,11 @@ struct ast_type_qualifier {
*/
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,
@@ -1139,6 +1141,7 @@ public:
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;
diff --git a/src/compiler/glsl/ast_type.cpp b/src/compiler/glsl/ast_type.cpp
index 478e4a8147b..48afe09929b 100644
--- a/src/compiler/glsl/ast_type.cpp
+++ b/src/compiler/glsl/ast_type.cpp
@@ -107,6 +107,15 @@ ast_type_qualifier::has_auxiliary_storage() const
|| 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
diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy
index a48dc68b00e..f0f212c1722 100644
--- a/src/compiler/glsl/glsl_parser.yy
+++ b/src/compiler/glsl/glsl_parser.yy
@@ -838,6 +838,14 @@ declaration:
}
| 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;
}
;
@@ -2705,17 +2713,16 @@ interface_block:
{
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;
}
@@ -2723,14 +2730,15 @@ interface_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;
}
;
@@ -2741,9 +2749,9 @@ basic_interface_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);
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
index 85a2e943ff5..78f7fe25965 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -276,12 +276,10 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
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;
@@ -1003,22 +1001,22 @@ _mesa_ast_process_interface_block(YYLTYPE *locp,
*/
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) {