On 01/03/2016 05:37 AM, Ilia Mirkin wrote:
Signed-off-by: Ilia Mirkin <imir...@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",
  };

You forgot to update src/gallium/tests/trivial/compute.c, and so you did break all of those compute tests. Please don't break them because they are useful for people which work on compute. :-)


  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;

You definitely break global ressources here. What is your plan for that? Are you going to fix them in upcoming patches?

-Samuel.

     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 {

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to