Signed-off-by: Karol Herbst <kher...@redhat.com> --- src/compiler/nir/nir.h | 8 ++++++++ src/compiler/nir/nir_clone.c | 1 + src/compiler/nir/nir_serialize.c | 2 ++ src/compiler/spirv/spirv_to_nir.c | 26 ++++++++++++++++++++++---- src/compiler/spirv/vtn_private.h | 3 +++ 5 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index db935c8496b..a111e87ed71 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2249,6 +2249,14 @@ typedef struct nir_shader { */ void *constant_data; unsigned constant_data_size; + + /** + * pointer size is: + * AddressingModelLogical: 0 (default) + * AddressingModelPhysical32: 32 + * AddressingModelPhysical64: 64 + */ + unsigned ptr_size; } nir_shader; static inline nir_function_impl * diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c index 989c5051a54..d47d3e8cb72 100644 --- a/src/compiler/nir/nir_clone.c +++ b/src/compiler/nir/nir_clone.c @@ -733,6 +733,7 @@ nir_shader_clone(void *mem_ctx, const nir_shader *s) ns->num_uniforms = s->num_uniforms; ns->num_outputs = s->num_outputs; ns->num_shared = s->num_shared; + ns->ptr_size = s->ptr_size; ns->constant_data_size = s->constant_data_size; if (s->constant_data_size > 0) { diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index 43016310048..5ec6972b02a 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -1106,6 +1106,7 @@ nir_serialize(struct blob *blob, const nir_shader *nir) blob_write_uint32(blob, nir->num_uniforms); blob_write_uint32(blob, nir->num_outputs); blob_write_uint32(blob, nir->num_shared); + blob_write_uint32(blob, nir->ptr_size); blob_write_uint32(blob, exec_list_length(&nir->functions)); nir_foreach_function(fxn, nir) { @@ -1165,6 +1166,7 @@ nir_deserialize(void *mem_ctx, ctx.nir->num_uniforms = blob_read_uint32(blob); ctx.nir->num_outputs = blob_read_uint32(blob); ctx.nir->num_shared = blob_read_uint32(blob); + ctx.nir->ptr_size = blob_read_uint32(blob); unsigned num_functions = blob_read_uint32(blob); for (unsigned i = 0; i < num_functions; i++) diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index e41a7e960ce..1a7d5b3a9bd 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3581,9 +3581,27 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, break; case SpvOpMemoryModel: - vtn_assert(w[1] == SpvAddressingModelLogical); + switch (w[1]) { + case SpvAddressingModelPhysical32: + b->shader->ptr_size = 32; + b->physical_ptrs = true; + break; + case SpvAddressingModelPhysical64: + b->shader->ptr_size = 64; + b->physical_ptrs = true; + break; + case SpvAddressingModelLogical: + b->shader->ptr_size = 0; + b->physical_ptrs = false; + 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: @@ -4258,6 +4276,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); @@ -4268,8 +4288,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 da7a04ce59f..47f26dac642 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -605,6 +605,9 @@ struct vtn_builder { unsigned func_param_idx; bool has_loop_continue; + + /* when a physical memory model is choosen */ + bool physical_ptrs; }; nir_ssa_def * -- 2.19.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev