From adc155a8156ee4df18c66bc44587a6880a70bdd7 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 28 Nov 2018 15:20:03 -0600 Subject: [PATCH] spirv: Add explicit pointer types MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Instead of baking in uvec2 for UBO and SSBO pointers and uint for push constant and shared memory pointers, make it configurable. Reviewed-by: Alejandro Piñeiro Reviewed-by: Caio Marcelo de Oliveira Filho --- src/amd/vulkan/radv_shader.c | 4 +++ src/compiler/spirv/nir_spirv.h | 6 +++++ src/compiler/spirv/spirv_to_nir.c | 42 ++++++++++++++++--------------- src/intel/vulkan/anv_pipeline.c | 4 +++ 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 34bfa447930..5db2a1e1a80 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -247,6 +247,10 @@ radv_shader_compile_to_nir(struct radv_device *device, .transform_feedback = true, .storage_image_ms = true, }, + .ubo_ptr_type = glsl_vector_type(GLSL_TYPE_UINT, 2), + .ssbo_ptr_type = glsl_vector_type(GLSL_TYPE_UINT, 2), + .push_const_ptr_type = glsl_uint_type(), + .shared_ptr_type = glsl_uint_type(), }; entry_point = spirv_to_nir(spirv, module->size / 4, spec_entries, num_spec_entries, diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index d2766abb7f9..c73b273ddb4 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -61,6 +61,12 @@ struct spirv_to_nir_options { struct spirv_supported_capabilities caps; + /* Storage types for various kinds of pointers. */ + const struct glsl_type *ubo_ptr_type; + const struct glsl_type *ssbo_ptr_type; + const struct glsl_type *push_const_ptr_type; + const struct glsl_type *shared_ptr_type; + struct { void (*func)(void *private_data, enum nir_spirv_debug_level level, diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index a36cd7206fc..48c5a2aff01 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -1279,26 +1279,21 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, vtn_foreach_decoration(b, val, array_stride_decoration_cb, NULL); - if (storage_class == SpvStorageClassUniform || - storage_class == SpvStorageClassStorageBuffer) { - /* These can actually be stored to nir_variables and used as SSA - * values so they need a real glsl_type. - */ - val->type->type = glsl_vector_type(GLSL_TYPE_UINT, 2); - } - - if (storage_class == SpvStorageClassPushConstant) { - /* These can actually be stored to nir_variables and used as SSA - * values so they need a real glsl_type. - */ - val->type->type = glsl_uint_type(); - } - - if (storage_class == SpvStorageClassWorkgroup) { - /* These can actually be stored to nir_variables and used as SSA - * values so they need a real glsl_type. - */ - val->type->type = glsl_uint_type(); + /* These can actually be stored to nir_variables and used as SSA + * values so they need a real glsl_type. + */ + switch (storage_class) { + case SpvStorageClassUniform: + val->type->type = b->options->ubo_ptr_type; + break; + case SpvStorageClassStorageBuffer: + val->type->type = b->options->ssbo_ptr_type; + break; + case SpvStorageClassPushConstant: + val->type->type = b->options->push_const_ptr_type; + break; + case SpvStorageClassWorkgroup: + val->type->type = b->options->shared_ptr_type; if (b->options->lower_workgroup_access_to_offsets) { uint32_t size, align; val->type->deref = vtn_type_layout_std430(b, val->type->deref, @@ -1306,6 +1301,13 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, val->type->length = size; val->type->align = align; } + 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 used so we leave it NULL. + */ + break; } break; } diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 10afe0825ab..3f1b69ad41a 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -158,6 +158,10 @@ anv_shader_compile_to_nir(struct anv_pipeline *pipeline, .storage_8bit = device->instance->physicalDevice.info.gen >= 8, .post_depth_coverage = device->instance->physicalDevice.info.gen >= 9, }, + .ubo_ptr_type = glsl_vector_type(GLSL_TYPE_UINT, 2), + .ssbo_ptr_type = glsl_vector_type(GLSL_TYPE_UINT, 2), + .push_const_ptr_type = glsl_uint_type(), + .shared_ptr_type = glsl_uint_type(), }; nir_function *entry_point = -- 2.30.2