glsl: Reject illegal qualifiers on atomic counter uniforms.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 11 Apr 2016 05:50:05 +0000 (22:50 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 12 Apr 2016 21:06:42 +0000 (14:06 -0700)
This fixes

dEQP-GLES31.functional.uniform_location.negative.atomic_fragment
dEQP-GLES31.functional.uniform_location.negative.atomic_vertex

Both of which have lines like

layout(location = 3, binding = 0, offset = 0) uniform atomic_uint uni0;

The ARB_explicit_uniform_location spec makes a very tangential mention
regarding atomic counters, but location isn't something that makes sense
with them.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/glsl/ast_to_hir.cpp

index 7c9be8171b6ceed7687d57994c2a29e0dc5ba597..82eb22a82c6bcd0c86cd4d8707cf918b62f32ed9 100644 (file)
@@ -4300,6 +4300,17 @@ ast_declarator_list::hir(exec_list *instructions,
             state->atomic_counter_offsets[qual_binding] = qual_offset;
          }
       }
+
+      ast_type_qualifier allowed_atomic_qual_mask;
+      allowed_atomic_qual_mask.flags.i = 0;
+      allowed_atomic_qual_mask.flags.q.explicit_binding = 1;
+      allowed_atomic_qual_mask.flags.q.explicit_offset = 1;
+      allowed_atomic_qual_mask.flags.q.uniform = 1;
+
+      type->qualifier.validate_flags(&loc, state,
+                                     "invalid layout qualifier for "
+                                     "atomic_uint",
+                                     allowed_atomic_qual_mask);
    }
 
    if (this->declarations.is_empty()) {