gallium: add a cull distance semantic
authorZack Rusin <zackr@vmware.com>
Thu, 6 Jun 2013 13:04:11 +0000 (09:04 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 11 Jun 2013 02:04:28 +0000 (22:04 -0400)
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 <zackr@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/tgsi/tgsi_scan.c
src/gallium/auxiliary/tgsi/tgsi_scan.h
src/gallium/auxiliary/tgsi/tgsi_strings.c
src/gallium/docs/source/tgsi.rst
src/gallium/include/pipe/p_shader_tokens.h

index 872e4ff3a4bd6941e297fed84d599d3503c396f8..2a37b38d3c75cd136003f27c4d7a324ba39318a2 100644 (file)
@@ -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)
index a5b70244bd7dd45c6d9f76092fde29d8f2e3c21c..91eef67ca0bfd972366a946e7909f5160d07703e 100644 (file)
@@ -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
index 27856767877e268ec6e3bce6f7e9150502e87074..6f244e5142f12b62d6f4e9384daaa9d636bf3b99 100644 (file)
@@ -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] =
index 926527151c43a314b22a10667cb619a75e88bc91..f3aebb3b317fbcad5c2ca66e19fa585edebb8058 100644 (file)
@@ -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
 ^^^^^^^^^^^^^^^^^^^^^^^
index c984d50abe96e1765e95d46760fe62bb9354923d..4a6a57fef1115cda4804054908b58842021bafcd 100644 (file)
@@ -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
 {