On 12/17/2011 03:15 PM, Bryan Cain wrote:
---
  src/gallium/auxiliary/tgsi/tgsi_dump.c     |    3 +-
  src/gallium/auxiliary/tgsi/tgsi_text.c     |    3 +-
  src/gallium/auxiliary/tgsi/tgsi_ureg.c     |   36 +++++++++++++++++++++-------
  src/gallium/auxiliary/tgsi/tgsi_ureg.h     |    6 ++++
  src/gallium/include/pipe/p_shader_tokens.h |    3 +-
  5 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c 
b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index e830aa5..bd299b0 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -129,7 +129,8 @@ static const char *semantic_names[] =
     "PRIM_ID",
     "INSTANCEID",
     "VERTEXID",
-   "STENCIL"
+   "STENCIL",
+   "CLIPDIST"
  };

  static const char *immediate_type_names[] =
diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c 
b/src/gallium/auxiliary/tgsi/tgsi_text.c
index eb9190c..f46ba19 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -1024,7 +1024,8 @@ static const char *semantic_names[TGSI_SEMANTIC_COUNT] =
     "PRIM_ID",
     "INSTANCEID",
     "VERTEXID",
-   "STENCIL"
+   "STENCIL",
+   "CLIPDIST"
  };


Just FYI: it looks like semantic_names[] and interplate_names[] (and possibly) other arrays like that are duplicated in at least two tgsi files.

It would be nice if someone could move those to a shared header. Also, use STATIC_ASSERT() to check that there's enough entries in the arrays.


  static const char *interpolate_names[TGSI_INTERPOLATE_COUNT] =
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index 17f9ce2..56c4492 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -122,6 +122,7 @@ struct ureg_program
     struct {
        unsigned semantic_name;
        unsigned semantic_index;
+      unsigned usage_mask;

Maybe add a comment indicating that the values are TGSI_WRITEMASK_*


     } output[UREG_MAX_OUTPUT];
     unsigned nr_outputs;

@@ -396,21 +397,25 @@ ureg_DECL_system_value(struct ureg_program *ureg,


  struct ureg_dst
-ureg_DECL_output( struct ureg_program *ureg,
-                  unsigned name,
-                  unsigned index )
+ureg_DECL_output_masked( struct ureg_program *ureg,
+                         unsigned name,
+                         unsigned index,
+                         unsigned usage_mask )
  {
     unsigned i;

I think we could assert that usage_mask != 0, right? A while back I found a bug in st_glsl_to_tgsi.cpp where we had a writemask=0. It took quite a while to find it so an assertion like this could be good.


     for (i = 0; i<  ureg->nr_outputs; i++) {
        if (ureg->output[i].semantic_name == name&&
-          ureg->output[i].semantic_index == index)
+          ureg->output[i].semantic_index == index) {
+         ureg->output[i].usage_mask |= usage_mask;
           goto out;
+      }
     }

     if (ureg->nr_outputs<  UREG_MAX_OUTPUT) {
        ureg->output[i].semantic_name = name;
        ureg->output[i].semantic_index = index;
+      ureg->output[i].usage_mask = usage_mask;
        ureg->nr_outputs++;
     }
     else {
@@ -422,6 +427,15 @@ out:
  }


+struct ureg_dst
+ureg_DECL_output( struct ureg_program *ureg,
+                  unsigned name,
+                  unsigned index )
+{
+   return ureg_DECL_output_masked(ureg, name, index, TGSI_WRITEMASK_XYZW);
+}
+
+
  /* Returns a new constant register.  Keep track of which have been
   * referred to so that we can emit decls later.
   *
@@ -1181,7 +1195,8 @@ emit_decl_semantic(struct ureg_program *ureg,
                     unsigned file,
                     unsigned index,
                     unsigned semantic_name,
-                   unsigned semantic_index)
+                   unsigned semantic_index,
+                   unsigned usage_mask)
  {
     union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 3);

assert(usage_mask != 0)?


@@ -1189,7 +1204,7 @@ emit_decl_semantic(struct ureg_program *ureg,
     out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
     out[0].decl.NrTokens = 3;
     out[0].decl.File = file;
-   out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW; /* FIXME! */
+   out[0].decl.UsageMask = usage_mask;
     out[0].decl.Semantic = 1;

     out[1].value = 0;
@@ -1427,7 +1442,8 @@ static void emit_decls( struct ureg_program *ureg )
                              TGSI_FILE_INPUT,
                              ureg->gs_input[i].index,
                              ureg->gs_input[i].semantic_name,
-                            ureg->gs_input[i].semantic_index);
+                            ureg->gs_input[i].semantic_index,
+                            TGSI_WRITEMASK_XYZW);
        }
     }

@@ -1436,7 +1452,8 @@ static void emit_decls( struct ureg_program *ureg )
                           TGSI_FILE_SYSTEM_VALUE,
                           ureg->system_value[i].index,
                           ureg->system_value[i].semantic_name,
-                         ureg->system_value[i].semantic_index);
+                         ureg->system_value[i].semantic_index,
+                         TGSI_WRITEMASK_XYZW);
     }

     for (i = 0; i<  ureg->nr_outputs; i++) {
@@ -1444,7 +1461,8 @@ static void emit_decls( struct ureg_program *ureg )
                           TGSI_FILE_OUTPUT,
                           i,
                           ureg->output[i].semantic_name,
-                         ureg->output[i].semantic_index);
+                         ureg->output[i].semantic_index,
+                         ureg->output[i].usage_mask);
     }

     for (i = 0; i<  ureg->nr_samplers; i++) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index bf55d54..07ab8cb 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -229,6 +229,12 @@ ureg_DECL_system_value(struct ureg_program *,
                         unsigned semantic_index);

  struct ureg_dst
+ureg_DECL_output_masked( struct ureg_program *,
+                         unsigned semantic_name,
+                         unsigned semantic_index,
+                         unsigned usage_mask );
+
+struct ureg_dst
  ureg_DECL_output( struct ureg_program *,
                    unsigned semantic_name,
                    unsigned semantic_index );
diff --git a/src/gallium/include/pipe/p_shader_tokens.h 
b/src/gallium/include/pipe/p_shader_tokens.h
index 10cfaf6..330e0ba 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -146,7 +146,8 @@ struct tgsi_declaration_dimension
  #define TGSI_SEMANTIC_INSTANCEID 10
  #define TGSI_SEMANTIC_VERTEXID   11
  #define TGSI_SEMANTIC_STENCIL    12
-#define TGSI_SEMANTIC_COUNT      13 /**<  number of semantic values */
+#define TGSI_SEMANTIC_CLIPDIST   13
+#define TGSI_SEMANTIC_COUNT      14 /**<  number of semantic values */

  struct tgsi_declaration_semantic
  {

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

Reply via email to