diff --git a/doc/vulkan-mapping.dox b/doc/vulkan-mapping.dox index 5af086671..2323cfa73 100644 --- a/doc/vulkan-mapping.dox +++ b/doc/vulkan-mapping.dox @@ -592,6 +592,8 @@ Vulkan structure | Matching API @type_vk{PhysicalDeviceTimelineSemaphoreProperties} @m_class{m-label m-flat m-success} **KHR, 1.2** | | @type_vk{PhysicalDeviceUniformBufferStandardLayoutFeatures} @m_class{m-label m-flat m-success} **KHR, 1.2** | @ref DeviceFeatures @type_vk{PhysicalDeviceVariablePointersFeatures} @m_class{m-label m-flat m-success} **KHR, 1.1** | @ref DeviceFeatures +@type_vk{PhysicalDeviceVertexAttributeDivisorFeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | @ref DeviceFeatures +@type_vk{PhysicalDeviceVertexAttributeDivisorPropertiesEXT} @m_class{m-label m-flat m-warning} **EXT** | | @type_vk{PhysicalDeviceVulkan11Features} @m_class{m-label m-flat m-success} **1.2** | ignored for compatibility reasons @type_vk{PhysicalDeviceVulkan11Properties} @m_class{m-label m-flat m-success} **1.2** | ignored for compatibility reasons @type_vk{PhysicalDeviceVulkan12Features} @m_class{m-label m-flat m-success} **1.2** | ignored for compatibility reasons @@ -610,6 +612,7 @@ Vulkan structure | Matching API @type_vk{PipelineShaderStageCreateInfo} | | @type_vk{PipelineTessellationStateCreateInfo} | | @type_vk{PipelineTessellationDomainOriginStateCreateInfo} @m_class{m-label m-flat m-success} **KHR, 1.1** | | +@type_vk{PipelineVertexInputDivisorStateCreateInfoEXT} @m_class{m-label m-flat m-warning} **EXT** | | @type_vk{PipelineVertexInputStateCreateInfo} | | @type_vk{PipelineViewportStateCreateInfo} | | @type_vk{ProtectedSubmitInfo} | | @@ -693,6 +696,7 @@ Vulkan structure | Matching API --------------------------------------- | ------------ @type_vk{ValidationFeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | | @type_vk{VertexInputBindingDescription} | | +@type_vk{VertexInputBindingDivisorDescriptionEXT} @m_class{m-label m-flat m-warning} **EXT** | | @type_vk{VertexInputAttributeDescription} | | @type_vk{Viewport} | convertible from/to @ref Range3D using @ref Magnum/Vk/Integration.h diff --git a/doc/vulkan-support.dox b/doc/vulkan-support.dox index 3f7f5daf9..3e76f713e 100644 --- a/doc/vulkan-support.dox +++ b/doc/vulkan-support.dox @@ -120,6 +120,7 @@ Extension | Status @vk_extension{EXT,texture_compression_astc_hdr} | @ref Vk::vkFormat() only @vk_extension{EXT,debug_utils} @m_class{m-label m-info} **instance** | | @vk_extension{EXT,validation_features} @m_class{m-label m-info} **instance** | | +@vk_extension{EXT,vertex_attribute_divisor} | | @vk_extension{EXT,index_type_uint8} | @ref Vk::vkIndexType() only @vk_extension{KHR,acceleration_structure} | | @vk_extension{KHR,deferred_host_operations} | | diff --git a/src/Magnum/Vk/Device.cpp b/src/Magnum/Vk/Device.cpp index 0c6a448fc..3be4aaacb 100644 --- a/src/Magnum/Vk/Device.cpp +++ b/src/Magnum/Vk/Device.cpp @@ -349,6 +349,7 @@ DeviceCreateInfo& DeviceCreateInfo::setEnabledFeatures(const DeviceFeatures& fea _state->features.shaderSubgroupExtendedTypes, _state->features._8BitStorage, _state->features.shaderAtomicInt64, + _state->features.vertexAttributeDivisor, _state->features.timelineSemaphore, _state->features.vulkanMemoryModel, _state->features.scalarBlockLayout, @@ -456,6 +457,8 @@ DeviceCreateInfo& DeviceCreateInfo::setEnabledFeatures(const DeviceFeatures& fea _state->features._8BitStorage, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES); structureConnectIfUsed(next, _state->firstEnabledFeature, _state->features.shaderAtomicInt64, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES); + structureConnectIfUsed(next, _state->firstEnabledFeature, + _state->features.vertexAttributeDivisor, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT); structureConnectIfUsed(next, _state->firstEnabledFeature, _state->features.timelineSemaphore, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES); structureConnectIfUsed(next, _state->firstEnabledFeature, diff --git a/src/Magnum/Vk/DeviceCreateInfo.h b/src/Magnum/Vk/DeviceCreateInfo.h index 7940c2797..968443068 100644 --- a/src/Magnum/Vk/DeviceCreateInfo.h +++ b/src/Magnum/Vk/DeviceCreateInfo.h @@ -240,6 +240,8 @@ class MAGNUM_VK_EXPORT DeviceCreateInfo { * 1.2, @vk_extension{KHR,8bit_storage}) * - @type_vk_keyword{PhysicalDeviceShaderAtomicInt64Features} * (Vulkan 1.2, @vk_extension{KHR,shader_atomic_int64}) + * - @type_vk_keyword{PhysicalDeviceVertexAttributeDivisorFeaturesEXT} + * (@vk_extension{EXT,vertex_attribute_divisor}) * - @type_vk_keyword{PhysicalDeviceTimelineSemaphoreFeatures} * (Vulkan 1.2, @vk_extension{KHR,timeline_semaphore}) * - @type_vk_keyword{PhysicalDeviceVulkanMemoryModelFeatures} diff --git a/src/Magnum/Vk/DeviceFeatures.h b/src/Magnum/Vk/DeviceFeatures.h index 569c472a1..76b2a4afb 100644 --- a/src/Magnum/Vk/DeviceFeatures.h +++ b/src/Magnum/Vk/DeviceFeatures.h @@ -937,6 +937,21 @@ enum class DeviceFeature: UnsignedShort { */ ShaderSharedInt64Atomics, + /* VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, #191 */ + + /** + * Whether vertex attribute fetching may be repeated in case of instanced + * rendering. + * @requires_vk_extension Extension @vk_extension{EXT,vertex_attribute_divisor} + */ + VertexAttributeInstanceRateDivisor, + + /** + * Whether zero vertex attribute divisor is supported. + * @requires_vk_extension Extension @vk_extension{EXT,vertex_attribute_divisor} + */ + VertexAttributeInstanceRateZeroDivisor, + /* VkPhysicalDeviceTimelineSemaphoreFeatures, #208 */ /** diff --git a/src/Magnum/Vk/DeviceProperties.cpp b/src/Magnum/Vk/DeviceProperties.cpp index 8b566102d..3f500969f 100644 --- a/src/Magnum/Vk/DeviceProperties.cpp +++ b/src/Magnum/Vk/DeviceProperties.cpp @@ -315,6 +315,8 @@ const DeviceFeatures& DeviceProperties::features() { Implementation::structureConnect(next, features._8BitStorage, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES); if(isOrVersionSupportedInternal()) Implementation::structureConnect(next, features.shaderAtomicInt64, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES); + if(isOrVersionSupportedInternal()) + Implementation::structureConnect(next, features.vertexAttributeDivisor, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT); if(isOrVersionSupportedInternal()) Implementation::structureConnect(next, features.timelineSemaphore, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES); if(isOrVersionSupportedInternal()) diff --git a/src/Magnum/Vk/DeviceProperties.h b/src/Magnum/Vk/DeviceProperties.h index 5a59530b0..575d5cf51 100644 --- a/src/Magnum/Vk/DeviceProperties.h +++ b/src/Magnum/Vk/DeviceProperties.h @@ -460,6 +460,8 @@ class MAGNUM_VK_EXPORT DeviceProperties { * - If Vulkan 1.2 or the @vk_extension{KHR,shader_atomic_int64} * extension is supported by the device, the `pNext` chain * contains @type_vk_keyword{PhysicalDeviceShaderAtomicInt64Features} + * - If the @vk_extension{EXT,vertex_attribute_divisor} extension is + * supported by the device, the `pNext` chain contains @type_vk_keyword{PhysicalDeviceVertexAttributeDivisorFeaturesEXT} * - If Vulkan 1.2 or the @vk_extension{KHR,timeline_semaphore} * extension is supported by the device, the `pNext` chain * contains @type_vk_keyword{PhysicalDeviceTimelineSemaphoreFeatures} diff --git a/src/Magnum/Vk/Extensions.cpp b/src/Magnum/Vk/Extensions.cpp index f0745e81b..aebb89ccb 100644 --- a/src/Magnum/Vk/Extensions.cpp +++ b/src/Magnum/Vk/Extensions.cpp @@ -70,6 +70,7 @@ constexpr Extension DeviceExtensions[] { Extensions::EXT::debug_marker{}, Extensions::EXT::index_type_uint8{}, Extensions::EXT::texture_compression_astc_hdr{}, + Extensions::EXT::vertex_attribute_divisor{}, Extensions::IMG::format_pvrtc{}, Extensions::KHR::acceleration_structure{}, Extensions::KHR::deferred_host_operations{}, diff --git a/src/Magnum/Vk/Extensions.h b/src/Magnum/Vk/Extensions.h index ae4c787e3..df7e551f8 100644 --- a/src/Magnum/Vk/Extensions.h +++ b/src/Magnum/Vk/Extensions.h @@ -118,10 +118,11 @@ namespace EXT { _extension(2, EXT,sampler_filter_minmax, Vk10, Vk12) // #131 _extension(3, EXT,descriptor_indexing, Vk10, Vk12) // #162 _extension(4, EXT,shader_viewport_index_layer, Vk10, Vk12) // #163 - _extension(5, EXT,scalar_block_layout, Vk10, Vk12) // #222 - _extension(6, EXT,separate_stencil_usage, Vk10, Vk12) // #247 - _extension(7, EXT,host_query_reset, Vk10, Vk12) // #262 - _extension(8, EXT,index_type_uint8, Vk10, None) // #266 + _extension(5, EXT,vertex_attribute_divisor, Vk10, None) // #191 + _extension(6, EXT,scalar_block_layout, Vk10, Vk12) // #222 + _extension(7, EXT,separate_stencil_usage, Vk10, Vk12) // #247 + _extension(8, EXT,host_query_reset, Vk10, Vk12) // #262 + _extension(9, EXT,index_type_uint8, Vk10, None) // #266 } namespace IMG { _extension(20, IMG,format_pvrtc, Vk10, None) // #55 } namespace KHR { diff --git a/src/Magnum/Vk/Implementation/DeviceFeatures.h b/src/Magnum/Vk/Implementation/DeviceFeatures.h index 2ff86fc97..37da13e1f 100644 --- a/src/Magnum/Vk/Implementation/DeviceFeatures.h +++ b/src/Magnum/Vk/Implementation/DeviceFeatures.h @@ -50,6 +50,7 @@ struct DeviceFeatures { VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypes; VkPhysicalDevice8BitStorageFeatures _8BitStorage; VkPhysicalDeviceShaderAtomicInt64Features shaderAtomicInt64; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertexAttributeDivisor; VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphore; VkPhysicalDeviceVulkanMemoryModelFeatures vulkanMemoryModel; VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayout; diff --git a/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp b/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp index 04ff64754..0247dd4fd 100644 --- a/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp +++ b/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp @@ -168,6 +168,11 @@ _ce(ShaderBufferInt64Atomics, shaderBufferInt64Atomics) _ce(ShaderSharedInt64Atomics, shaderSharedInt64Atomics) #undef _ce +#define _ce(value, field) _cext(value, field, vertexAttributeDivisor, EXT::vertex_attribute_divisor) +_ce(VertexAttributeInstanceRateDivisor, vertexAttributeInstanceRateDivisor) +_ce(VertexAttributeInstanceRateZeroDivisor, vertexAttributeInstanceRateZeroDivisor) +#undef _ce + _cext(TimelineSemaphore, timelineSemaphore, timelineSemaphore, KHR::timeline_semaphore) #define _ce(value, field) _cext(value, field, vulkanMemoryModel, KHR::vulkan_memory_model) diff --git a/src/MagnumExternal/Vulkan/extensions.txt b/src/MagnumExternal/Vulkan/extensions.txt index d10b5b654..6e1d721d2 100644 --- a/src/MagnumExternal/Vulkan/extensions.txt +++ b/src/MagnumExternal/Vulkan/extensions.txt @@ -61,6 +61,7 @@ extension EXT_debug_marker optional extension EXT_debug_utils optional extension EXT_validation_features optional extension EXT_texture_compression_astc_hdr optional +extension EXT_vertex_attribute_divisor optional extension EXT_index_type_uint8 optional extension IMG_format_pvrtc optional extension KHR_acceleration_structure optional diff --git a/src/MagnumExternal/Vulkan/flextVk.h b/src/MagnumExternal/Vulkan/flextVk.h index 09c2df591..728f32547 100644 --- a/src/MagnumExternal/Vulkan/flextVk.h +++ b/src/MagnumExternal/Vulkan/flextVk.h @@ -244,6 +244,11 @@ extern "C" { #define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION 1 #define VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME "VK_EXT_texture_compression_astc_hdr" +/* VK_EXT_vertex_attribute_divisor */ + +#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3 +#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" + /* VK_EXT_index_type_uint8 */ #define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1 @@ -1526,6 +1531,9 @@ typedef enum { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = 1000066000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, @@ -4148,6 +4156,24 @@ typedef struct VkSemaphoreSignalInfo { typedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR; +typedef struct VkVertexInputBindingDivisorDescriptionEXT { + uint32_t binding; + uint32_t divisor; +} VkVertexInputBindingDivisorDescriptionEXT; + +typedef struct VkPipelineVertexInputDivisorStateCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t vertexBindingDivisorCount; + const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors; +} VkPipelineVertexInputDivisorStateCreateInfoEXT; + +typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxVertexAttribDivisor; +} VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT; + typedef struct VkPhysicalDevice8BitStorageFeatures { VkStructureType sType; void* pNext; @@ -4171,6 +4197,13 @@ typedef struct VkPhysicalDeviceShaderAtomicInt64Features { VkBool32 shaderSharedInt64Atomics; } VkPhysicalDeviceShaderAtomicInt64Features; +typedef struct VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 vertexAttributeInstanceRateDivisor; + VkBool32 vertexAttributeInstanceRateZeroDivisor; +} VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT; + typedef struct VkPhysicalDeviceDepthStencilResolveProperties { VkStructureType sType; void* pNext;