mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 15:10:10 +01:00
glsl: ignore all but the rightmost layout-qualifier-name
When a layout contains a duplicated layout-qualifier-name in a single
declaration, only the last occurrence should be taken into account.
From page 59 (page 65 of the PDF) of the GLSL 4.40 spec:
" More than one layout qualifier may appear in a single
declaration. Additionally, the same layout-qualifier-name can
occur multiple times within a layout qualifier or across multiple
layout qualifiers in the same declaration. When the same
layout-qualifier-name occurs multiple times, in a single
declaration, the last occurrence overrides the former
occurrence(s)."
Consider this example:
" #version 150
#extension GL_ARB_enhanced_layouts: enable
layout(max_vertices=2, max_vertices=3) out;
layout(max_vertices=3) out;"
Although different values for "max_vertices" results in a compilation
error. The above code is valid because max_vertices=2 is ignored.
When merging qualifiers in an ast_type_qualifier, we now simply ignore
new appearances of a same layout-qualifier-name if the
"is_single_layout_merge" parameter is true, this works because the GLSL
parser processes qualifiers from right to left.
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Signed-off-by: Andres Gomez <agomez@igalia.com>
This commit is contained in:
parent
b3fca51617
commit
9f13d0c64b
1 changed files with 6 additions and 5 deletions
|
|
@ -196,7 +196,7 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
|
|||
}
|
||||
|
||||
if (q.flags.q.max_vertices) {
|
||||
if (this->max_vertices) {
|
||||
if (this->max_vertices && !is_single_layout_merge) {
|
||||
this->max_vertices->merge_qualifier(q.max_vertices);
|
||||
} else {
|
||||
this->max_vertices = q.max_vertices;
|
||||
|
|
@ -213,7 +213,7 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
|
|||
}
|
||||
|
||||
if (q.flags.q.invocations) {
|
||||
if (this->invocations) {
|
||||
if (this->invocations && !is_single_layout_merge) {
|
||||
this->invocations->merge_qualifier(q.invocations);
|
||||
} else {
|
||||
this->invocations = q.invocations;
|
||||
|
|
@ -262,7 +262,8 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
|
|||
unsigned buff_idx;
|
||||
if (process_qualifier_constant(state, loc, "xfb_buffer",
|
||||
this->xfb_buffer, &buff_idx)) {
|
||||
if (state->out_qualifier->out_xfb_stride[buff_idx]) {
|
||||
if (state->out_qualifier->out_xfb_stride[buff_idx]
|
||||
&& !is_single_layout_merge) {
|
||||
state->out_qualifier->out_xfb_stride[buff_idx]->merge_qualifier(
|
||||
new(state->linalloc) ast_layout_expression(*loc, this->xfb_stride));
|
||||
} else {
|
||||
|
|
@ -274,7 +275,7 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
|
|||
}
|
||||
|
||||
if (q.flags.q.vertices) {
|
||||
if (this->vertices) {
|
||||
if (this->vertices && !is_single_layout_merge) {
|
||||
this->vertices->merge_qualifier(q.vertices);
|
||||
} else {
|
||||
this->vertices = q.vertices;
|
||||
|
|
@ -312,7 +313,7 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
|
|||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (q.flags.q.local_size & (1 << i)) {
|
||||
if (this->local_size[i]) {
|
||||
if (this->local_size[i] && !is_single_layout_merge) {
|
||||
this->local_size[i]->merge_qualifier(q.local_size[i]);
|
||||
} else {
|
||||
this->local_size[i] = q.local_size[i];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue