[Mesa-dev] [PATCH 1/3] gallium: add TGSI_SEMANTIC_VERTEXID_ZEROBASE and TGSI_SEMANTIC_BASEVERTEX

Marek Olšák maraeo at gmail.com
Wed Dec 10 13:37:44 PST 2014


On Wed, Dec 10, 2014 at 10:22 PM,  <sroland at vmware.com> wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Plus a new PIPE_CAP_VERTEXID_NOOFFSET 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.
> ---
>  src/gallium/auxiliary/tgsi/tgsi_scan.c           |  6 ++++
>  src/gallium/auxiliary/tgsi/tgsi_scan.h           |  2 ++
>  src/gallium/auxiliary/tgsi/tgsi_strings.c        |  2 ++
>  src/gallium/docs/source/screen.rst               |  6 ++++
>  src/gallium/docs/source/tgsi.rst                 | 36 ++++++++++++++++++++++++
>  src/gallium/drivers/freedreno/freedreno_screen.c |  1 +
>  src/gallium/drivers/i915/i915_screen.c           |  1 +
>  src/gallium/drivers/ilo/ilo_screen.c             |  2 ++
>  src/gallium/drivers/llvmpipe/lp_screen.c         |  2 ++
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   |  1 +
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   |  1 +
>  src/gallium/drivers/r300/r300_screen.c           |  1 +
>  src/gallium/drivers/r600/r600_pipe.c             |  1 +
>  src/gallium/drivers/radeonsi/si_pipe.c           |  1 +
>  src/gallium/drivers/softpipe/sp_screen.c         |  2 ++
>  src/gallium/drivers/svga/svga_screen.c           |  1 +
>  src/gallium/drivers/vc4/vc4_screen.c             |  1 +
>  src/gallium/include/pipe/p_defines.h             |  1 +
>  src/gallium/include/pipe/p_shader_tokens.h       |  4 ++-
>  19 files changed, 71 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index 649c327..954eb10 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_ZEROBASE) {
> +                     info->uses_vertexid_zerobase = 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 61ce813..b353097 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_zerobase;
> +   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 01fa5a9..7a45e2d 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_ZEROBASE",
> +   "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 e711ad4..6ccbe5b 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -233,6 +233,12 @@ 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_NOOFFSET``: Whether the driver needs lowering of the
> +  vertex id to not include the basevertex offset. If so vertex id will
> +  use TGSI_SEMANTIC_VERTEXID_ZEROBASE and TGSI_SEMANTIC_BASEVERTEX instead
> +  of TGSI_SEMANTIC_VERTEXID. Only relevant if geometry shaders are supported.
> +  (Currently not possible to query availability of these two semantics outside
> +  of this).
>
>
>  .. _pipe_capf:
> diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst
> index cbb8f74..c12858d 100644
> --- a/src/gallium/docs/source/tgsi.rst
> +++ b/src/gallium/docs/source/tgsi.rst
> @@ -2723,6 +2723,42 @@ 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.
>
> +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. Only the X value 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. Only the X value is used.
> +
> +TGSI_SEMANTIC_VERTEXID_ZEROBASE
> +"""""""""""""""""""""""""""""""
> +
> +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_ZEROBASE + TGSI_SEMANTIC_BASEVERTEX
> +== TGSI_SEMANTIC_VERTEXID). Only the X value is used.
> +
> +TGSI_SEMANTIC_BASEVERTEX
> +""""""""""""""""""""""""
> +
> +For vertex shaders, this semantic label indicates that a system value contains
> +the base vertex (i.e. gl_BaseVertex). Only the X value is used.
> +
> +TGSI_SEMANTIC_PRIMID
> +""""""""""""""""""""
> +
> +For geometry and fragment shaders, this semantic label indicates the value
> +contains the primitive id (i.e. gl_PrimitiveID). Only the X value 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 ce105b8..43f5366 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_NOOFSET:

NOOFFSET

Marek


More information about the mesa-dev mailing list