<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Dec 4, 2018 at 12:27 PM Karol Herbst <<a href="mailto:kherbst@redhat.com">kherbst@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Signed-off-by: Karol Herbst <<a href="mailto:kherbst@redhat.com" target="_blank">kherbst@redhat.com</a>><br>
---<br>
src/compiler/nir/nir.h | 8 ++++++++<br>
src/compiler/nir/nir_clone.c | 1 +<br>
src/compiler/nir/nir_serialize.c | 2 ++<br>
src/compiler/spirv/spirv_to_nir.c | 26 ++++++++++++++++++++++----<br>
src/compiler/spirv/vtn_private.h | 3 +++<br>
5 files changed, 36 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h<br>
index db935c8496b..a111e87ed71 100644<br>
--- a/src/compiler/nir/nir.h<br>
+++ b/src/compiler/nir/nir.h<br>
@@ -2249,6 +2249,14 @@ typedef struct nir_shader {<br>
*/<br>
void *constant_data;<br>
unsigned constant_data_size;<br>
+<br>
+ /**<br>
+ * pointer size is:<br>
+ * AddressingModelLogical: 0 (default)<br>
+ * AddressingModelPhysical32: 32<br>
+ * AddressingModelPhysical64: 64<br>
+ */<br>
+ unsigned ptr_size;<br></blockquote><div><br></div><div>I think this is worth stashing but it seems to me like it belongs in the cs portion of shader_info along with the local workgroup size rather than nir_shader.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
} nir_shader;<br>
<br>
static inline nir_function_impl *<br>
diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c<br>
index 989c5051a54..d47d3e8cb72 100644<br>
--- a/src/compiler/nir/nir_clone.c<br>
+++ b/src/compiler/nir/nir_clone.c<br>
@@ -733,6 +733,7 @@ nir_shader_clone(void *mem_ctx, const nir_shader *s)<br>
ns->num_uniforms = s->num_uniforms;<br>
ns->num_outputs = s->num_outputs;<br>
ns->num_shared = s->num_shared;<br>
+ ns->ptr_size = s->ptr_size;<br>
<br>
ns->constant_data_size = s->constant_data_size;<br>
if (s->constant_data_size > 0) {<br>
diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c<br>
index 43016310048..5ec6972b02a 100644<br>
--- a/src/compiler/nir/nir_serialize.c<br>
+++ b/src/compiler/nir/nir_serialize.c<br>
@@ -1106,6 +1106,7 @@ nir_serialize(struct blob *blob, const nir_shader *nir)<br>
blob_write_uint32(blob, nir->num_uniforms);<br>
blob_write_uint32(blob, nir->num_outputs);<br>
blob_write_uint32(blob, nir->num_shared);<br>
+ blob_write_uint32(blob, nir->ptr_size);<br>
<br>
blob_write_uint32(blob, exec_list_length(&nir->functions));<br>
nir_foreach_function(fxn, nir) {<br>
@@ -1165,6 +1166,7 @@ nir_deserialize(void *mem_ctx,<br>
ctx.nir->num_uniforms = blob_read_uint32(blob);<br>
ctx.nir->num_outputs = blob_read_uint32(blob);<br>
ctx.nir->num_shared = blob_read_uint32(blob);<br>
+ ctx.nir->ptr_size = blob_read_uint32(blob);<br>
<br>
unsigned num_functions = blob_read_uint32(blob);<br>
for (unsigned i = 0; i < num_functions; i++)<br>
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c<br>
index e41a7e960ce..1a7d5b3a9bd 100644<br>
--- a/src/compiler/spirv/spirv_to_nir.c<br>
+++ b/src/compiler/spirv/spirv_to_nir.c<br>
@@ -3581,9 +3581,27 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,<br>
break;<br>
<br>
case SpvOpMemoryModel:<br>
- vtn_assert(w[1] == SpvAddressingModelLogical);<br>
+ switch (w[1]) {<br>
+ case SpvAddressingModelPhysical32:<br>
+ b->shader->ptr_size = 32;<br>
+ b->physical_ptrs = true;<br>
+ break;<br>
+ case SpvAddressingModelPhysical64:<br>
+ b->shader->ptr_size = 64;<br>
+ b->physical_ptrs = true;<br>
+ break;<br>
+ case SpvAddressingModelLogical:<br>
+ b->shader->ptr_size = 0;<br>
+ b->physical_ptrs = false;<br>
+ break;<br>
+ default:<br>
+ vtn_fail("Unknown addressing model");<br>
+ break;<br></blockquote><div><br></div><div>With my patches for giving pointers explicit types, we'll likely want to add a type for global and function and set global/function/shared to the explicitly defined size here.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ }<br>
+<br>
vtn_assert(w[2] == SpvMemoryModelSimple ||<br>
- w[2] == SpvMemoryModelGLSL450);<br>
+ w[2] == SpvMemoryModelGLSL450 ||<br>
+ w[2] == SpvMemoryModelOpenCL);<br>
break;<br>
<br>
case SpvOpEntryPoint:<br>
@@ -4258,6 +4276,8 @@ spirv_to_nir(const uint32_t *words, size_t word_count,<br>
/* Skip the SPIR-V header, handled at vtn_create_builder */<br>
words+= 5;<br>
<br>
+ b->shader = nir_shader_create(b, stage, nir_options, NULL);<br>
+<br>
/* Handle all the preamble instructions */<br>
words = vtn_foreach_instruction(b, words, word_end,<br>
vtn_handle_preamble_instruction);<br>
@@ -4268,8 +4288,6 @@ spirv_to_nir(const uint32_t *words, size_t word_count,<br>
return NULL;<br>
}<br>
<br>
- b->shader = nir_shader_create(b, stage, nir_options, NULL);<br>
-<br>
/* Set shader info defaults */<br>
b->shader->info.gs.invocations = 1;<br>
<br>
diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h<br>
index da7a04ce59f..47f26dac642 100644<br>
--- a/src/compiler/spirv/vtn_private.h<br>
+++ b/src/compiler/spirv/vtn_private.h<br>
@@ -605,6 +605,9 @@ struct vtn_builder {<br>
unsigned func_param_idx;<br>
<br>
bool has_loop_continue;<br>
+<br>
+ /* when a physical memory model is choosen */<br>
+ bool physical_ptrs;<br>
};<br>
<br>
nir_ssa_def *<br>
-- <br>
2.19.2<br>
<br>
</blockquote></div></div>