[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