From 6951870e5790a4b563bfa3b943ed338f9c5922ac Mon Sep 17 00:00:00 2001 From: Bryan Cain Date: Mon, 2 Jan 2012 14:48:47 -0600 Subject: [PATCH] gallium: add support for clip distances --- src/gallium/auxiliary/tgsi/tgsi_strings.c | 3 +- src/gallium/auxiliary/tgsi/tgsi_ureg.c | 38 +++++++++++++++++----- src/gallium/auxiliary/tgsi/tgsi_ureg.h | 6 ++++ src/gallium/include/pipe/p_shader_tokens.h | 3 +- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c index ee4ce080cbe..9516095bd8b 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c @@ -70,7 +70,8 @@ const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] = "PRIM_ID", "INSTANCEID", "VERTEXID", - "STENCIL" + "STENCIL", + "CLIPDIST" }; const char *tgsi_texture_names[TGSI_TEXTURE_COUNT] = diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 17f9ce25227..0f9aa3ab43a 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; /* = TGSI_WRITEMASK_* */ } output[UREG_MAX_OUTPUT]; unsigned nr_outputs; @@ -396,21 +397,27 @@ 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; + assert(usage_mask != 0); + 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 +429,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 +1197,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); @@ -1189,7 +1206,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 +1444,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 +1454,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 +1463,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 bf55d54e543..07ab8cba0ba 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -228,6 +228,12 @@ ureg_DECL_system_value(struct ureg_program *, unsigned semantic_name, 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, diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index 10cfaf69ade..330e0ba74cd 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 { -- 2.30.2