| // 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 |