summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBryan Cain <bryancain3@gmail.com>2012-01-02 14:48:47 -0600
committerBryan Cain <bryancain3@gmail.com>2012-01-05 13:03:25 -0600
commit6951870e5790a4b563bfa3b943ed338f9c5922ac (patch)
tree68d750d017428585b8304dde77a7c18c06b0e657 /src
parentf82d40d4b1aa60364c03c32578ecd675d4d86dcf (diff)
gallium: add support for clip distances
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_strings.c3
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.c38
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.h6
-rw-r--r--src/gallium/include/pipe/p_shader_tokens.h3
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
@@ -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 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
{