// Copyright 2016-2024 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_KHR_shader_draw_parameters.adoc[]

=== Other Extension Metadata

*Last Modified Date*::
    2017-09-05
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - This extension provides API support for
    {GLregistry}/ARB/ARB_shader_draw_parameters.txt[`GL_ARB_shader_draw_parameters`]
*Contributors*::
  - Daniel Koch, NVIDIA Corporation
  - Jeff Bolz, NVIDIA
  - Daniel Rakos, AMD
  - Jan-Harald Fredriksen, ARM
  - John Kessenich, Google
  - Stuart Smith, IMG

=== Description

This extension adds support for the following SPIR-V extension in Vulkan:

  * `SPV_KHR_shader_draw_parameters`

The extension provides access to three additional built-in shader variables
in Vulkan:

  * code:BaseInstance, containing the pname:firstInstance parameter passed
    to drawing commands,
  * code:BaseVertex, containing the pname:firstVertex or pname:vertexOffset
    parameter passed to drawing commands, and
  * code:DrawIndex, containing the index of the draw call currently being
    processed from an indirect drawing call.

When using GLSL source-based shader languages, the following variables from
`GL_ARB_shader_draw_parameters` can map to these SPIR-V built-in
decorations:

  * `in int gl_BaseInstanceARB;` -> code:BaseInstance,
  * `in int gl_BaseVertexARB;` -> code:BaseVertex, and
  * `in int gl_DrawIDARB;` -> code:DrawIndex.

=== Promotion to Vulkan 1.1

All functionality in this extension is included in core Vulkan 1.1.
However, the <<features-shaderDrawParameters, pname:shaderDrawParameters>>
feature bit was added to distinguish whether it is actually available or
not.

include::{generated}/interfaces/VK_KHR_shader_draw_parameters.adoc[]

=== New Built-In Variables

  * <<interfaces-builtin-variables-baseinstance,code:BaseInstance>>
  * <<interfaces-builtin-variables-basevertex,code:BaseVertex>>
  * <<interfaces-builtin-variables-drawindex,code:DrawIndex>>

=== New SPIR-V Capabilities

  * <<spirvenv-capabilities-table-DrawParameters, code:DrawParameters>>

=== Issues

1) Is this the same functionality as `GL_ARB_shader_draw_parameters`?

*RESOLVED*: It is actually a superset, as it also adds in support for
arrayed drawing commands.

In GL for `GL_ARB_shader_draw_parameters`, code:gl_BaseVertexARB holds the
integer value passed to the parameter to the command that resulted in the
current shader invocation.
In the case where the command has no code:baseVertex parameter, the value of
code:gl_BaseVertexARB is zero.
This means that code:gl_BaseVertexARB = code:baseVertex (for
code:glDrawElements commands with code:baseVertex) or 0.
In particular there are no code:glDrawArrays commands that take a
code:baseVertex parameter.

Now in Vulkan, we have code:BaseVertex = pname:vertexOffset (for indexed
drawing commands) or pname:firstVertex (for arrayed drawing commands), and
so Vulkan's version is really a superset of GL functionality.

=== Version History

  * Revision 1, 2016-10-05 (Daniel Koch)
  ** Internal revisions
