Browse Source

Vk: expose EXT_vertex_attribute_divisor.

Adding new device features is ... fun, actually? (Yes, I'm weird.)
pull/494/head
Vladimír Vondruš 5 years ago
parent
commit
6c99537b6b
  1. 4
      doc/vulkan-mapping.dox
  2. 1
      doc/vulkan-support.dox
  3. 3
      src/Magnum/Vk/Device.cpp
  4. 2
      src/Magnum/Vk/DeviceCreateInfo.h
  5. 15
      src/Magnum/Vk/DeviceFeatures.h
  6. 2
      src/Magnum/Vk/DeviceProperties.cpp
  7. 2
      src/Magnum/Vk/DeviceProperties.h
  8. 1
      src/Magnum/Vk/Extensions.cpp
  9. 9
      src/Magnum/Vk/Extensions.h
  10. 1
      src/Magnum/Vk/Implementation/DeviceFeatures.h
  11. 5
      src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp
  12. 1
      src/MagnumExternal/Vulkan/extensions.txt
  13. 33
      src/MagnumExternal/Vulkan/flextVk.h

4
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

1
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} | |

3
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,

2
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}

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

2
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<Extensions::KHR::shader_atomic_int64>())
Implementation::structureConnect(next, features.shaderAtomicInt64, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES);
if(isOrVersionSupportedInternal<Extensions::EXT::vertex_attribute_divisor>())
Implementation::structureConnect(next, features.vertexAttributeDivisor, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT);
if(isOrVersionSupportedInternal<Extensions::KHR::timeline_semaphore>())
Implementation::structureConnect(next, features.timelineSemaphore, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES);
if(isOrVersionSupportedInternal<Extensions::KHR::vulkan_memory_model>())

2
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}

1
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{},

9
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 {

1
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;

5
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)

1
src/MagnumExternal/Vulkan/extensions.txt vendored

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

33
src/MagnumExternal/Vulkan/flextVk.h vendored

@ -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;

Loading…
Cancel
Save