summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <[email protected]>2019-05-08 13:16:13 -0700
committerCaio Marcelo de Oliveira Filho <[email protected]>2019-05-20 10:53:38 -0700
commit83550b7dc437f496eea090b938d3ba599c0db016 (patch)
tree00b5e7cd3dfaaeec74aea4f01024a549a5d5fc7c
parent48ea3bbff6ad1ce9f028097660da6c2d30338fe5 (diff)
spirv: Reuse helpers in vtn_handle_type()
And change vtn_storage_class_to_mode() to accept NULL as interface_type. In this case, if we have a SpvStorageClassUniform, we assume it is uses an ubo_addr_format, like the code being replaced by the helper. That assumption is a problem, but no different than the previous code. Reviewed-by: Jason Ekstrand <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]>
-rw-r--r--src/compiler/spirv/spirv_to_nir.c36
-rw-r--r--src/compiler/spirv/vtn_variables.c3
2 files changed, 6 insertions, 33 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 7072f8a3fc3..720999b9286 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -1372,38 +1372,10 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
/* These can actually be stored to nir_variables and used as SSA
* values so they need a real glsl_type.
*/
- nir_address_format addr_format = nir_address_format_logical;
- switch (storage_class) {
- case SpvStorageClassUniform:
- addr_format = b->options->ubo_addr_format;
- break;
- case SpvStorageClassStorageBuffer:
- addr_format = b->options->ssbo_addr_format;
- break;
- case SpvStorageClassPhysicalStorageBufferEXT:
- addr_format = b->options->phys_ssbo_addr_format;
- break;
- case SpvStorageClassPushConstant:
- addr_format = b->options->push_const_addr_format;
- break;
- case SpvStorageClassWorkgroup:
- addr_format = b->options->shared_addr_format;
- break;
- case SpvStorageClassCrossWorkgroup:
- addr_format = b->options->global_addr_format;
- break;
- case SpvStorageClassFunction:
- if (b->physical_ptrs)
- addr_format = b->options->temp_addr_format;
- break;
- default:
- /* In this case, no variable pointers are allowed so all deref
- * chains are complete back to the variable and it doesn't matter
- * what type gets.
- */
- break;
- }
- val->type->type = nir_address_format_to_glsl_type(addr_format);
+ enum vtn_variable_mode mode = vtn_storage_class_to_mode(
+ b, storage_class, NULL, NULL);
+ val->type->type = nir_address_format_to_glsl_type(
+ vtn_mode_to_address_format(b, mode));
} else {
vtn_fail_if(val->type->storage_class != storage_class,
"The storage classes of an OpTypePointer and any "
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 198557f2eaf..50d1d3f4813 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1723,7 +1723,8 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
nir_variable_mode nir_mode;
switch (class) {
case SpvStorageClassUniform:
- if (interface_type->block) {
+ /* Assume it's an UBO if we lack the interface_type. */
+ if (!interface_type || interface_type->block) {
mode = vtn_variable_mode_ubo;
nir_mode = nir_var_mem_ubo;
} else if (interface_type->buffer_block) {