tgsi/ureg: add shared variables support for compute shaders
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 16 Jan 2016 22:08:55 +0000 (23:08 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 13 Feb 2016 14:51:17 +0000 (15:51 +0100)
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 <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/tgsi/tgsi_build.c
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_strings.c
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/auxiliary/tgsi/tgsi_ureg.h
src/gallium/include/pipe/p_shader_tokens.h

index 83f50628b407bc58ad4a9b4c209615bcc5f56bbf..cfe9b92ee1bf34b6dbe35d513f12814e254ba11f 100644 (file)
@@ -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;
index 2ad29b9d49a4852c0ee4adfce43f5819d85102c8..36f0cc57946c37aba70d456c846db4c02f010615 100644 (file)
@@ -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);
index f2d70d49839a1de620691ae9620aa5055231d85a..b15ae69cf7a77805a1341bfe78b0e132c8f66b82 100644 (file)
@@ -57,6 +57,7 @@ static const char *tgsi_file_names[] =
    "IMAGE",
    "SVIEW",
    "BUFFER",
+   "MEMORY",
 };
 
 const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
index 97b1869a66f13a564b360aef7cd9c06fec3ed8c9..ef43ebc661945ddc291bb42015e1b353672ddb29 100644 (file)
@@ -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")) {
index 9654ac52bf2b5410888f17d6353e54b8adb9e26f..e1a727864764c8aace3a4716f665cd593b6c818e 100644 (file)
@@ -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,
@@ -1653,6 +1665,23 @@ emit_decl_buffer(struct ureg_program *ureg,
    out[1].decl_range.Last = index;
 }
 
+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,
@@ -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,
index 86e58a9134314dfa21c1bd6135f9a0ae6d2f87ee..6a3b5ddf0178ce2adc353f4c74b20367f9262724 100644 (file)
@@ -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,
index 6539017b77c615732ad6dcc25c178aa1009f118b..9d4a96a5a7e4ea7ad568d7c2c80641c7b3876fc2 100644 (file)
@@ -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 */
+   unsigned Padding     : 4;
 };
 
 struct tgsi_declaration_range