[Nouveau] [PATCH mesa v2 2/3] tgsi: Add support for global / private / input MEMORY

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Mar 16 09:47:39 UTC 2016


Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

Btw, usually when someone has reviewed the v1 we add (v1) after the Rb 
tag, like:

Reviewed-by: XXX (v1)

On 03/16/2016 09:55 AM, Hans de Goede wrote:
> Extend the MEMORY file support to differentiate between global, private
> and shared memory, as well as "input" memory.
>
> "MEMORY[x], INPUT" is intended to access OpenCL kernel parameters, a
> special memory type is added for this, since the actual storage of these
> (e.g. UBO-s) may differ per implementation. The uploading of kernel
> parameters is handled by launch_grid, "MEMORY[x], INPUT" allows drivers
> to use an access mechanism for parameter reads which matches with the
> upload method.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> Changes in v2:
> -Drop mention of GLSL global / GLSL local from comments
> -Change TGSI_MEMORY_TYPE_LOCAL to TGSI_MEMORY_TYPE_PRIVATE
> -Add Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>   src/gallium/auxiliary/tgsi/tgsi_build.c            |  8 +++----
>   src/gallium/auxiliary/tgsi/tgsi_dump.c             |  9 ++++++--
>   src/gallium/auxiliary/tgsi/tgsi_text.c             | 14 ++++++++++--
>   src/gallium/auxiliary/tgsi/tgsi_ureg.c             | 25 ++++++++++++----------
>   src/gallium/auxiliary/tgsi/tgsi_ureg.h             |  2 +-
>   .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  7 +++---
>   src/gallium/include/pipe/p_shader_tokens.h         | 10 +++++++--
>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp         |  2 +-
>   8 files changed, 51 insertions(+), 26 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
> index 1cb95b9..a3e659b 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
> @@ -111,7 +111,7 @@ tgsi_default_declaration( void )
>      declaration.Local = 0;
>      declaration.Array = 0;
>      declaration.Atomic = 0;
> -   declaration.Shared = 0;
> +   declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;
>      declaration.Padding = 0;
>
>      return declaration;
> @@ -128,7 +128,7 @@ tgsi_build_declaration(
>      unsigned local,
>      unsigned array,
>      unsigned atomic,
> -   unsigned shared,
> +   unsigned mem_type,
>      struct tgsi_header *header )
>   {
>      struct tgsi_declaration declaration;
> @@ -146,7 +146,7 @@ tgsi_build_declaration(
>      declaration.Local = local;
>      declaration.Array = array;
>      declaration.Atomic = atomic;
> -   declaration.Shared = shared;
> +   declaration.MemType = mem_type;
>      header_bodysize_grow( header );
>
>      return declaration;
> @@ -406,7 +406,7 @@ tgsi_build_full_declaration(
>         full_decl->Declaration.Local,
>         full_decl->Declaration.Array,
>         full_decl->Declaration.Atomic,
> -      full_decl->Declaration.Shared,
> +      full_decl->Declaration.MemType,
>         header );
>
>      if (maxsize <= size)
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index c8b91bb..6d39ef2 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -365,8 +365,13 @@ iter_declaration(
>      }
>
>      if (decl->Declaration.File == TGSI_FILE_MEMORY) {
> -      if (decl->Declaration.Shared)
> -         TXT(", SHARED");
> +      switch (decl->Declaration.MemType) {
> +      /* Note: ,GLOBAL is optional / the default */
> +      case TGSI_MEMORY_TYPE_GLOBAL:  TXT(", GLOBAL");  break;
> +      case TGSI_MEMORY_TYPE_SHARED:  TXT(", SHARED");  break;
> +      case TGSI_MEMORY_TYPE_PRIVATE: TXT(", PRIVATE"); break;
> +      case TGSI_MEMORY_TYPE_INPUT:   TXT(", INPUT");   break;
> +      }
>      }
>
>      if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 77598d2..028633c 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -1390,8 +1390,18 @@ static boolean parse_declaration( struct translate_ctx *ctx )
>               ctx->cur = cur;
>            }
>         } else if (file == TGSI_FILE_MEMORY) {
> -         if (str_match_nocase_whole(&cur, "SHARED")) {
> -            decl.Declaration.Shared = 1;
> +         if (str_match_nocase_whole(&cur, "GLOBAL")) {
> +            /* Note this is a no-op global is the default */
> +            decl.Declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;
> +            ctx->cur = cur;
> +         } else if (str_match_nocase_whole(&cur, "SHARED")) {
> +            decl.Declaration.MemType = TGSI_MEMORY_TYPE_SHARED;
> +            ctx->cur = cur;
> +         } else if (str_match_nocase_whole(&cur, "PRIVATE")) {
> +            decl.Declaration.MemType = TGSI_MEMORY_TYPE_PRIVATE;
> +            ctx->cur = cur;
> +         } else if (str_match_nocase_whole(&cur, "INPUT")) {
> +            decl.Declaration.MemType = TGSI_MEMORY_TYPE_INPUT;
>               ctx->cur = cur;
>            }
>         } else {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index ab1d034..495db9f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -190,7 +190,7 @@ struct ureg_program
>
>      struct ureg_tokens domain[2];
>
> -   bool use_shared_memory;
> +   bool use_memory[TGSI_MEMORY_TYPE_COUNT];
>   };
>
>   static union tgsi_any_token error_tokens[32];
> @@ -729,13 +729,14 @@ struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr,
>      return reg;
>   }
>
> -/* Allocate a shared memory area.
> +/* Allocate a memory area.
>    */
> -struct ureg_src ureg_DECL_shared_memory(struct ureg_program *ureg)
> +struct ureg_src ureg_DECL_memory(struct ureg_program *ureg,
> +                                 unsigned memory_type)
>   {
> -   struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, 0);
> +   struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, memory_type);
>
> -   ureg->use_shared_memory = true;
> +   ureg->use_memory[memory_type] = true;
>      return reg;
>   }
>
> @@ -1672,7 +1673,7 @@ emit_decl_buffer(struct ureg_program *ureg,
>   }
>
>   static void
> -emit_decl_shared_memory(struct ureg_program *ureg)
> +emit_decl_memory(struct ureg_program *ureg, unsigned memory_type)
>   {
>      union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 2);
>
> @@ -1681,11 +1682,11 @@ emit_decl_shared_memory(struct ureg_program *ureg)
>      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[0].decl.MemType = memory_type;
>
>      out[1].value = 0;
> -   out[1].decl_range.First = 0;
> -   out[1].decl_range.Last = 0;
> +   out[1].decl_range.First = memory_type;
> +   out[1].decl_range.Last = memory_type;
>   }
>
>   static void
> @@ -1860,8 +1861,10 @@ 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);
> +   for (i = 0; i < TGSI_MEMORY_TYPE_COUNT; i++) {
> +      if (ureg->use_memory[i])
> +         emit_decl_memory(ureg, i);
> +   }
>
>      if (ureg->const_decls.nr_constant_ranges) {
>         for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index 04a62a6..9080b57 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -338,7 +338,7 @@ 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);
> +ureg_DECL_memory(struct ureg_program *ureg, unsigned memory_type);
>
>   static inline struct ureg_src
>   ureg_imm4f( struct ureg_program *ureg,
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> index d284446..fb7caca 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> @@ -864,7 +864,7 @@ public:
>      std::vector<Resource> resources;
>
>      struct MemoryFile {
> -      bool shared;
> +      uint8_t mem_type; // TGSI_MEMORY_TYPE_*
>      };
>      std::vector<MemoryFile> memoryFiles;
>
> @@ -1222,7 +1222,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
>         break;
>      case TGSI_FILE_MEMORY:
>         for (i = first; i <= last; ++i)
> -         memoryFiles[i].shared = decl->Declaration.Shared;
> +         memoryFiles[i].mem_type = decl->Declaration.MemType;
>         break;
>      case TGSI_FILE_NULL:
>      case TGSI_FILE_TEMPORARY:
> @@ -1527,7 +1527,8 @@ Converter::makeSym(uint tgsiFile, int fileIdx, int idx, int c, uint32_t address)
>
>      sym->reg.fileIndex = fileIdx;
>
> -   if (tgsiFile == TGSI_FILE_MEMORY && code->memoryFiles[fileIdx].shared)
> +   if (tgsiFile == TGSI_FILE_MEMORY &&
> +       code->memoryFiles[fileIdx].mem_type == TGSI_MEMORY_TYPE_SHARED)
>         sym->setFile(FILE_MEMORY_SHARED);
>
>      if (idx >= 0) {
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index 7a34841..65d8ad9 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -117,6 +117,12 @@ enum tgsi_file_type {
>   #define TGSI_CYLINDRICAL_WRAP_Z (1 << 2)
>   #define TGSI_CYLINDRICAL_WRAP_W (1 << 3)
>
> +#define TGSI_MEMORY_TYPE_GLOBAL        0 /* OpenCL global              */
> +#define TGSI_MEMORY_TYPE_SHARED        1 /* OpenCL local / GLSL shared */
> +#define TGSI_MEMORY_TYPE_PRIVATE       2 /* OpenCL private             */
> +#define TGSI_MEMORY_TYPE_INPUT         3 /* OpenCL kernel input params */
> +#define TGSI_MEMORY_TYPE_COUNT         4
> +
>   struct tgsi_declaration
>   {
>      unsigned Type        : 4;  /**< TGSI_TOKEN_TYPE_DECLARATION */
> @@ -130,8 +136,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 Shared      : 1;  /**< shared storage for TGSI_FILE_MEMORY */
> -   unsigned Padding     : 4;
> +   unsigned MemType     : 2;  /**< TGSI_MEMORY_TYPE_x for TGSI_FILE_MEMORY */
> +   unsigned Padding     : 3;
>   };
>
>   struct tgsi_declaration_range
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 1841405..ff2e082 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -6345,7 +6345,7 @@ st_translate_program(
>      }
>
>      if (program->use_shared_memory)
> -      t->shared_memory = ureg_DECL_shared_memory(ureg);
> +      t->shared_memory = ureg_DECL_memory(ureg, TGSI_MEMORY_TYPE_SHARED);
>
>      for (i = 0; i < program->shader->NumImages; i++) {
>         if (program->images_used & (1 << i)) {
>


More information about the Nouveau mailing list