From d436e7ab50f27c08a0c8887bc77480d325bb1a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 7 Feb 2021 13:33:07 +0100 Subject: [PATCH] Vk: expose EXT_robustness2 and EXT_image_robustness2 extensions. --- doc/vulkan-mapping.dox | 3 + doc/vulkan-support.dox | 2 + src/Magnum/Vk/Device.cpp | 6 ++ src/Magnum/Vk/DeviceCreateInfo.h | 4 ++ src/Magnum/Vk/DeviceFeatures.h | 57 ++++++++++++++++++- src/Magnum/Vk/DeviceProperties.cpp | 4 ++ src/Magnum/Vk/DeviceProperties.h | 6 ++ src/Magnum/Vk/Extensions.cpp | 2 + src/Magnum/Vk/Extensions.h | 2 + src/Magnum/Vk/Implementation/DeviceFeatures.h | 2 + .../Implementation/deviceFeatureMapping.hpp | 8 +++ src/MagnumExternal/Vulkan/extensions.txt | 2 + src/MagnumExternal/Vulkan/flextVk.h | 36 +++++++++++- 13 files changed, 131 insertions(+), 3 deletions(-) diff --git a/doc/vulkan-mapping.dox b/doc/vulkan-mapping.dox index 2483db162..d200e5177 100644 --- a/doc/vulkan-mapping.dox +++ b/doc/vulkan-mapping.dox @@ -614,6 +614,7 @@ Vulkan structure | Matching API @type_vk{PhysicalDeviceIDProperties} @m_class{m-label m-flat m-success} **KHR, 1.1** | | @type_vk{PhysicalDeviceImageFormatInfo2} @m_class{m-label m-flat m-success} **KHR, 1.1** | | @type_vk{PhysicalDeviceImagelessFramebufferFeatures} @m_class{m-label m-flat m-success} **KHR, 1.2** | @ref DeviceFeatures +@type_vk{PhysicalDeviceImageRobustnessFeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | @ref DeviceFeatures @type_vk{PhysicalDeviceIndexTypeUint8FeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | @ref DeviceFeatures @type_vk{PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | @ref DeviceFeatures @type_vk{PhysicalDeviceLimits} | | @@ -630,6 +631,8 @@ Vulkan structure | Matching API @type_vk{PhysicalDeviceRayQueryFeaturesKHR} @m_class{m-label m-flat m-warning} **KHR** | @ref DeviceFeatures @type_vk{PhysicalDeviceRayTracingPipelineFeaturesKHR} @m_class{m-label m-flat m-warning} **KHR** | @ref DeviceFeatures @type_vk{PhysicalDeviceRayTracingPipelinePropertiesKHR} @m_class{m-label m-flat m-warning} **KHR** | | +@type_vk{PhysicalDeviceRobustness2FeaturesEXT} @m_class{m-label m-flat m-warning} **EXT** | @ref DeviceFeatures +@type_vk{PhysicalDeviceRobustness2PropertiesEXT} @m_class{m-label m-flat m-warning} **EXT** | | @type_vk{PhysicalDeviceSamplerFilterMinmaxProperties} @m_class{m-label m-flat m-success} **EXT, 1.2** | | @type_vk{PhysicalDeviceSamplerYcbcrConversionFeatures} @m_class{m-label m-flat m-success} **KHR, 1.1** | @ref DeviceFeatures @type_vk{PhysicalDeviceSeparateDepthStencilLayoutsFeatures} @m_class{m-label m-flat m-success} **KHR, 1.2** | @ref DeviceFeatures diff --git a/doc/vulkan-support.dox b/doc/vulkan-support.dox index 7215f8a66..0f2defdf7 100644 --- a/doc/vulkan-support.dox +++ b/doc/vulkan-support.dox @@ -123,6 +123,8 @@ Extension | Status @vk_extension{EXT,vertex_attribute_divisor} | done @vk_extension{EXT,index_type_uint8} | @ref Vk::vkIndexType() only @vk_extension{EXT,extended_dynamic_state} | | +@vk_extension{EXT,robustness2} | done except properties +@vk_extension{EXT,image_robustness} | done @vk_extension{KHR,acceleration_structure} | | @vk_extension{KHR,portability_subset} | done except properties @vk_extension{KHR,deferred_host_operations} | | diff --git a/src/Magnum/Vk/Device.cpp b/src/Magnum/Vk/Device.cpp index 80c4072ba..ec74756e1 100644 --- a/src/Magnum/Vk/Device.cpp +++ b/src/Magnum/Vk/Device.cpp @@ -412,6 +412,8 @@ DeviceCreateInfo& DeviceCreateInfo::setEnabledFeatures(const DeviceFeatures& fea _state->features.hostQueryReset, _state->features.indexTypeUint8, _state->features.extendedDynamicState, + _state->features.robustness2, + _state->features.imageRobustness, _state->features.rayTracingPipeline, _state->features.rayQuery }); @@ -533,6 +535,10 @@ DeviceCreateInfo& DeviceCreateInfo::setEnabledFeatures(const DeviceFeatures& fea _state->features.indexTypeUint8, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT); structureConnectIfUsed(next, _state->firstEnabledFeature, _state->features.extendedDynamicState, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT); + structureConnectIfUsed(next, _state->firstEnabledFeature, + _state->features.robustness2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT); + structureConnectIfUsed(next, _state->firstEnabledFeature, + _state->features.imageRobustness, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT); structureConnectIfUsed(next, _state->firstEnabledFeature, _state->features.rayTracingPipeline, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR); structureConnectIfUsed(next, _state->firstEnabledFeature, diff --git a/src/Magnum/Vk/DeviceCreateInfo.h b/src/Magnum/Vk/DeviceCreateInfo.h index 44fc0c45c..088a5ad14 100644 --- a/src/Magnum/Vk/DeviceCreateInfo.h +++ b/src/Magnum/Vk/DeviceCreateInfo.h @@ -268,6 +268,10 @@ class MAGNUM_VK_EXPORT DeviceCreateInfo { * (@vk_extension{EXT,index_type_uint8}) * - @type_vk_keyword{PhysicalDeviceExtendedDynamicStateFeaturesEXT} * (@vk_extension{EXT,extended_dynamic_state}) + * - @type_vk_keyword{PhysicalDeviceRobustness2FeaturesEXT} + * (@vk_extension{EXT,robustness2}) + * - @type_vk_keyword{PhysicalDeviceImageRobustnessFeaturesEXT} + * (@vk_extension{EXT,image_robustness}) * - @type_vk_keyword{PhysicalDeviceRayTracingPipelineFeaturesKHR} * (@vk_extension{KHR,ray_tracing_pipeline}) * - @type_vk_keyword{PhysicalDeviceRayQueryFeaturesKHR} diff --git a/src/Magnum/Vk/DeviceFeatures.h b/src/Magnum/Vk/DeviceFeatures.h index dcf958b10..bac1f076f 100644 --- a/src/Magnum/Vk/DeviceFeatures.h +++ b/src/Magnum/Vk/DeviceFeatures.h @@ -59,8 +59,12 @@ usually just with the first letter uppercase instead of lowercase. enum class DeviceFeature: UnsignedShort { /** * Whether accesses to buffers are bounds-checked against the range of the - * buffer descriptor. - * @todo expose @vk_extension{EXT,robustness2}, reference from here + * buffer descriptor. Out of bounds accesses are guaranteed to not cause + * application termination, but have implementation-dependent behavior. A + * subset of the guarantees provided by + * @ref DeviceFeature::RobustBufferAccess2. + * @see @ref DeviceFeature::RobustImageAccess, + * @relativeref{DeviceFeature,RobustImageAccess2} */ RobustBufferAccess, @@ -1292,6 +1296,55 @@ enum class DeviceFeature: UnsignedShort { */ ExtendedDynamicState, + /* VkPhysicalDeviceRobustness2FeaturesEXT, #287 */ + + /** + * Whether accesses to buffers are bounds-checked against the range of the + * buffer descriptor, rounded up to a multiple of buffer access size + * alignment. Out of bounds writes are guaranteed to be discarded, out of + * bounds reads are guaranteed to return zero values. A stricter but more + * expensive variant of @ref DeviceFeature::RobustBufferAccess. + * @requires_vk_extension Extension @vk_extension{EXT,robustness2} + * @todo expose the alignment limit + */ + RobustBufferAccess2, + + /** + * Whether accesses to images are bounds-checked against the dimensions of + * the image view. Out of bounds loads are guaranteed to return zero + * values, with @f$ (0, 0, 0, 1) @f$ inserted for missing components based + * on the image format. A stricted but more expensive variant of + * @ref DeviceFeature::RobustImageAccess. + * @see @ref DeviceFeature::RobustBufferAccess, + * @relativeref{DeviceFeature,RobustBufferAccess2} + * @requires_vk_extension Extension @vk_extension{EXT,robustness2} + */ + RobustImageAccess2, + + /** + * Whether descriptors can be written with a null resource or view handle, + * at which point they're considered valid and act as if the descriptor was + * bound to nothing. + * @requires_vk_extension Extension @vk_extension{EXT,robustness2} + */ + NullDescriptor, + + /* VkPhysicalDeviceImageRobustnessFeaturesEXT, #336 */ + + /** + * Whether accesses to images are bounds-checked against the dimensions of + * the image view. Out of bounds loads are guaranteed to return zero + * values, with either @f$ (0, 0, 0, 0) @f$ or @f$ (0, 0, 0, 1) @f$ + * inserted for missing components based on the image format, with no + * guarantees provided for values returned for an invalid mip level. A + * subset of the guarantees provided by + * @ref DeviceFeature::RobustImageAccess2. + * @see @ref DeviceFeature::RobustBufferAccess, + * @relativeref{DeviceFeature,RobustBufferAccess2} + * @requires_vk_extension Extension @vk_extension{EXT,image_robustness} + */ + RobustImageAccess, + /* VkPhysicalDeviceRayTracingPipelineFeaturesKHR, #348 */ /** diff --git a/src/Magnum/Vk/DeviceProperties.cpp b/src/Magnum/Vk/DeviceProperties.cpp index b9263f136..739c5a8f7 100644 --- a/src/Magnum/Vk/DeviceProperties.cpp +++ b/src/Magnum/Vk/DeviceProperties.cpp @@ -339,6 +339,10 @@ const DeviceFeatures& DeviceProperties::features() { Implementation::structureConnect(next, features.indexTypeUint8, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT); if(isOrVersionSupportedInternal()) Implementation::structureConnect(next, features.extendedDynamicState, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT); + if(isOrVersionSupportedInternal()) + Implementation::structureConnect(next, features.robustness2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT); + if(isOrVersionSupportedInternal()) + Implementation::structureConnect(next, features.imageRobustness, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT); if(isOrVersionSupportedInternal()) Implementation::structureConnect(next, features.rayTracingPipeline, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR); if(isOrVersionSupportedInternal()) diff --git a/src/Magnum/Vk/DeviceProperties.h b/src/Magnum/Vk/DeviceProperties.h index 3c9f4e1dd..6fe6a3584 100644 --- a/src/Magnum/Vk/DeviceProperties.h +++ b/src/Magnum/Vk/DeviceProperties.h @@ -492,6 +492,12 @@ class MAGNUM_VK_EXPORT DeviceProperties { * - If the @vk_extension{EXT,extended_dynamic_state} extension is * supported by the device, the `pNext` chain contains * @type_vk_keyword{PhysicalDeviceExtendedDynamicStateFeaturesEXT} + * - If the @vk_extension{EXT,robustness2} extension is supported by + * the device, the `pNext` chain contains + * @type_vk_keyword{PhysicalDeviceRobustness2FeaturesEXT} + * - If the @vk_extension{EXT,image_robustness} extension is + * supported by the device, the `pNext` chain contains + * @type_vk_keyword{PhysicalDeviceImageRobustnessFeaturesEXT} * - If the @vk_extension{KHR,ray_tracing_pipeline} extension is * supported by the device, the `pNext` chain contains * @type_vk_keyword{PhysicalDeviceRayTracingPipelineFeaturesKHR} diff --git a/src/Magnum/Vk/Extensions.cpp b/src/Magnum/Vk/Extensions.cpp index bc8e10523..2cb312300 100644 --- a/src/Magnum/Vk/Extensions.cpp +++ b/src/Magnum/Vk/Extensions.cpp @@ -69,7 +69,9 @@ namespace { constexpr Extension DeviceExtensions[] { Extensions::EXT::debug_marker{}, Extensions::EXT::extended_dynamic_state{}, + Extensions::EXT::image_robustness{}, Extensions::EXT::index_type_uint8{}, + Extensions::EXT::robustness2{}, Extensions::EXT::texture_compression_astc_hdr{}, Extensions::EXT::vertex_attribute_divisor{}, Extensions::IMG::format_pvrtc{}, diff --git a/src/Magnum/Vk/Extensions.h b/src/Magnum/Vk/Extensions.h index 6de3f552a..41c7b6cef 100644 --- a/src/Magnum/Vk/Extensions.h +++ b/src/Magnum/Vk/Extensions.h @@ -124,6 +124,8 @@ namespace EXT { _extension(8, EXT,host_query_reset, Vk10, Vk12) // #262 _extension(9, EXT,index_type_uint8, Vk10, None) // #266 _extension(10, EXT,extended_dynamic_state, Vk10, None) // #268 + _extension(11, EXT,robustness2, Vk10, None) // #287 + _extension(12, EXT,image_robustness, Vk10, None) // #336 } 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 4d567c67c..15ad590bd 100644 --- a/src/Magnum/Vk/Implementation/DeviceFeatures.h +++ b/src/Magnum/Vk/Implementation/DeviceFeatures.h @@ -61,6 +61,8 @@ struct DeviceFeatures { VkPhysicalDeviceHostQueryResetFeatures hostQueryReset; VkPhysicalDeviceIndexTypeUint8FeaturesEXT indexTypeUint8; VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicState; + VkPhysicalDeviceRobustness2FeaturesEXT robustness2; + VkPhysicalDeviceImageRobustnessFeaturesEXT imageRobustness; VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingPipeline; VkPhysicalDeviceRayQueryFeaturesKHR rayQuery; }; diff --git a/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp b/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp index 8c218c4f8..82ecc2ed7 100644 --- a/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp +++ b/src/Magnum/Vk/Implementation/deviceFeatureMapping.hpp @@ -217,6 +217,14 @@ _cext(IndexTypeUint8, indexTypeUint8, indexTypeUint8, EXT::index_type_uint8) _cext(ExtendedDynamicState, extendedDynamicState, extendedDynamicState, EXT::extended_dynamic_state) +#define _ce(value, field) _cext(value, field, robustness2, EXT::robustness2) +_ce(RobustBufferAccess2, robustBufferAccess2) +_ce(RobustImageAccess2, robustImageAccess2) +_ce(NullDescriptor, nullDescriptor) +#undef _ce + +_cext(RobustImageAccess, robustImageAccess, imageRobustness, EXT::image_robustness) + #define _ce(value, field) _cext(value, field, rayTracingPipeline, KHR::ray_tracing_pipeline) _ce(RayTracingPipeline, rayTracingPipeline) _ce(RayTracingPipelineShaderGroupHandleCaptureReplay, rayTracingPipelineShaderGroupHandleCaptureReplay) diff --git a/src/MagnumExternal/Vulkan/extensions.txt b/src/MagnumExternal/Vulkan/extensions.txt index f70bd97c2..aa9e6b9e8 100644 --- a/src/MagnumExternal/Vulkan/extensions.txt +++ b/src/MagnumExternal/Vulkan/extensions.txt @@ -64,6 +64,8 @@ extension EXT_texture_compression_astc_hdr optional extension EXT_vertex_attribute_divisor optional extension EXT_index_type_uint8 optional extension EXT_extended_dynamic_state optional +extension EXT_robustness2 optional +extension EXT_image_robustness optional extension IMG_format_pvrtc optional extension KHR_acceleration_structure optional extension KHR_portability_subset optional diff --git a/src/MagnumExternal/Vulkan/flextVk.h b/src/MagnumExternal/Vulkan/flextVk.h index d20946024..d0cc4c335 100644 --- a/src/MagnumExternal/Vulkan/flextVk.h +++ b/src/MagnumExternal/Vulkan/flextVk.h @@ -259,6 +259,16 @@ extern "C" { #define VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION 1 #define VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME "VK_EXT_extended_dynamic_state" +/* VK_EXT_robustness2 */ + +#define VK_EXT_ROBUSTNESS_2_SPEC_VERSION 1 +#define VK_EXT_ROBUSTNESS_2_EXTENSION_NAME "VK_EXT_robustness2" + +/* VK_EXT_image_robustness */ + +#define VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION 1 +#define VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME "VK_EXT_image_robustness" + /* VK_IMG_format_pvrtc */ #define VK_IMG_FORMAT_PVRTC_SPEC_VERSION 1 @@ -329,7 +339,7 @@ extern "C" { // Vulkan 1.2 version number #define VK_API_VERSION_1_2 VK_MAKE_VERSION(1, 2, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 168 +#define VK_HEADER_VERSION 169 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_VERSION(1, 2, VK_HEADER_VERSION) #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; @@ -1563,6 +1573,9 @@ typedef enum { 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_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT = 1000335000, 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, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, @@ -4768,6 +4781,27 @@ typedef struct VkPhysicalDeviceExtendedDynamicStateFeaturesEXT { VkBool32 extendedDynamicState; } VkPhysicalDeviceExtendedDynamicStateFeaturesEXT; +typedef struct VkPhysicalDeviceRobustness2FeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 robustBufferAccess2; + VkBool32 robustImageAccess2; + VkBool32 nullDescriptor; +} VkPhysicalDeviceRobustness2FeaturesEXT; + +typedef struct VkPhysicalDeviceRobustness2PropertiesEXT { + VkStructureType sType; + void* pNext; + VkDeviceSize robustStorageBufferAccessSizeAlignment; + VkDeviceSize robustUniformBufferAccessSizeAlignment; +} VkPhysicalDeviceRobustness2PropertiesEXT; + +typedef struct VkPhysicalDeviceImageRobustnessFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 robustImageAccess; +} VkPhysicalDeviceImageRobustnessFeaturesEXT; + typedef struct VkPhysicalDevicePortabilitySubsetFeaturesKHR { VkStructureType sType; void* pNext;