spirv: Add explicit pointer types
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 28 Nov 2018 21:20:03 +0000 (15:20 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Tue, 8 Jan 2019 00:38:30 +0000 (00:38 +0000)
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>
src/amd/vulkan/radv_shader.c
src/compiler/spirv/nir_spirv.h
src/compiler/spirv/spirv_to_nir.c
src/intel/vulkan/anv_pipeline.c

index 34bfa44793082ba8f7b13ef8f8a701d8c53dd2a6..5db2a1e1a8048f207706c0414d7fbbf30928ed4d 100644 (file)
@@ -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,
index d2766abb7f974cf4075df108f3b3d0e7a62f062c..c73b273ddb4417c44978a3ec63497320f70bdf1d 100644 (file)
@@ -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,
index a36cd7206fc1289276c438d8301c0ef5854d555d..48c5a2aff01611ff2b73de11258622a24554c68c 100644 (file)
@@ -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;
    }
index 10afe0825abfb9c501a0eacd88a5b3b9778d1f29..3f1b69ad41aa24ee476c494337e96f3e81ab8e99 100644 (file)
@@ -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 =