gallium: add TGSI_SEMANTIC_VERTEXID_NOBASE and TGSI_SEMANTIC_BASEVERTEX
authorRoland Scheidegger <sroland@vmware.com>
Fri, 12 Dec 2014 03:13:43 +0000 (04:13 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 16 Dec 2014 03:23:00 +0000 (04:23 +0100)
Plus a new PIPE_CAP_VERTEXID_NOBASE query. The idea is that drivers not
supporting vertex ids with base vertex offset applied (so, only support
d3d10-style vertex ids) will get such a d3d10-style vertex id instead -
with the caveat they'll also need to handle the basevertex system value
too (this follows what core mesa already does).
Additionally, this is also useful for other state trackers (for instance
llvmpipe / draw right now implement the d3d10 behavior on purpose, but
with different semantics it can just do both).
Doesn't do anything yet.
And fix up the docs wrt similar values.

v2: incorporate feedback from Brian and others, better names, better docs.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
19 files changed:
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/screen.rst
src/gallium/docs/source/tgsi.rst
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/ilo/ilo_screen.c
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/nouveau/nv30/nv30_screen.c
src/gallium/drivers/nouveau/nv50/nv50_screen.c
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/vc4/vc4_screen.c
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_shader_tokens.h

index 649c327d9c9daa5591e0b0108d4911b174092c73..eb313e430d62b3d6ad7460e10fdc0099078092b0 100644 (file)
@@ -213,6 +213,12 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
                   else if (semName == TGSI_SEMANTIC_VERTEXID) {
                      info->uses_vertexid = TRUE;
                   }
+                  else if (semName == TGSI_SEMANTIC_VERTEXID_NOBASE) {
+                     info->uses_vertexid_nobase = TRUE;
+                  }
+                  else if (semName == TGSI_SEMANTIC_BASEVERTEX) {
+                     info->uses_basevertex = TRUE;
+                  }
                   else if (semName == TGSI_SEMANTIC_PRIMID) {
                      info->uses_primid = TRUE;
                   }
index 61ce81342a48b646dbfd7be8763fac958dfd1c1f..375f75a3b983d9270ee2bc592c4e7c2fcf14c3c1 100644 (file)
@@ -74,6 +74,8 @@ struct tgsi_shader_info
    boolean uses_kill;  /**< KILL or KILL_IF instruction used? */
    boolean uses_instanceid;
    boolean uses_vertexid;
+   boolean uses_vertexid_nobase;
+   boolean uses_basevertex;
    boolean uses_primid;
    boolean uses_frontface;
    boolean writes_psize;
index 01fa5a9f3453d221cd64419c14ae0fc54658d30f..bd9754487737f589416da6ab96c9554d38615a50 100644 (file)
@@ -86,6 +86,8 @@ const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
    "SAMPLEPOS",
    "SAMPLEMASK",
    "INVOCATIONID",
+   "VERTEXID_NOBASE",
+   "BASEVERTEX",
 };
 
 const char *tgsi_texture_names[TGSI_TEXTURE_COUNT] =
index e711ad40befdd308d3d6f90e9661a38216c14a13..55d114c829fc878338c46e446f4b48de7f2ed286 100644 (file)
@@ -233,6 +233,14 @@ The integer capabilities:
 * ``PIPE_CAP_CLIP_HALFZ``: Whether the driver supports the
   pipe_rasterizer_state::clip_halfz being set to true. This is required
   for enabling ARB_clip_control.
+* ``PIPE_CAP_VERTEXID_NOBASE``: If true, the driver only supports
+  TGSI_SEMANTIC_VERTEXID_NOBASE (and not TGSI_SEMANTIC_VERTEXID). This means
+  state trackers for APIs whose vertexIDs are offset by basevertex (such as GL)
+  will need to lower TGSI_SEMANTIC_VERTEXID to TGSI_SEMANTIC_VERTEXID_NOBASE
+  and TGSI_SEMANTIC_BASEVERTEX, so drivers setting this must handle both these
+  semantics. Only relevant if geometry shaders are supported.
+  (Currently not possible to query availability of these two semantics outside
+  this, at least BASEVERTEX should be exposed separately too).
 
 
 .. _pipe_capf:
index cbb8f74ab895a18d64ca46bcce74f928d4e2a467..ff322e864ecd38e83f5c96e68e54eb0257b07455 100644 (file)
@@ -2651,7 +2651,7 @@ TGSI_SEMANTIC_VIEWPORT_INDEX
 
 For geometry shaders, this semantic label indicates that an output
 contains the index of the viewport (and scissor) to use.
-Only the X value is used.
+This is an integer value, and only the X component is used.
 
 
 TGSI_SEMANTIC_LAYER
@@ -2659,7 +2659,8 @@ TGSI_SEMANTIC_LAYER
 
 For geometry shaders, this semantic label indicates that an output
 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.)
+This is an integer value, and only the X component is used.
+(Also known as rendertarget array index.)
 
 
 TGSI_SEMANTIC_CULLDIST
@@ -2700,7 +2701,8 @@ TGSI_SEMANTIC_SAMPLEID
 """"""""""""""""""""""
 
 For fragment shaders, this semantic label indicates that a system value
-contains the current sample id (i.e. gl_SampleID). Only the X value is used.
+contains the current sample id (i.e. gl_SampleID).
+This is an integer value, and only the X component is used.
 
 TGSI_SEMANTIC_SAMPLEPOS
 """""""""""""""""""""""
@@ -2720,8 +2722,48 @@ TGSI_SEMANTIC_INVOCATIONID
 """"""""""""""""""""""""""
 
 For geometry shaders, this semantic label indicates that a system value
-contains the current invocation id (i.e. gl_InvocationID). Only the X value is
-used.
+contains the current invocation id (i.e. gl_InvocationID).
+This is an integer value, and only the X component is used.
+
+TGSI_SEMANTIC_INSTANCEID
+""""""""""""""""""""""""
+
+For vertex shaders, this semantic label indicates that a system value contains
+the current instance id (i.e. gl_InstanceID). It does not include the base
+instance. This is an integer value, and only the X component is used.
+
+TGSI_SEMANTIC_VERTEXID
+""""""""""""""""""""""
+
+For vertex shaders, this semantic label indicates that a system value contains
+the current vertex id (i.e. gl_VertexID). It does (unlike in d3d10) include the
+base vertex. This is an integer value, and only the X component is used.
+
+TGSI_SEMANTIC_VERTEXID_NOBASE
+"""""""""""""""""""""""""""""""
+
+For vertex shaders, this semantic label indicates that a system value contains
+the current vertex id without including the base vertex (this corresponds to
+d3d10 vertex id, so TGSI_SEMANTIC_VERTEXID_NOBASE + TGSI_SEMANTIC_BASEVERTEX
+== TGSI_SEMANTIC_VERTEXID). This is an integer value, and only the X component
+is used.
+
+TGSI_SEMANTIC_BASEVERTEX
+""""""""""""""""""""""""
+
+For vertex shaders, this semantic label indicates that a system value contains
+the base vertex (i.e. gl_BaseVertex). Note that for non-indexed draw calls,
+this contains the first (or start) value instead.
+This is an integer value, and only the X component is used.
+
+TGSI_SEMANTIC_PRIMID
+""""""""""""""""""""
+
+For geometry and fragment shaders, this semantic label indicates the value
+contains the primitive id (i.e. gl_PrimitiveID). This is an integer value,
+and only the X component is used.
+FIXME: This right now can be either a ordinary input or a system value...
+
 
 Declaration Interpolate
 ^^^^^^^^^^^^^^^^^^^^^^^
index 19379a8b02418c7838335b3f68a4835ffd470d68..084a0ec4e2a13cbf041a7038dc711d073f528954 100644 (file)
@@ -228,6 +228,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
        case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
        case PIPE_CAP_SAMPLER_VIEW_TARGET:
        case PIPE_CAP_CLIP_HALFZ:
+       case PIPE_CAP_VERTEXID_NOBASE:
                return 0;
 
        case PIPE_CAP_MAX_VIEWPORTS:
index 1c604998ce9a64be34c738af8c7919972d1e8f18..1277de313be45ae541b43b69517b7ddcb2999ed7 100644 (file)
@@ -226,6 +226,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
    case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
    case PIPE_CAP_CLIP_HALFZ:
+   case PIPE_CAP_VERTEXID_NOBASE:
       return 0;
 
    case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
index 06aa9739814239b717c9a1479b603142cd2e748c..0c948f4dcd3aada6ecd87396c56f4d11e5c80f84 100644 (file)
@@ -495,6 +495,8 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return true;
    case PIPE_CAP_CLIP_HALFZ:
       return true;
+   case PIPE_CAP_VERTEXID_NOBASE:
+      return false;
 
    default:
       return 0;
index 6af43ccf58135ee456d610e92819d63b5a2b3122..0e4456adc702c2e2e5fa2893d365941b97e40f76 100644 (file)
@@ -282,6 +282,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return 0;
    case PIPE_CAP_CLIP_HALFZ:
       return 1;
+   case PIPE_CAP_VERTEXID_NOBASE:
+      return 0;
    }
    /* should only get here on unhandled cases */
    debug_printf("Unexpected PIPE_CAP %d query\n", param);
index 2b65f8cdaa0c9203c85422c3ce8c4753af97d1b7..46c21a1cfe1b8fe61dc12b26c9bf82e35d87e854 100644 (file)
@@ -157,6 +157,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
    case PIPE_CAP_SAMPLER_VIEW_TARGET:
    case PIPE_CAP_CLIP_HALFZ:
+   case PIPE_CAP_VERTEXID_NOBASE:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index fcf00982cb83eefcfe67f177a00174729ae77941..5c1a21d2731c82f207c1d1a763871678fa0e8be2 100644 (file)
@@ -205,6 +205,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
    case PIPE_CAP_COMPUTE:
    case PIPE_CAP_DRAW_INDIRECT:
+   case PIPE_CAP_VERTEXID_NOBASE:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index e653eab184edaa08e575e0253ae8e92060c1f96d..f82010d766794a38f13c5c133cb8e7853ccb8428 100644 (file)
@@ -181,6 +181,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
         case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
         case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
         case PIPE_CAP_SAMPLER_VIEW_TARGET:
+        case PIPE_CAP_VERTEXID_NOBASE:
             return 0;
 
         /* SWTCL-only features. */
index 0b571e45e9b711baef5dd73558d58db8612f3740..b6f785976cedc8ab83f4e6192c262d2d4b590602 100644 (file)
@@ -325,6 +325,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_DRAW_INDIRECT:
        case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
        case PIPE_CAP_SAMPLER_VIEW_TARGET:
+       case PIPE_CAP_VERTEXID_NOBASE:
                return 0;
 
        /* Stream output. */
index 8fc5c19dfd766d076fe03a778eeddf32f2b20079..afb6364a776b3f31ae4c8fbe89c1e3c7bcb459d5 100644 (file)
@@ -253,6 +253,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
        case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
        case PIPE_CAP_SAMPLER_VIEW_TARGET:
+       case PIPE_CAP_VERTEXID_NOBASE:
                return 0;
 
        case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
index 57cd9b632df7426aac645df9880260ef3d8e2062..8efc88fc2b7f708579f96444464017e6d003a14d 100644 (file)
@@ -231,6 +231,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_CLIP_HALFZ:
       return 1;
+   case PIPE_CAP_VERTEXID_NOBASE:
+      return 0;
    }
    /* should only get here on unhandled cases */
    debug_printf("Unexpected PIPE_CAP %d query\n", param);
index 691d9df63c63e5b85205a6cd8e41556746c7d532..32578c849e2b99e61422b483bc48ca9e6998057e 100644 (file)
@@ -282,6 +282,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
    case PIPE_CAP_SAMPLER_VIEW_TARGET:
    case PIPE_CAP_CLIP_HALFZ:
+   case PIPE_CAP_VERTEXID_NOBASE:
       return 0;
    case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
       return 64;
index 3d5370b4764f3628ac1f454e41bb00e4723bc4ff..f42e0228aab091104741062d28a086660d14a479 100644 (file)
@@ -168,6 +168,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
         case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
         case PIPE_CAP_SAMPLER_VIEW_TARGET:
         case PIPE_CAP_CLIP_HALFZ:
+        case PIPE_CAP_VERTEXID_NOBASE:
                 return 0;
 
                 /* Stream output. */
index 8c4e415607ab521b78acbaba7a464b6d99927ea1..6c5703ad46fe42056c9207b8804d51874be620bc 100644 (file)
@@ -572,6 +572,7 @@ enum pipe_cap {
    PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE = 109,
    PIPE_CAP_SAMPLER_VIEW_TARGET = 110,
    PIPE_CAP_CLIP_HALFZ = 111,
+   PIPE_CAP_VERTEXID_NOBASE,
 };
 
 #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
index 98f0670f592736a8ead280897b72b172ecbf98dd..442b67b79c9e4314c097d20f76d4c0f5d17cb2ea 100644 (file)
@@ -176,7 +176,9 @@ struct tgsi_declaration_interp
 #define TGSI_SEMANTIC_SAMPLEPOS  25
 #define TGSI_SEMANTIC_SAMPLEMASK 26
 #define TGSI_SEMANTIC_INVOCATIONID 27
-#define TGSI_SEMANTIC_COUNT      28 /**< number of semantic values */
+#define TGSI_SEMANTIC_VERTEXID_NOBASE 28
+#define TGSI_SEMANTIC_BASEVERTEX 29
+#define TGSI_SEMANTIC_COUNT      30 /**< number of semantic values */
 
 struct tgsi_declaration_semantic
 {