From 3d08eada3450aa8801aed194afea99c816dd71f0 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Thu, 6 Jun 2013 09:04:11 -0400 Subject: [PATCH] gallium: add a cull distance semantic cull distance is analogous to clip distance. If a register is given this semantic, then the values in it are assumed to be a float32 distance to a plane. Primitives will be completely discarded if the plane distance for all of the vertices in the primitive are < 0. Signed-off-by: Zack Rusin Reviewed-by: Jose Fonseca Reviewed-by: Brian Paul Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 4 ++++ src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 + src/gallium/auxiliary/tgsi/tgsi_strings.c | 3 ++- src/gallium/docs/source/tgsi.rst | 11 +++++++++++ src/gallium/include/pipe/p_shader_tokens.h | 3 ++- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 872e4ff3a4b..2a37b38d3c7 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -200,6 +200,10 @@ tgsi_scan_shader(const struct tgsi_token *tokens, fulldecl->Semantic.Name == TGSI_SEMANTIC_CLIPDIST) { info->num_written_clipdistance += util_bitcount(fulldecl->Declaration.UsageMask); } + if ((procType == TGSI_PROCESSOR_VERTEX || procType == TGSI_PROCESSOR_GEOMETRY) && + fulldecl->Semantic.Name == TGSI_SEMANTIC_CULLDIST) { + info->num_written_culldistance += util_bitcount(fulldecl->Declaration.UsageMask); + } /* extra info for special outputs */ if (procType == TGSI_PROCESSOR_FRAGMENT && fulldecl->Semantic.Name == TGSI_SEMANTIC_POSITION) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index a5b70244bd7..91eef67ca0b 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -78,6 +78,7 @@ struct tgsi_shader_info boolean writes_viewport_index; boolean writes_layer; + unsigned num_written_culldistance; unsigned num_written_clipdistance; /** * Bitmask indicating which register files are accessed with diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c index 27856767877..6f244e5142f 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c @@ -80,7 +80,8 @@ const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] = "TEXCOORD", "PCOORD", "VIEWPORT_INDEX", - "LAYER" + "LAYER", + "CULLDIST" }; const char *tgsi_texture_names[TGSI_TEXTURE_COUNT] = diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst index 926527151c4..f3aebb3b317 100644 --- a/src/gallium/docs/source/tgsi.rst +++ b/src/gallium/docs/source/tgsi.rst @@ -2425,6 +2425,17 @@ contains the layer value to use for the color and depth/stencil surfaces. Only the X value is used. (Also known as rendertarget array index.) +TGSI_SEMANTIC_CULLDIST +"""""""""""""""""""""" + +Used as distance to plane for performing application-defined culling +of individual primitives against a plane. When components of vertex +elements are given this label, these values are assumed to be a +float32 signed distance to a plane. Primitives will be completely +discarded if the plane distance for all of the vertices in the +primitive are < 0. If a vertex has a cull distance of NaN, that +vertex counts as "out" (as if its < 0); + Declaration Interpolate ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index c984d50abe9..4a6a57fef11 100644 --- a/src/gallium/include/pipe/p_shader_tokens.h +++ b/src/gallium/include/pipe/p_shader_tokens.h @@ -166,7 +166,8 @@ struct tgsi_declaration_interp #define TGSI_SEMANTIC_PCOORD 20 /**< point sprite coordinate */ #define TGSI_SEMANTIC_VIEWPORT_INDEX 21 /**< viewport index */ #define TGSI_SEMANTIC_LAYER 22 /**< layer (rendertarget index) */ -#define TGSI_SEMANTIC_COUNT 23 /**< number of semantic values */ +#define TGSI_SEMANTIC_CULLDIST 23 +#define TGSI_SEMANTIC_COUNT 24 /**< number of semantic values */ struct tgsi_declaration_semantic { -- 2.11.0