From: Roland Scheidegger Date: Fri, 12 Dec 2014 03:13:43 +0000 (+0100) Subject: gallium: add TGSI_SEMANTIC_VERTEXID_NOBASE and TGSI_SEMANTIC_BASEVERTEX X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ade8b26bf515fa4f0cbf43e9df4885368e984277;p=mesa.git gallium: add TGSI_SEMANTIC_VERTEXID_NOBASE and TGSI_SEMANTIC_BASEVERTEX 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 Reviewed-by: Jose Fonseca Reviewed-by: Marek Olšák --- diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 649c327d9c9..eb313e430d6 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -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; } diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index 61ce81342a4..375f75a3b98 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -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; diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c index 01fa5a9f345..bd975448773 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c @@ -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] = diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index e711ad40bef..55d114c829f 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -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: diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst index cbb8f74ab89..ff322e864ec 100644 --- a/src/gallium/docs/source/tgsi.rst +++ b/src/gallium/docs/source/tgsi.rst @@ -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 ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 19379a8b024..084a0ec4e2a 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -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: diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index 1c604998ce9..1277de313be 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -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: diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c index 06aa9739814..0c948f4dcd3 100644 --- a/src/gallium/drivers/ilo/ilo_screen.c +++ b/src/gallium/drivers/ilo/ilo_screen.c @@ -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; diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 6af43ccf581..0e4456adc70 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -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); diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 2b65f8cdaa0..46c21a1cfe1 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -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: diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index fcf00982cb8..5c1a21d2731 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -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: diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index e653eab184e..f82010d7667 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -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. */ diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 0b571e45e9b..b6f785976ce 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -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. */ diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 8fc5c19dfd7..afb6364a776 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -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: diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 57cd9b632df..8efc88fc2b7 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -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); diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index 691d9df63c6..32578c849e2 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -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; diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index 3d5370b4764..f42e0228aab 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -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. */ diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 8c4e415607a..6c5703ad46f 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -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) diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index 98f0670f592..442b67b79c9 100644 --- a/src/gallium/include/pipe/p_shader_tokens.h +++ b/src/gallium/include/pipe/p_shader_tokens.h @@ -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 {