<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>