On 02/07/2016 12:51 AM, Ilia Mirkin wrote:
On Sat, Feb 6, 2016 at 5:04 PM, Samuel Pitoiset
<[email protected]> wrote:
This introduces TGSI_FILE_MEMORY for shared, global and local memory.
Only shared memory is currently supported.

Changes from v2:
  - introduce TGSI_FILE_MEMORY

Signed-off-by: Samuel Pitoiset <[email protected]>
---
  src/gallium/auxiliary/tgsi/tgsi_build.c    |  1 +
  src/gallium/auxiliary/tgsi/tgsi_dump.c     |  5 +++++
  src/gallium/auxiliary/tgsi/tgsi_strings.c  |  1 +
  src/gallium/auxiliary/tgsi/tgsi_text.c     |  3 +++
  src/gallium/auxiliary/tgsi/tgsi_ureg.c     | 32 ++++++++++++++++++++++++++++++
  src/gallium/auxiliary/tgsi/tgsi_ureg.h     |  3 +++
  src/gallium/include/pipe/p_shader_tokens.h |  4 +++-
  7 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c 
b/src/gallium/auxiliary/tgsi/tgsi_build.c
index 83f5062..cfe9b92 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_build.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
@@ -111,6 +111,7 @@ tgsi_default_declaration( void )
     declaration.Local = 0;
     declaration.Array = 0;
     declaration.Atomic = 0;
+   declaration.Shared = 0;
     declaration.Padding = 0;

     return declaration;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c 
b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index 2ad29b9..36f0cc5 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -364,6 +364,11 @@ iter_declaration(
           TXT(", ATOMIC");
     }

+   if (decl->Declaration.File == TGSI_FILE_MEMORY) {
+      if (decl->Declaration.Shared)
+         TXT(", SHARED");
+   }
+
     if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
        TXT(", ");
        ENM(decl->SamplerView.Resource, tgsi_texture_names);
diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c 
b/src/gallium/auxiliary/tgsi/tgsi_strings.c
index f2d70d4..b15ae69 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
@@ -57,6 +57,7 @@ static const char *tgsi_file_names[] =
     "IMAGE",
     "SVIEW",
     "BUFFER",
+   "MEMORY",
  };

  const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c 
b/src/gallium/auxiliary/tgsi/tgsi_text.c
index 97b1869..ef43ebc 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -1381,6 +1381,9 @@ static boolean parse_declaration( struct translate_ctx 
*ctx )
           if (str_match_nocase_whole(&cur, "ATOMIC")) {
              decl.Declaration.Atomic = 1;
              ctx->cur = cur;
+         } else if (str_match_nocase_whole(&cur, "SHARED")) {
+            decl.Declaration.Shared = 1;
+            ctx->cur = cur;
           }
        } else {
           if (str_match_nocase_whole(&cur, "LOCAL")) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index 9654ac5..e1a7278 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -189,6 +189,8 @@ struct ureg_program
     unsigned nr_instructions;

     struct ureg_tokens domain[2];
+
+   bool use_shared_memory;
  };

  static union tgsi_any_token error_tokens[32];
@@ -727,6 +729,16 @@ struct ureg_src ureg_DECL_buffer(struct ureg_program 
*ureg, unsigned nr,
     return reg;
  }

+/* Allocate a shared memory area.
+ */
+struct ureg_src ureg_DECL_shared_memory(struct ureg_program *ureg)
+{
+   struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, 0);
+
+   ureg->use_shared_memory = true;
+   return reg;
+}
+
  static int
  match_or_expand_immediate64( const unsigned *v,
                               int type,
@@ -1654,6 +1666,23 @@ emit_decl_buffer(struct ureg_program *ureg,
  }

  static void
+emit_decl_shared_memory(struct ureg_program *ureg)
+{
+   union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 2);
+
+   out[0].value = 0;
+   out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
+   out[0].decl.NrTokens = 2;
+   out[0].decl.File = TGSI_FILE_MEMORY;
+   out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW;
+   out[0].decl.Shared = true;
+
+   out[1].value = 0;
+   out[1].decl_range.First = 0;
+   out[1].decl_range.Last = 0;
+}
+
+static void
  emit_immediate( struct ureg_program *ureg,
                  const unsigned *v,
                  unsigned type )
@@ -1825,6 +1854,9 @@ static void emit_decls( struct ureg_program *ureg )
        emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic);
     }

+   if (ureg->use_shared_memory)
+      emit_decl_shared_memory(ureg);
+
     if (ureg->const_decls.nr_constant_ranges) {
        for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {
           emit_decl_range(ureg,
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index 86e58a9..6a3b5dd 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -337,6 +337,9 @@ ureg_DECL_image(struct ureg_program *ureg,
  struct ureg_src
  ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic);

+struct ureg_src
+ureg_DECL_shared_memory(struct ureg_program *ureg);
+
  static inline struct ureg_src
  ureg_imm4f( struct ureg_program *ureg,
                         float a, float b,
diff --git a/src/gallium/include/pipe/p_shader_tokens.h 
b/src/gallium/include/pipe/p_shader_tokens.h
index 6539017..9d4a96a 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -79,6 +79,7 @@ enum tgsi_file_type {
     TGSI_FILE_IMAGE               =10,
     TGSI_FILE_SAMPLER_VIEW        =11,
     TGSI_FILE_BUFFER              =12,
+   TGSI_FILE_MEMORY              =13,
     TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
  };

@@ -129,7 +130,8 @@ struct tgsi_declaration
     unsigned Local       : 1;  /**< optimize as subroutine local variable? */
     unsigned Array       : 1;  /**< extra array info? */
     unsigned Atomic      : 1;  /**< atomic only? for TGSI_FILE_BUFFER */
-   unsigned Padding     : 5;
+   unsigned Shared      : 1;  /**< shared storage for TGSI_FILE_MEMORY */

Might as well go all out and steal 2 bits for shared/private/global?

Well, if you really want, I can add them but they won't be currently used that's why I didn't add them. :-)


+   unsigned Padding     : 4;
  };

  struct tgsi_declaration_range
--
2.6.4

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to