[Mesa-dev] [PATCH 1/8] tgsi: add ureg support for image decls

Rob Clark robdclark at gmail.com
Mon Jan 4 07:30:49 PST 2016


On Sat, Jan 2, 2016 at 11:37 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>  src/gallium/auxiliary/tgsi/tgsi_build.c            | 62 +++++++++--------
>  src/gallium/auxiliary/tgsi/tgsi_dump.c             | 10 +--
>  src/gallium/auxiliary/tgsi/tgsi_parse.c            |  4 +-
>  src/gallium/auxiliary/tgsi/tgsi_parse.h            |  2 +-
>  src/gallium/auxiliary/tgsi/tgsi_strings.c          |  4 +-
>  src/gallium/auxiliary/tgsi/tgsi_text.c             | 10 +--
>  src/gallium/auxiliary/tgsi/tgsi_ureg.c             | 77 ++++++++++++++++++++++
>  src/gallium/auxiliary/tgsi/tgsi_ureg.h             |  7 ++
>  src/gallium/drivers/ilo/shader/toy_tgsi.c          |  8 +--
>  .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  | 12 +++-
>  src/gallium/drivers/svga/svga_tgsi_vgpu10.c        |  2 +
>  src/gallium/include/pipe/p_shader_tokens.h         |  7 +-

missing src/gallium/docs/source/tgsi.rst ?

BR,
-R

>  12 files changed, 153 insertions(+), 52 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
> index fdb7feb..bb9d0cb 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
> @@ -259,36 +259,39 @@ tgsi_build_declaration_semantic(
>     return ds;
>  }
>
> -static struct tgsi_declaration_resource
> -tgsi_default_declaration_resource(void)
> +static struct tgsi_declaration_image
> +tgsi_default_declaration_image(void)
>  {
> -   struct tgsi_declaration_resource dr;
> +   struct tgsi_declaration_image di;
>
> -   dr.Resource = TGSI_TEXTURE_BUFFER;
> -   dr.Raw = 0;
> -   dr.Writable = 0;
> -   dr.Padding = 0;
> +   di.Resource = TGSI_TEXTURE_BUFFER;
> +   di.Raw = 0;
> +   di.Writable = 0;
> +   di.Format = 0;
> +   di.Padding = 0;
>
> -   return dr;
> +   return di;
>  }
>
> -static struct tgsi_declaration_resource
> -tgsi_build_declaration_resource(unsigned texture,
> -                                unsigned raw,
> -                                unsigned writable,
> -                                struct tgsi_declaration *declaration,
> -                                struct tgsi_header *header)
> +static struct tgsi_declaration_image
> +tgsi_build_declaration_image(unsigned texture,
> +                             unsigned format,
> +                             unsigned raw,
> +                             unsigned writable,
> +                             struct tgsi_declaration *declaration,
> +                             struct tgsi_header *header)
>  {
> -   struct tgsi_declaration_resource dr;
> +   struct tgsi_declaration_image di;
>
> -   dr = tgsi_default_declaration_resource();
> -   dr.Resource = texture;
> -   dr.Raw = raw;
> -   dr.Writable = writable;
> +   di = tgsi_default_declaration_image();
> +   di.Resource = texture;
> +   di.Format = format;
> +   di.Raw = raw;
> +   di.Writable = writable;
>
>     declaration_grow(declaration, header);
>
> -   return dr;
> +   return di;
>  }
>
>  static struct tgsi_declaration_sampler_view
> @@ -364,7 +367,7 @@ tgsi_default_full_declaration( void )
>     full_declaration.Range = tgsi_default_declaration_range();
>     full_declaration.Semantic = tgsi_default_declaration_semantic();
>     full_declaration.Interp = tgsi_default_declaration_interp();
> -   full_declaration.Resource = tgsi_default_declaration_resource();
> +   full_declaration.Image = tgsi_default_declaration_image();
>     full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
>     full_declaration.Array = tgsi_default_declaration_array();
>
> @@ -454,20 +457,21 @@ tgsi_build_full_declaration(
>           header );
>     }
>
> -   if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) {
> -      struct tgsi_declaration_resource *dr;
> +   if (full_decl->Declaration.File == TGSI_FILE_IMAGE) {
> +      struct tgsi_declaration_image *di;
>
>        if (maxsize <= size) {
>           return  0;
>        }
> -      dr = (struct tgsi_declaration_resource *)&tokens[size];
> +      di = (struct tgsi_declaration_image *)&tokens[size];
>        size++;
>
> -      *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
> -                                            full_decl->Resource.Raw,
> -                                            full_decl->Resource.Writable,
> -                                            declaration,
> -                                            header);
> +      *di = tgsi_build_declaration_image(full_decl->Image.Resource,
> +                                         full_decl->Image.Format,
> +                                         full_decl->Image.Raw,
> +                                         full_decl->Image.Writable,
> +                                         declaration,
> +                                         header);
>     }
>
>     if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index e29ffb3..dad3839 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -348,12 +348,14 @@ iter_declaration(
>        }
>     }
>
> -   if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
> +   if (decl->Declaration.File == TGSI_FILE_IMAGE) {
>        TXT(", ");
> -      ENM(decl->Resource.Resource, tgsi_texture_names);
> -      if (decl->Resource.Writable)
> +      ENM(decl->Image.Resource, tgsi_texture_names);
> +      TXT(", ");
> +      UID(decl->Image.Format);
> +      if (decl->Image.Writable)
>           TXT(", WR");
> -      if (decl->Resource.Raw)
> +      if (decl->Image.Raw)
>           TXT(", RAW");
>     }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> index 0729b5d..9a52bbb 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> @@ -121,8 +121,8 @@ tgsi_parse_token(
>           next_token( ctx, &decl->Semantic );
>        }
>
> -      if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
> -         next_token(ctx, &decl->Resource);
> +      if (decl->Declaration.File == TGSI_FILE_IMAGE) {
> +         next_token(ctx, &decl->Image);
>        }
>
>        if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> index 35e1c7c..5ed1a83 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> @@ -64,7 +64,7 @@ struct tgsi_full_declaration
>     struct tgsi_declaration_dimension Dim;
>     struct tgsi_declaration_interp Interp;
>     struct tgsi_declaration_semantic Semantic;
> -   struct tgsi_declaration_resource Resource;
> +   struct tgsi_declaration_image Image;
>     struct tgsi_declaration_sampler_view SamplerView;
>     struct tgsi_declaration_array Array;
>  };
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> index fd926b3..ae30399 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> @@ -54,8 +54,8 @@ static const char *tgsi_file_names[] =
>     "IMM",
>     "PRED",
>     "SV",
> -   "RES",
> -   "SVIEW"
> +   "IMAGE",
> +   "SVIEW",
>  };
>
>  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 4a82c9b..a45ab90 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -1251,10 +1251,10 @@ static boolean parse_declaration( struct translate_ctx *ctx )
>
>        cur++;
>        eat_opt_white( &cur );
> -      if (file == TGSI_FILE_RESOURCE) {
> +      if (file == TGSI_FILE_IMAGE) {
>           for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
>              if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) {
> -               decl.Resource.Resource = i;
> +               decl.Image.Resource = i;
>                 break;
>              }
>           }
> @@ -1263,16 +1263,18 @@ static boolean parse_declaration( struct translate_ctx *ctx )
>              return FALSE;
>           }
>
> +         /* XXX format */
> +
>           cur2 = cur;
>           eat_opt_white(&cur2);
>           while (*cur2 == ',') {
>              cur2++;
>              eat_opt_white(&cur2);
>              if (str_match_nocase_whole(&cur2, "RAW")) {
> -               decl.Resource.Raw = 1;
> +               decl.Image.Raw = 1;
>
>              } else if (str_match_nocase_whole(&cur2, "WR")) {
> -               decl.Resource.Writable = 1;
> +               decl.Image.Writable = 1;
>
>              } else {
>                 break;
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 4aaf8df..ee23df9 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -50,6 +50,7 @@ union tgsi_any_token {
>     struct tgsi_declaration_range decl_range;
>     struct tgsi_declaration_dimension decl_dim;
>     struct tgsi_declaration_interp decl_interp;
> +   struct tgsi_declaration_image decl_image;
>     struct tgsi_declaration_semantic decl_semantic;
>     struct tgsi_declaration_sampler_view decl_sampler_view;
>     struct tgsi_declaration_array array;
> @@ -155,6 +156,15 @@ struct ureg_program
>     } sampler_view[PIPE_MAX_SHADER_SAMPLER_VIEWS];
>     unsigned nr_sampler_views;
>
> +   struct {
> +      unsigned index;
> +      unsigned target;
> +      unsigned format;
> +      boolean wr;
> +      boolean raw;
> +   } image[PIPE_MAX_SHADER_IMAGES];
> +   unsigned nr_images;
> +
>     struct util_bitmask *free_temps;
>     struct util_bitmask *local_temps;
>     struct util_bitmask *decl_temps;
> @@ -648,6 +658,37 @@ ureg_DECL_sampler_view(struct ureg_program *ureg,
>     return reg;
>  }
>
> +/* Allocate a new image.
> + */
> +struct ureg_src
> +ureg_DECL_image(struct ureg_program *ureg,
> +                unsigned index,
> +                unsigned target,
> +                unsigned format,
> +                boolean wr,
> +                boolean raw)
> +{
> +   struct ureg_src reg = ureg_src_register(TGSI_FILE_IMAGE, index);
> +   unsigned i;
> +
> +   for (i = 0; i < ureg->nr_images; i++)
> +      if (ureg->image[i].index == index)
> +         return reg;
> +
> +   if (i < PIPE_MAX_SHADER_IMAGES) {
> +      ureg->image[i].index = index;
> +      ureg->image[i].target = target;
> +      ureg->image[i].wr = wr;
> +      ureg->image[i].raw = raw;
> +      ureg->image[i].format = format;
> +      ureg->nr_images++;
> +      return reg;
> +   }
> +
> +   assert(0);
> +   return reg;
> +}
> +
>  static int
>  match_or_expand_immediate64( const unsigned *v,
>                               int type,
> @@ -1478,6 +1519,33 @@ emit_decl_sampler_view(struct ureg_program *ureg,
>  }
>
>  static void
> +emit_decl_image(struct ureg_program *ureg,
> +                unsigned index,
> +                unsigned target,
> +                unsigned format,
> +                boolean wr,
> +                boolean raw)
> +{
> +   union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 3);
> +
> +   out[0].value = 0;
> +   out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
> +   out[0].decl.NrTokens = 3;
> +   out[0].decl.File = TGSI_FILE_IMAGE;
> +   out[0].decl.UsageMask = 0xf;
> +
> +   out[1].value = 0;
> +   out[1].decl_range.First = index;
> +   out[1].decl_range.Last = index;
> +
> +   out[2].value = 0;
> +   out[2].decl_image.Resource = target;
> +   out[2].decl_image.Writable = wr;
> +   out[2].decl_image.Raw      = raw;
> +   out[2].decl_image.Format   = format;
> +}
> +
> +static void
>  emit_immediate( struct ureg_program *ureg,
>                  const unsigned *v,
>                  unsigned type )
> @@ -1636,6 +1704,15 @@ static void emit_decls( struct ureg_program *ureg )
>                               ureg->sampler_view[i].return_type_w);
>     }
>
> +   for (i = 0; i < ureg->nr_images; i++) {
> +      emit_decl_image(ureg,
> +                      ureg->image[i].index,
> +                      ureg->image[i].target,
> +                      ureg->image[i].format,
> +                      ureg->image[i].wr,
> +                      ureg->image[i].raw);
> +   }
> +
>     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 0aae550..bba2afb 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -327,6 +327,13 @@ ureg_DECL_sampler_view(struct ureg_program *,
>                         unsigned return_type_z,
>                         unsigned return_type_w );
>
> +struct ureg_src
> +ureg_DECL_image(struct ureg_program *ureg,
> +                unsigned index,
> +                unsigned target,
> +                unsigned format,
> +                boolean wr,
> +                boolean raw);
>
>  static inline struct ureg_src
>  ureg_imm4f( struct ureg_program *ureg,
> diff --git a/src/gallium/drivers/ilo/shader/toy_tgsi.c b/src/gallium/drivers/ilo/shader/toy_tgsi.c
> index d38585f..9a7140b 100644
> --- a/src/gallium/drivers/ilo/shader/toy_tgsi.c
> +++ b/src/gallium/drivers/ilo/shader/toy_tgsi.c
> @@ -1593,7 +1593,7 @@ ra_get_type(struct toy_tgsi *tgsi, const struct tgsi_full_instruction *tgsi_inst
>        tgsi_inst->Src[operand].Register.File;
>     switch (file) {
>     case TGSI_FILE_SAMPLER:
> -   case TGSI_FILE_RESOURCE:
> +   case TGSI_FILE_IMAGE:
>     case TGSI_FILE_SAMPLER_VIEW:
>        type = TOY_TYPE_D;
>        break;
> @@ -1834,7 +1834,7 @@ ra_get_src_indirect(struct toy_tgsi *tgsi,
>        src = tsrc_null();
>        break;
>     case TGSI_FILE_SAMPLER:
> -   case TGSI_FILE_RESOURCE:
> +   case TGSI_FILE_IMAGE:
>     case TGSI_FILE_SAMPLER_VIEW:
>        is_resource = true;
>        /* fall through */
> @@ -1918,7 +1918,7 @@ ra_get_src(struct toy_tgsi *tgsi,
>        need_vrf = true;
>        break;
>     case TGSI_FILE_SAMPLER:
> -   case TGSI_FILE_RESOURCE:
> +   case TGSI_FILE_IMAGE:
>     case TGSI_FILE_SAMPLER_VIEW:
>        assert(!s->Register.Dimension);
>        src = tsrc_imm_d(s->Register.Index);
> @@ -2256,7 +2256,7 @@ parse_declaration(struct toy_tgsi *tgsi,
>     case TGSI_FILE_SAMPLER:
>     case TGSI_FILE_PREDICATE:
>     case TGSI_FILE_ADDRESS:
> -   case TGSI_FILE_RESOURCE:
> +   case TGSI_FILE_IMAGE:
>     case TGSI_FILE_SAMPLER_VIEW:
>        /* nothing to do */
>        break;
> 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 beb67fe..87c5dc1 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> @@ -348,7 +348,7 @@ static nv50_ir::DataFile translateFile(uint file)
>     case TGSI_FILE_PREDICATE:       return nv50_ir::FILE_PREDICATE;
>     case TGSI_FILE_IMMEDIATE:       return nv50_ir::FILE_IMMEDIATE;
>     case TGSI_FILE_SYSTEM_VALUE:    return nv50_ir::FILE_SYSTEM_VALUE;
> -   case TGSI_FILE_RESOURCE:        return nv50_ir::FILE_MEMORY_GLOBAL;
> +   //case TGSI_FILE_RESOURCE:        return nv50_ir::FILE_MEMORY_GLOBAL;
>     case TGSI_FILE_SAMPLER:
>     case TGSI_FILE_NULL:
>     default:
> @@ -864,7 +864,7 @@ bool Source::scanSource()
>     clipVertexOutput = -1;
>
>     textureViews.resize(scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1);
> -   resources.resize(scan.file_max[TGSI_FILE_RESOURCE] + 1);
> +   //resources.resize(scan.file_max[TGSI_FILE_RESOURCE] + 1);
>
>     info->immd.bufSize = 0;
>
> @@ -1152,6 +1152,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
>           }
>        }
>        break;
> +/*
>     case TGSI_FILE_RESOURCE:
>        for (i = first; i <= last; ++i) {
>           resources[i].target = decl->Resource.Resource;
> @@ -1159,6 +1160,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
>           resources[i].slot = i;
>        }
>        break;
> +*/
>     case TGSI_FILE_SAMPLER_VIEW:
>        for (i = first; i <= last; ++i)
>           textureViews[i].target = decl->SamplerView.Resource;
> @@ -1224,11 +1226,13 @@ bool Source::scanInstruction(const struct tgsi_full_instruction *inst)
>           if (src.isIndirect(0))
>              mainTempsInLMem = true;
>        } else
> +/*
>        if (src.getFile() == TGSI_FILE_RESOURCE) {
>           if (src.getIndex(0) == TGSI_RESOURCE_GLOBAL)
>              info->io.globalAccess |= (insn.getOpcode() == TGSI_OPCODE_LOAD) ?
>                 0x1 : 0x2;
>        } else
> +*/
>        if (src.getFile() == TGSI_FILE_OUTPUT) {
>           if (src.isIndirect(0)) {
>              // We don't know which one is accessed, just mark everything for
> @@ -1279,9 +1283,11 @@ Instruction::getTexture(const tgsi::Source *code, int s) const
>     unsigned int r;
>
>     switch (getSrc(s).getFile()) {
> +/*
>     case TGSI_FILE_RESOURCE:
>        r = getSrc(s).getIndex(0);
>        return translateTexture(code->resources.at(r).target);
> +*/
>     case TGSI_FILE_SAMPLER_VIEW:
>        r = getSrc(s).getIndex(0);
>        return translateTexture(code->textureViews.at(r).target);
> @@ -1689,7 +1695,7 @@ Converter::acquireDst(int d, int c)
>     const int idx = dst.getIndex(0);
>     const int idx2d = dst.is2D() ? dst.getIndex(1) : 0;
>
> -   if (dst.isMasked(c) || f == TGSI_FILE_RESOURCE)
> +   if (dst.isMasked(c)/* || f == TGSI_FILE_RESOURCE*/)
>        return NULL;
>
>     if (dst.isIndirect(0) ||
> diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
> index c979f4a..a44dbd3 100644
> --- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
> +++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
> @@ -2298,11 +2298,13 @@ emit_vgpu10_declaration(struct svga_shader_emitter_v10 *emit,
>        emit->num_samplers = MAX2(emit->num_samplers, decl->Range.Last + 1);
>        return TRUE;
>
> +#if 0
>     case TGSI_FILE_RESOURCE:
>        /*opcode0.opcodeType = VGPU10_OPCODE_DCL_RESOURCE;*/
>        /* XXX more, VGPU10_RETURN_TYPE_FLOAT */
>        assert(!"TGSI_FILE_RESOURCE not handled yet");
>        return FALSE;
> +#endif
>
>     case TGSI_FILE_ADDRESS:
>        emit->num_address_regs = MAX2(emit->num_address_regs,
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index e8f4ad2..d182962 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -76,7 +76,7 @@ enum tgsi_file_type {
>     TGSI_FILE_IMMEDIATE           =7,
>     TGSI_FILE_PREDICATE           =8,
>     TGSI_FILE_SYSTEM_VALUE        =9,
> -   TGSI_FILE_RESOURCE            =10,
> +   TGSI_FILE_IMAGE               =10,
>     TGSI_FILE_SAMPLER_VIEW        =11,
>     TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
>  };
> @@ -197,11 +197,12 @@ struct tgsi_declaration_semantic
>     unsigned Padding        : 8;
>  };
>
> -struct tgsi_declaration_resource {
> +struct tgsi_declaration_image {
>     unsigned Resource    : 8; /**< one of TGSI_TEXTURE_ */
>     unsigned Raw         : 1;
>     unsigned Writable    : 1;
> -   unsigned Padding     : 22;
> +   unsigned Format      : 10; /**< one of PIPE_FORMAT_ */
> +   unsigned Padding     : 12;
>  };
>
>  enum tgsi_return_type {
> --
> 2.4.10
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list