summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2018-11-28 15:20:03 -0600
committerJason Ekstrand <jason@jlekstrand.net>2019-01-08 00:38:30 +0000
commitadc155a8156ee4df18c66bc44587a6880a70bdd7 (patch)
treeb96e01a55601d50cb8f1db0800065a93e5c1b9fd
parentbe039cb467635c6e2a70e29a586de7a5e403c929 (diff)
spirv: Add explicit pointer types
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 <apinheiro@igalia.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
-rw-r--r--src/amd/vulkan/radv_shader.c4
-rw-r--r--src/compiler/spirv/nir_spirv.h6
-rw-r--r--src/compiler/spirv/spirv_to_nir.c42
-rw-r--r--src/intel/vulkan/anv_pipeline.c4
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 =