[[VK_EXT_shader_subgroup_ballot]]
== VK_EXT_shader_subgroup_ballot

*Name String*::
    VK_EXT_shader_subgroup_ballot
*Extension Type*::
    Device extension
*Registered Extension Number*::
    65
*Status*::
    Draft
*Last Modified Date*::
    2016-11-28
*Revision*::
    1
*IP Status*::
    No known IP claims.
*Dependencies*::
  - This extension is written against version 1.0 of the Vulkan API.
  - This extension requires Vulkan 1.0.
  - This extension requires the
    https://www.khronos.org/registry/spir-v/extensions/KHR/SPV_KHR_shader_ballot.html[+SPV_KHR_shader_ballot+]
    SPIR-V extension.
  - This extension requires the
    https://www.opengl.org/registry/specs/ARB/shader_ballot.txt[+GL_ARB_shader_ballot+]
    extension for GLSL source languages.
*Contributors*::
  - Jeff Bolz, NVIDIA
  - Neil Henning, Codeplay
  - Daniel Koch, NVIDIA Corporation
*Contact*::
  - Daniel Koch (dkoch 'at' nvidia.com)
*Overview*::
+
--
This extension adds support for the following SPIR-V extension in Vulkan:

* SPV_KHR_shader_ballot

This extension provides the ability for a group of invocations, which
execute in parallel, to do limited forms of cross-invocation communication
via a group broadcast of a invocation value, or broadcast of a bitarray
representing a predicate value from each invocation in the group.

This extension provides access to a number of additional built-in shader
variables in Vulkan:

  * code:SubgroupEqMaskKHR, which contains the subgroup mask of the current
    subgroup invocation,
  * code:SubgroupGeMaskKHR, which contains the subgroup mask of the
    invocations greater than or equal to the current invocation,
  * code:SubgroupGtMaskKHR, which contains the subgroup mask of the
    invocations greater than the current invocation,
  * code:SubgroupLeMaskKHR, which contains the subgroup mask of the
    invocations less than or equal to the current invocation,
  * code:SubgroupLtMaskKHR, which contains the subgroup mask of the
    invocations less than the current invocation,
  * code:SubgroupLocalInvocationId, which contains the index of an
    invocation within a subgroup, and
  * code:SubgroupSize, which contains the maximum number of invocations in a
    subgroup.

Additionally, this extension provides access to the new SPIR-V instructions:

  * code:OpSubgroupBallotKHR,
  * code:OpSubgroupFirstInvocationKHR, and
  * code:OpSubgroupReadInvocationKHR,

When using GLSL source-based shader languages, the following variables and
shader functions from GL_ARB_shader_ballot can map to these SPIR-V built-in
decorations and instructions:

  * in uint64_t gl_SubGroupEqMaskARB; -> code:SubgroupEqMaskKHR,
  * in uint64_t gl_SubGroupGeMaskARB; -> code:SubgroupGeMaskKHR,
  * in uint64_t gl_SubGroupGtMaskARB; -> code:SubgroupGtMaskKHR,
  * in uint64_t gl_SubGroupLeMaskARB; -> code:SubgroupLeMaskKHR,
  * in uint64_t gl_SubGroupLtMaskARB; -> code:SubgroupLtMaskKHR,
  * in uint gl_SubGroupInvocationARB; -> code:SubgroupLocalInvocationId,
  * uniform uint gl_SubGroupSizeARB; -> code:SubgroupSize,
  * ballotARB() -> code:OpSubgroupBallotKHR,
  * readFirstInvocationARB() -> code:OpSubgroupFirstInvocationKHR, and
  * readInvocationARB() -> code:OpSubgroupReadInvocationKHR.

--

=== New Object Types

None.

=== New Enum Constants

None.

=== New Enums

None.

=== New Structures

None.

=== New Functions

None.

=== New Built-In Variables

  * <<interfaces-builtin-variables-sgeq,code:SubgroupEqMaskKHR>>
  * <<interfaces-builtin-variables-sgge,code:SubgroupGeMaskKHR>>
  * <<interfaces-builtin-variables-sggt,code:SubgroupGtMaskKHR>>
  * <<interfaces-builtin-variables-sgle,code:SubgroupLeMaskKHR>>
  * <<interfaces-builtin-variables-sglt,code:SubgroupLtMaskKHR>>
  * <<interfaces-builtin-variables-sgli,code:SubgroupLocalInvocationId>>
  * <<interfaces-builtin-variables-sgs,code:SubgroupSize>>

=== New SPIR-V Capabilities

  * <<spirvenv-capabilities-table-subgroupballot,SubgroupBallotKHR>>

=== Issues

None.

=== Version History

  * Revision 1, 2016-11-28 (Daniel Koch)
    - Initial draft
