nir/lower-atomics-to-ssbo: remove atomic_uint arrays too
authorRob Clark <robdclark@gmail.com>
Mon, 15 May 2017 19:53:12 +0000 (15:53 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 23 May 2017 16:26:34 +0000 (12:26 -0400)
Maybe there is a better way to do this.  But by the time we get to
assigning uniform locs, we want the atomic_uint's to all be gone,
otherwise we assert in st_glsl_attrib_type_size().

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/compiler/nir/nir_lower_atomics_to_ssbo.c

index 23583fde373a7fb8618f5e4a0a67d4107c6426bb..fd6eefb1fd01c3c7d63320c5264ed35539963a37 100644 (file)
@@ -163,6 +163,14 @@ lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
    return true;
 }
 
+static bool
+is_atomic_uint(const struct glsl_type *type)
+{
+   if (glsl_get_base_type(type) == GLSL_TYPE_ARRAY)
+      return is_atomic_uint(glsl_get_array_element(type));
+   return glsl_get_base_type(type) == GLSL_TYPE_ATOMIC_UINT;
+}
+
 bool
 nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset)
 {
@@ -189,7 +197,7 @@ nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset)
       /* replace atomic_uint uniforms with ssbo's: */
       unsigned replaced = 0;
       nir_foreach_variable_safe(var, &shader->uniforms) {
-         if (glsl_get_base_type(var->type) == GLSL_TYPE_ATOMIC_UINT) {
+         if (is_atomic_uint(var->type)) {
             exec_node_remove(&var->node);
 
             if (replaced & (1 << var->data.binding))