include::meta/VK_EXT_vertex_attribute_divisor.txt[]

*Last Modified Date*::
    2018-07-16
*IP Status*::
    No known IP claims.
*Contributors*::
  - Vikram Kushwaha, NVIDIA
  - Jason Ekstrand, Intel

This extension allows instance-rate vertex attributes to be repeated for
certain number of instances instead of advancing for every instance when
instanced rendering is enabled.

=== New Object Types

None.

=== New Enum Constants

Extending elink:VkStructureType:

  ** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT
  ** ename:VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT

=== New Enums

None.

=== New Structures

  * Extending slink:VkPipelineVertexInputStateCreateInfo:
  ** slink:VkPipelineVertexInputDivisorStateCreateInfoEXT
  * slink:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT
  * slink:VkVertexInputBindingDivisorDescriptionEXT

=== New Functions

None.

=== Issues

1) What is the effect of a non-zero value for pname:firstInstance?

*RESOLVED*: The Vulkan API should follow the OpenGL convention and offset
attribute fetching by pname:firstInstance while computing vertex attribute
offsets.

2) Should zero be an allowed divisor?

*RESOLVED*: No.
The zero case in OpenGL is handled in Vulkan by setting the pname:inputRate
on the binding to ename:VK_VERTEX_INPUT_RATE_VERTEX.


=== Examples

To create a vertex binding such that the first binding uses instanced
rendering and the same attribute is used for every 4 draw instances, an
application could use the following set of structures:


[source,c++]
----------------------------------------

    const VkVertexInputBindingDivisorDescriptionEXT divisorDesc =
    {
        0,
        4
    };

    const VkPipelineVertexInputDivisorStateCreateInfoEXT divisorInfo =
    {
        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, // sType
        NULL,                                                             // pNext
        1,                                                                // vertexBindingDivisorCount
        &divisorDesc                                                      // pVertexBindingDivisors
    }

    const VkVertexInputBindingDescription binding =
    {
        0,                                                                // binding
        sizeof(Vertex),                                                   // stride
        VK_VERTEX_INPUT_RATE_INSTANCE                                     // inputRate
    };

    const VkPipelineVertexInputStateCreateInfo viInfo =
    {
        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO,              // sType
        &divisorInfo,                                                     // pNext
        ...
    };
    //...
----------------------------------------

=== Version History

  * Revision 1, 2017-12-04 (Vikram Kushwaha)
    - First Version
  * Revision 2, 2018-07-16 (Jason Ekstrand)
    - Adjust the interaction between fname:divisor and pname:firstInstance
      to match the OpenGL convention.
    - Disallow divisors of zero.
