spirv/nir: tweak nir type when storage class is SpvStorageClassAtomicCounter
authorAlejandro Piñeiro <apinheiro@igalia.com>
Fri, 10 Nov 2017 15:57:40 +0000 (16:57 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Tue, 3 Jul 2018 10:41:46 +0000 (12:41 +0200)
GLSL types differentiates uint from atomic uint. On SPIR-V the type is
uint, and the variable has a specific storage class. So we need to
tweak the type based on the storage class.

Ideally we would like to get the proper type at vtn_handle_type, but
we don't have the storage class at that moment.

We tweak only the nir type, as is the one that really requires it.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/spirv/vtn_variables.c

index c56d74d683bd93487ba9837440f084abb98926b8..a40c30c8a7574259a5ad2df29cf558377c15c6ca 100644 (file)
@@ -1643,7 +1643,17 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
       /* For these, we create the variable normally */
       var->var = rzalloc(b->shader, nir_variable);
       var->var->name = ralloc_strdup(var->var, val->name);
-      var->var->type = var->type->type;
+
+      /* Need to tweak the nir type here as at vtn_handle_type we don't have
+       * the access to storage_class, that is the one that points us that is
+       * an atomic uint.
+       */
+      if (glsl_get_base_type(var->type->type) == GLSL_TYPE_UINT &&
+          storage_class == SpvStorageClassAtomicCounter) {
+         var->var->type = glsl_atomic_uint_type();
+      } else {
+         var->var->type = var->type->type;
+      }
       var->var->data.mode = nir_mode;
       var->var->data.location = -1;
       var->var->interface_type = NULL;