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

eocallaghan at alterapraxis.com eocallaghan at alterapraxis.com
Sat Jan 2 23:33:06 PST 2016


There is quite a bit of rename churn happening here at the same time as 
the bring up of ureg support for image declarations.
Would it be possible to split the rename churn out from the actual 
behavioral changes please?

On 2016-01-03 15:37, Ilia Mirkin 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 +-
>  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 */

Something more meaningful here perhaps?

> +
>           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 {



More information about the mesa-dev mailing list