From 83550b7dc437f496eea090b938d3ba599c0db016 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Wed, 8 May 2019 13:16:13 -0700 Subject: [PATCH] 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 Reviewed-by: Bas Nieuwenhuizen --- src/compiler/spirv/spirv_to_nir.c | 36 ++++-------------------------- src/compiler/spirv/vtn_variables.c | 3 ++- 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) { -- 2.30.2