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

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

=== Other Extension Metadata

*Last Modified Date*::
    2017-09-05
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
  - This extension requires
    {spirv}/KHR/SPV_KHR_shader_draw_parameters.html[`SPV_KHR_shader_draw_parameters`]
  - This extension provides API support for
    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_draw_parameters.txt[`GL_ARB_shader_draw_parameters`]
  - Promoted to Vulkan 1.1 Core
*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, which contains the pname:firstInstance parameter
    passed to drawing commands,
  * code:BaseVertex, which contains the pname:firstVertex or
    pname:vertexOffset parameter passed to drawing commands, and
  * code:DrawIndex, which contains the index of the draw call currently
    being processed from an indirect draw 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
a <<features-shaderDrawParameters,feature bit was added>> to distinguish
whether it is actually available or not.

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

=== 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,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
