<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 10, 2016 at 9:14 AM, Hans de Goede <span dir="ltr"><<a href="mailto:hdegoede@redhat.com" target="_blank">hdegoede@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Extend the MEMORY file support to differentiate between global, local<br>
and shared memory, as well as "input" memory.<br>
<br>
"MEMORY[x], INPUT" is intended to access OpenCL kernel parameters, a<br>
special memory type is added for this, since the actual storage of these<br>
(e.g. UBO-s) may differ per implementation. The uploading of kernel<br>
parameters is handled by launch_grid, "MEMORY[x], INPUT" allows drivers<br>
to use an access mechanism for parameter reads which matches with the<br>
upload method.<br>
<br>
Signed-off-by: Hans de Goede <<a href="mailto:hdegoede@redhat.com">hdegoede@redhat.com</a>><br>
---<br>
 src/gallium/auxiliary/tgsi/tgsi_build.c            |  8 +++----<br>
 src/gallium/auxiliary/tgsi/tgsi_dump.c             |  9 ++++++--<br>
 src/gallium/auxiliary/tgsi/tgsi_text.c             | 14 ++++++++++--<br>
 src/gallium/auxiliary/tgsi/tgsi_ureg.c             | 25 ++++++++++++----------<br>
 src/gallium/auxiliary/tgsi/tgsi_ureg.h             |  2 +-<br>
 .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  7 +++---<br>
 src/gallium/include/pipe/p_shader_tokens.h         | 10 +++++++--<br>
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp         |  2 +-<br>
 8 files changed, 51 insertions(+), 26 deletions(-)<br>
<br>
diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c<br>
index c420ae1..b108ade 100644<br>
--- a/src/gallium/auxiliary/tgsi/tgsi_build.c<br>
+++ b/src/gallium/auxiliary/tgsi/tgsi_build.c<br>
@@ -111,7 +111,7 @@ tgsi_default_declaration( void )<br>
    declaration.Local = 0;<br>
    declaration.Array = 0;<br>
    declaration.Atomic = 0;<br>
-   declaration.Shared = 0;<br>
+   declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;<br>
    declaration.Padding = 0;<br>
<br>
    return declaration;<br>
@@ -128,7 +128,7 @@ tgsi_build_declaration(<br>
    unsigned local,<br>
    unsigned array,<br>
    unsigned atomic,<br>
-   unsigned shared,<br>
+   unsigned mem_type,<br>
    struct tgsi_header *header )<br>
 {<br>
    struct tgsi_declaration declaration;<br>
@@ -146,7 +146,7 @@ tgsi_build_declaration(<br>
    declaration.Local = local;<br>
    declaration.Array = array;<br>
    declaration.Atomic = atomic;<br>
-   declaration.Shared = shared;<br>
+   declaration.MemType = mem_type;<br>
    header_bodysize_grow( header );<br>
<br>
    return declaration;<br>
@@ -406,7 +406,7 @@ tgsi_build_full_declaration(<br>
       full_decl->Declaration.Local,<br>
       full_decl->Declaration.Array,<br>
       full_decl->Declaration.Atomic,<br>
-      full_decl->Declaration.Shared,<br>
+      full_decl->Declaration.MemType,<br>
       header );<br>
<br>
    if (maxsize <= size)<br>
diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c<br>
index f232f38..273f0ae 100644<br>
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c<br>
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c<br>
@@ -365,8 +365,13 @@ iter_declaration(<br>
    }<br>
<br>
    if (decl->Declaration.File == TGSI_FILE_MEMORY) {<br>
-      if (decl->Declaration.Shared)<br>
-         TXT(", SHARED");<br>
+      switch (decl->Declaration.MemType) {<br>
+      /* Note: ,GLOBAL is optional / the default */<br>
+      case TGSI_MEMORY_TYPE_GLOBAL: TXT(", GLOBAL"); break;<br>
+      case TGSI_MEMORY_TYPE_LOCAL:  TXT(", LOCAL");  break;<br>
+      case TGSI_MEMORY_TYPE_SHARED: TXT(", SHARED"); break;<br>
+      case TGSI_MEMORY_TYPE_INPUT:  TXT(", INPUT");  break;<br>
+      }<br>
    }<br>
<br>
    if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {<br>
diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c<br>
index 77598d2..9438e3b 100644<br>
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c<br>
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c<br>
@@ -1390,8 +1390,18 @@ static boolean parse_declaration( struct translate_ctx *ctx )<br>
             ctx->cur = cur;<br>
          }<br>
       } else if (file == TGSI_FILE_MEMORY) {<br>
-         if (str_match_nocase_whole(&cur, "SHARED")) {<br>
-            decl.Declaration.Shared = 1;<br>
+         if (str_match_nocase_whole(&cur, "GLOBAL")) {<br>
+            /* Note this is a no-op global is the default */<br>
+            decl.Declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;<br>
+            ctx->cur = cur;<br>
+         } else if (str_match_nocase_whole(&cur, "LOCAL")) {<br>
+            decl.Declaration.MemType = TGSI_MEMORY_TYPE_LOCAL;<br>
+            ctx->cur = cur;<br>
+         } else if (str_match_nocase_whole(&cur, "SHARED")) {<br>
+            decl.Declaration.MemType = TGSI_MEMORY_TYPE_SHARED;<br>
+            ctx->cur = cur;<br>
+         } else if (str_match_nocase_whole(&cur, "INPUT")) {<br>
+            decl.Declaration.MemType = TGSI_MEMORY_TYPE_INPUT;<br>
             ctx->cur = cur;<br>
          }<br>
       } else {<br>
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c<br>
index e1a7278..9e10044 100644<br>
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c<br>
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c<br>
@@ -190,7 +190,7 @@ struct ureg_program<br>
<br>
    struct ureg_tokens domain[2];<br>
<br>
-   bool use_shared_memory;<br>
+   bool use_memory[TGSI_MEMORY_TYPE_COUNT];<br>
 };<br>
<br>
 static union tgsi_any_token error_tokens[32];<br>
@@ -729,13 +729,14 @@ struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr,<br>
    return reg;<br>
 }<br>
<br>
-/* Allocate a shared memory area.<br>
+/* Allocate a memory area.<br>
  */<br>
-struct ureg_src ureg_DECL_shared_memory(struct ureg_program *ureg)<br>
+struct ureg_src ureg_DECL_memory(struct ureg_program *ureg,<br>
+                                 unsigned memory_type)<br>
 {<br>
-   struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, 0);<br>
+   struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, memory_type);<br>
<br>
-   ureg->use_shared_memory = true;<br>
+   ureg->use_memory[memory_type] = true;<br>
    return reg;<br>
 }<br>
<br>
@@ -1666,7 +1667,7 @@ emit_decl_buffer(struct ureg_program *ureg,<br>
 }<br>
<br>
 static void<br>
-emit_decl_shared_memory(struct ureg_program *ureg)<br>
+emit_decl_memory(struct ureg_program *ureg, unsigned memory_type)<br>
 {<br>
    union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 2);<br>
<br>
@@ -1675,11 +1676,11 @@ emit_decl_shared_memory(struct ureg_program *ureg)<br>
    out[0].decl.NrTokens = 2;<br>
    out[0].decl.File = TGSI_FILE_MEMORY;<br>
    out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW;<br>
-   out[0].decl.Shared = true;<br>
+   out[0].decl.MemType = memory_type;<br>
<br>
    out[1].value = 0;<br>
-   out[1].decl_range.First = 0;<br>
-   out[1].decl_range.Last = 0;<br>
+   out[1].decl_range.First = memory_type;<br>
+   out[1].decl_range.Last = memory_type;<br>
 }<br>
<br>
 static void<br>
@@ -1854,8 +1855,10 @@ static void emit_decls( struct ureg_program *ureg )<br>
       emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic);<br>
    }<br>
<br>
-   if (ureg->use_shared_memory)<br>
-      emit_decl_shared_memory(ureg);<br>
+   for (i = 0; i < TGSI_MEMORY_TYPE_COUNT; i++) {<br>
+      if (ureg->use_memory[i])<br>
+         emit_decl_memory(ureg, i);<br>
+   }<br>
<br>
    if (ureg->const_decls.nr_constant_ranges) {<br>
       for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {<br>
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h<br>
index 6a3b5dd..7c7a89e 100644<br>
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h<br>
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h<br>
@@ -338,7 +338,7 @@ struct ureg_src<br>
 ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic);<br>
<br>
 struct ureg_src<br>
-ureg_DECL_shared_memory(struct ureg_program *ureg);<br>
+ureg_DECL_memory(struct ureg_program *ureg, unsigned memory_type);<br>
<br>
 static inline struct ureg_src<br>
 ureg_imm4f( struct ureg_program *ureg,<br>
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp<br>
index 8683722..a8258af 100644<br>
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp<br>
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp<br>
@@ -860,7 +860,7 @@ public:<br>
    std::vector<Resource> resources;<br>
<br>
    struct MemoryFile {<br>
-      bool shared;<br>
+      uint8_t mem_type; // TGSI_MEMORY_TYPE_*<br>
    };<br>
    std::vector<MemoryFile> memoryFiles;<br>
<br>
@@ -1218,7 +1218,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)<br>
       break;<br>
    case TGSI_FILE_MEMORY:<br>
       for (i = first; i <= last; ++i)<br>
-         memoryFiles[i].shared = decl->Declaration.Shared;<br>
+         memoryFiles[i].mem_type = decl->Declaration.MemType;<br>
       break;<br>
    case TGSI_FILE_NULL:<br>
    case TGSI_FILE_TEMPORARY:<br>
@@ -1523,7 +1523,8 @@ Converter::makeSym(uint tgsiFile, int fileIdx, int idx, int c, uint32_t address)<br>
<br>
    sym->reg.fileIndex = fileIdx;<br>
<br>
-   if (tgsiFile == TGSI_FILE_MEMORY && code->memoryFiles[fileIdx].shared)<br>
+   if (tgsiFile == TGSI_FILE_MEMORY &&<br>
+       code->memoryFiles[fileIdx].mem_type == TGSI_MEMORY_TYPE_SHARED)<br>
       sym->setFile(FILE_MEMORY_SHARED);<br>
<br>
    if (idx >= 0) {<br>
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h<br>
index 9d4a96a..0b8d7fb 100644<br>
--- a/src/gallium/include/pipe/p_shader_tokens.h<br>
+++ b/src/gallium/include/pipe/p_shader_tokens.h<br>
@@ -117,6 +117,12 @@ enum tgsi_file_type {<br>
 #define TGSI_CYLINDRICAL_WRAP_Z (1 << 2)<br>
 #define TGSI_CYLINDRICAL_WRAP_W (1 << 3)<br>
<br>
+#define TGSI_MEMORY_TYPE_GLOBAL        0 /* GLSL global / OpenCL global    */<br>
+#define TGSI_MEMORY_TYPE_LOCAL         1 /* GLSL local  / OpenCL private   */<br>
+#define TGSI_MEMORY_TYPE_SHARED        2 /* GLSL shared / OpenCL local     */<br>
+#define TGSI_MEMORY_TYPE_INPUT         3 /* For OpenCL kernel input params */<br></blockquote><div><br></div><div>Note: I know little about how you are approaching the CL implementation for Nouveau...<br><br></div><div>Should I expect to see an entry in here anywhere for the CONSTANT memory type?<br><br></div><div>My GL knowledge is pretty basic. Would that map reasonably to something like a GL UBO? Do we need an explicit type for CL constant buffers?<br><br></div><div>--Aaron<br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+#define TGSI_MEMORY_TYPE_COUNT         4<br>
+<br>
 struct tgsi_declaration<br>
 {<br>
    unsigned Type        : 4;  /**< TGSI_TOKEN_TYPE_DECLARATION */<br>
@@ -130,8 +136,8 @@ struct tgsi_declaration<br>
    unsigned Local       : 1;  /**< optimize as subroutine local variable? */<br>
    unsigned Array       : 1;  /**< extra array info? */<br>
    unsigned Atomic      : 1;  /**< atomic only? for TGSI_FILE_BUFFER */<br>
-   unsigned Shared      : 1;  /**< shared storage for TGSI_FILE_MEMORY */<br>
-   unsigned Padding     : 4;<br>
+   unsigned MemType     : 2;  /**< TGSI_MEMORY_TYPE_x for TGSI_FILE_MEMORY */<br>
+   unsigned Padding     : 3;<br>
 };<br>
<br>
 struct tgsi_declaration_range<br>
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
index 26e463e..9b8bf8e 100644<br>
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp<br>
@@ -6281,7 +6281,7 @@ st_translate_program(<br>
    }<br>
<br>
    if (program->use_shared_memory)<br>
-      t->shared_memory = ureg_DECL_shared_memory(ureg);<br>
+      t->shared_memory = ureg_DECL_memory(ureg, TGSI_MEMORY_TYPE_SHARED);<br>
<br>
    for (i = 0; i < program->shader->NumImages; i++) {<br>
       if (program->images_used & (1 << i)) {<br>
<span class=""><font color="#888888">--<br>
2.7.2<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>