[Mesa-dev] [PATCH v2 09/20] tgsi/ureg: add shared variables support for compute shaders

Samuel Pitoiset samuel.pitoiset at gmail.com
Sun Feb 7 10:56:56 UTC 2016



On 02/07/2016 12:51 AM, Ilia Mirkin wrote:
> On Sat, Feb 6, 2016 at 5:04 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> 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 <samuel.pitoiset at gmail.com>
>> ---
>>   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
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list