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