From 4a339a4369e613c34235c82484983c8a9dbea65f Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 12 Jan 2022 15:08:36 +0000 Subject: [PATCH] Add support for VK_EXT_texture_compression_astc_hdr --- renderdoc/driver/vulkan/extension_support.md | 2 +- renderdoc/driver/vulkan/vk_common.h | 2 + renderdoc/driver/vulkan/vk_next_chains.cpp | 3 +- renderdoc/driver/vulkan/vk_resources.cpp | 154 ++++++++++++++---- renderdoc/driver/vulkan/vk_serialise.cpp | 24 ++- .../vulkan/wrappers/vk_device_funcs.cpp | 8 + 6 files changed, 160 insertions(+), 33 deletions(-) diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index d480a378a..5c4d96e3a 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -85,6 +85,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_subgroup_size_control` * `VK_EXT_swapchain_colorspace` * `VK_EXT_texel_buffer_alignment` +* `VK_EXT_texture_compression_astc_hdr` * `VK_EXT_tooling_info` * `VK_EXT_transform_feedback` * `VK_EXT_validation_cache` @@ -233,7 +234,6 @@ Ray tracing extensions are now standard and will likely be supported at some poi * `VK_EXT_physical_device_drm` * `VK_EXT_primitive_topology_list_restart` * `VK_EXT_provoking_vertex` -* `VK_EXT_texture_compression_astc_hdr` ## Platform/IHV Extensions diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 04faad771..e7d99d70e 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1020,6 +1020,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSurfaceInfo2KHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSynchronization2FeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTimelineSemaphoreFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTimelineSemaphoreProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceToolPropertiesEXT); @@ -1378,6 +1379,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSynchronization2FeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceToolPropertiesEXT); diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index b1d88a0e7..c7ba6e53b 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -386,6 +386,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, \ VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, \ + VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, \ VkPhysicalDeviceTimelineSemaphoreFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, \ @@ -794,7 +796,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: \ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: \ diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index f2847ee76..08f2c9160 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -1161,60 +1161,158 @@ VkFormat GetViewCastedFormat(VkFormat f, CompType typeCast) return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_BC7_SRGB_BLOCK : VK_FORMAT_BC7_UNORM_BLOCK; case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_4x4_SRGB_BLOCK - : VK_FORMAT_ASTC_4x4_UNORM_BLOCK; + case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_4x4_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_4x4_UNORM_BLOCK; + } case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_5x4_SRGB_BLOCK - : VK_FORMAT_ASTC_5x4_UNORM_BLOCK; + case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_5x4_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_5x4_UNORM_BLOCK; + } case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_5x5_SRGB_BLOCK - : VK_FORMAT_ASTC_5x5_UNORM_BLOCK; + case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_5x5_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_5x5_UNORM_BLOCK; + } case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_6x5_SRGB_BLOCK - : VK_FORMAT_ASTC_6x5_UNORM_BLOCK; + case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_6x5_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_6x5_UNORM_BLOCK; + } case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_6x6_SRGB_BLOCK - : VK_FORMAT_ASTC_6x6_UNORM_BLOCK; + case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_6x6_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_6x6_UNORM_BLOCK; + } case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_8x5_SRGB_BLOCK - : VK_FORMAT_ASTC_8x5_UNORM_BLOCK; + case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_8x5_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_8x5_UNORM_BLOCK; + } case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_8x6_SRGB_BLOCK - : VK_FORMAT_ASTC_8x6_UNORM_BLOCK; + case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_8x6_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_8x6_UNORM_BLOCK; + } case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_8x8_SRGB_BLOCK - : VK_FORMAT_ASTC_8x8_UNORM_BLOCK; + case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_8x8_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_8x8_UNORM_BLOCK; + } case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_10x5_SRGB_BLOCK - : VK_FORMAT_ASTC_10x5_UNORM_BLOCK; + case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_10x5_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_10x5_UNORM_BLOCK; + } case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_10x6_SRGB_BLOCK - : VK_FORMAT_ASTC_10x6_UNORM_BLOCK; + case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_10x6_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_10x6_UNORM_BLOCK; + } case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_10x8_SRGB_BLOCK - : VK_FORMAT_ASTC_10x8_UNORM_BLOCK; + case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_10x8_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_10x8_UNORM_BLOCK; + } case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_10x10_SRGB_BLOCK - : VK_FORMAT_ASTC_10x10_UNORM_BLOCK; + case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_10x10_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_10x10_UNORM_BLOCK; + } case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_12x10_SRGB_BLOCK - : VK_FORMAT_ASTC_12x10_UNORM_BLOCK; + case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_12x10_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_12x10_UNORM_BLOCK; + } case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: - return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_ASTC_12x12_SRGB_BLOCK - : VK_FORMAT_ASTC_12x12_UNORM_BLOCK; + case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT: + { + if(typeCast == CompType::UNormSRGB) + return VK_FORMAT_ASTC_12x12_SRGB_BLOCK; + else if(typeCast == CompType::Float) + return VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT; + else + return VK_FORMAT_ASTC_12x12_UNORM_BLOCK; + } case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: return (typeCast == CompType::UNormSRGB) ? VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 088c3678d..f731affeb 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -806,6 +806,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, \ VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT) \ \ + /* VK_EXT_texture_compression_astc_hdr */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, \ + VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT) \ + \ /* VK_EXT_tooling_info */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT, \ VkPhysicalDeviceToolPropertiesEXT) \ @@ -1327,9 +1331,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT) \ \ - /* VK_EXT_texture_compression_astc_hdr */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT) \ - \ /* VK_HUAWEI_invocation_mask */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI) \ \ @@ -6547,6 +6548,22 @@ void Deserialise(const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(textureCompressionASTC_HDR); +} + +template <> +void Deserialise(const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceToolPropertiesEXT &el) { @@ -10097,6 +10114,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSynchronization2FeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTimelineSemaphoreProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceToolPropertiesEXT); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 528e7760c..da33c19c7 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2844,6 +2844,14 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(formatA4B4G4R4); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK( + VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(textureCompressionASTC_HDR); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp)