[Mesa-dev] [PATCH 1/2] gallium: add support for clip distances

Brian Paul brianp at vmware.com
Mon Dec 19 07:11:25 PST 2011


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



More information about the mesa-dev mailing list