I assume this is going to replace the old RES stuff?

On 01/03/2016 05:37 AM, Ilia Mirkin wrote:
Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu>
---
  src/gallium/auxiliary/tgsi/tgsi_dump.c     |  5 +++
  src/gallium/auxiliary/tgsi/tgsi_strings.c  |  1 +
  src/gallium/auxiliary/tgsi/tgsi_text.c     |  5 +++
  src/gallium/auxiliary/tgsi/tgsi_ureg.c     | 52 ++++++++++++++++++++++++++++++
  src/gallium/auxiliary/tgsi/tgsi_ureg.h     |  3 ++
  src/gallium/include/pipe/p_shader_tokens.h |  4 ++-
  6 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c 
b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index dad3839..de3aae5 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -359,6 +359,11 @@ iter_declaration(
           TXT(", RAW");
     }

+   if (decl->Declaration.File == TGSI_FILE_BUFFER) {
+      if (decl->Declaration.Atomic)
+         TXT(", ATOMIC");
+   }
+
     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 ae30399..c0dd044 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
@@ -56,6 +56,7 @@ static const char *tgsi_file_names[] =
     "SV",
     "IMAGE",
     "SVIEW",
+   "BUFFER",
  };

  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 a45ab90..d72d843 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -1350,6 +1350,11 @@ static boolean parse_declaration( struct translate_ctx 
*ctx )
                 decl.SamplerView.ReturnTypeX;
           }
           ctx->cur = cur;
+      } else if (file == TGSI_FILE_BUFFER) {
+         if (str_match_nocase_whole(&cur, "ATOMIC")) {
+            decl.Declaration.Atomic = 1;
+            ctx->cur = cur;
+         }
        } else {
           if (str_match_nocase_whole(&cur, "LOCAL")) {
              decl.Declaration.Local = 1;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index ee23df9..6d5092b 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -165,6 +165,12 @@ struct ureg_program
     } image[PIPE_MAX_SHADER_IMAGES];
     unsigned nr_images;

+   struct {
+      unsigned index;
+      bool atomic;
+   } buffer[PIPE_MAX_SHADER_BUFFERS];
+   unsigned nr_buffers;
+
     struct util_bitmask *free_temps;
     struct util_bitmask *local_temps;
     struct util_bitmask *decl_temps;
@@ -689,6 +695,29 @@ ureg_DECL_image(struct ureg_program *ureg,
     return reg;
  }

+/* Allocate a new buffer.
+ */
+struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr,
+                                 bool atomic)
+{
+   struct ureg_src reg = ureg_src_register(TGSI_FILE_BUFFER, nr);
+   unsigned i;
+
+   for (i = 0; i < ureg->nr_buffers; i++)
+      if (ureg->buffer[i].index == nr)
+         return reg;
+
+   if (i < PIPE_MAX_SHADER_BUFFERS) {
+      ureg->buffer[i].index = nr;
+      ureg->buffer[i].atomic = atomic;
+      ureg->nr_buffers++;
+      return reg;
+   }
+
+   assert(0);
+   return reg;
+}
+
  static int
  match_or_expand_immediate64( const unsigned *v,
                               int type,
@@ -1546,6 +1575,25 @@ emit_decl_image(struct ureg_program *ureg,
  }

  static void
+emit_decl_buffer(struct ureg_program *ureg,
+                 unsigned index,
+                 bool atomic)
+{
+   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_BUFFER;
+   out[0].decl.UsageMask = 0xf;
+   out[0].decl.Atomic = atomic;
+
+   out[1].value = 0;
+   out[1].decl_range.First = index;
+   out[1].decl_range.Last = index;
+}
+
+static void
  emit_immediate( struct ureg_program *ureg,
                  const unsigned *v,
                  unsigned type )
@@ -1713,6 +1761,10 @@ static void emit_decls( struct ureg_program *ureg )
                        ureg->image[i].raw);
     }

+   for (i = 0; i < ureg->nr_buffers; i++) {
+      emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic);
+   }
+
     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 bba2afb..e25c961 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -335,6 +335,9 @@ ureg_DECL_image(struct ureg_program *ureg,
                  boolean wr,
                  boolean raw);

+struct ureg_src
+ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic);
+
  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 d182962..815aff1 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -78,6 +78,7 @@ enum tgsi_file_type {
     TGSI_FILE_SYSTEM_VALUE        =9,
     TGSI_FILE_IMAGE               =10,
     TGSI_FILE_SAMPLER_VIEW        =11,
+   TGSI_FILE_BUFFER              =12,
     TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
  };

@@ -127,7 +128,8 @@ struct tgsi_declaration
     unsigned Invariant   : 1;  /**< invariant optimization? */
     unsigned Local       : 1;  /**< optimize as subroutine local variable? */
     unsigned Array       : 1;  /**< extra array info? */
-   unsigned Padding     : 6;
+   unsigned Atomic      : 1;  /**< atomic only? for TGSI_FILE_BUFFER */
+   unsigned Padding     : 5;
  };

  struct tgsi_declaration_range

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

Reply via email to