diff options
-rw-r--r-- | src/compiler/shader_info.h | 9 | ||||
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 40 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_private.h | 3 |
3 files changed, 45 insertions, 7 deletions
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 5b229130a11..ef195760acb 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -243,6 +243,15 @@ typedef struct shader_info { * Size of shared variables accessed by the compute shader. */ unsigned shared_size; + + + /** + * pointer size is: + * AddressingModelLogical: 0 (default) + * AddressingModelPhysical32: 32 + * AddressingModelPhysical64: 64 + */ + unsigned ptr_size; } cs; /* Applies to both TCS and TES. */ diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index de5e6cc8659..08b7ae09d9c 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3732,12 +3732,38 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, break; case SpvOpMemoryModel: - vtn_assert(w[1] == SpvAddressingModelLogical || - (b->options && - b->options->caps.physical_storage_buffer_address && - w[1] == SpvAddressingModelPhysicalStorageBuffer64EXT)); + switch (w[1]) { + case SpvAddressingModelPhysical32: + vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL, + "AddressingModelPhysical32 only supported for kernels"); + b->shader->info.cs.ptr_size = 32; + b->physical_ptrs = true; + break; + case SpvAddressingModelPhysical64: + vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL, + "AddressingModelPhysical64 only supported for kernels"); + b->shader->info.cs.ptr_size = 64; + b->physical_ptrs = true; + break; + case SpvAddressingModelLogical: + vtn_fail_if(b->shader->info.stage >= MESA_SHADER_STAGES, + "AddressingModelLogical only supported for shaders"); + b->shader->info.cs.ptr_size = 0; + b->physical_ptrs = false; + break; + case SpvAddressingModelPhysicalStorageBuffer64EXT: + vtn_fail_if(!b->options || + !b->options->caps.physical_storage_buffer_address, + "AddressingModelPhysicalStorageBuffer64EXT not supported"); + break; + default: + vtn_fail("Unknown addressing model"); + break; + } + vtn_assert(w[2] == SpvMemoryModelSimple || - w[2] == SpvMemoryModelGLSL450); + w[2] == SpvMemoryModelGLSL450 || + w[2] == SpvMemoryModelOpenCL); break; case SpvOpEntryPoint: @@ -4440,6 +4466,8 @@ spirv_to_nir(const uint32_t *words, size_t word_count, /* Skip the SPIR-V header, handled at vtn_create_builder */ words+= 5; + b->shader = nir_shader_create(b, stage, nir_options, NULL); + /* Handle all the preamble instructions */ words = vtn_foreach_instruction(b, words, word_end, vtn_handle_preamble_instruction); @@ -4450,8 +4478,6 @@ spirv_to_nir(const uint32_t *words, size_t word_count, return NULL; } - b->shader = nir_shader_create(b, stage, nir_options, NULL); - /* Set shader info defaults */ b->shader->info.gs.invocations = 1; diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index f3d54051885..330cf47b34a 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -613,6 +613,9 @@ struct vtn_builder { /* false by default, set to true by the ContractionOff execution mode */ bool exact; + + /* when a physical memory model is choosen */ + bool physical_ptrs; }; nir_ssa_def * |