summaryrefslogtreecommitdiffstats
path: root/src/compiler/spirv
diff options
context:
space:
mode:
authorAlejandro Piñeiro <[email protected]>2017-11-10 16:57:40 +0100
committerAlejandro Piñeiro <[email protected]>2018-07-03 12:41:46 +0200
commit480d2c56b34667d461962f34d5ace1b279516281 (patch)
tree22657cc72f45e4ebf207530b1009841c8b997df7 /src/compiler/spirv
parent88d3325a445d85d30a45d1f4c4b83c232f2660c4 (diff)
spirv/nir: tweak nir type when storage class is SpvStorageClassAtomicCounter
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 <[email protected]>
Diffstat (limited to 'src/compiler/spirv')
-rw-r--r--src/compiler/spirv/vtn_variables.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index c56d74d683b..a40c30c8a75 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -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;