From 7182e0af3a00cfeb7dfa03dae5d43e99b844732e Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 30 Apr 2018 10:50:46 +0100 Subject: [PATCH] Add support for VK_EXT_sampler_filter_minmax extension --- renderdoc/driver/vulkan/vk_common.cpp | 18 +++++++++++++++++- renderdoc/driver/vulkan/vk_common.h | 7 +++++-- renderdoc/driver/vulkan/vk_core.cpp | 3 +++ renderdoc/driver/vulkan/vk_hookset_defs.h | 3 ++- renderdoc/driver/vulkan/vk_info.cpp | 10 ++++++++++ renderdoc/driver/vulkan/vk_info.h | 1 + renderdoc/driver/vulkan/vk_replay.cpp | 3 ++- renderdoc/driver/vulkan/vk_serialise.cpp | 22 +++++++++++++++++++++- renderdoc/driver/vulkan/vk_stringise.cpp | 12 ++++++++++++ 9 files changed, 73 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 9e85b1989..4135bfa48 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -1493,7 +1493,7 @@ static FilterMode MakeFilterMode(VkSamplerMipmapMode f) } TextureFilter MakeFilter(VkFilter minFilter, VkFilter magFilter, VkSamplerMipmapMode mipmapMode, - bool anisoEnable, bool compareEnable) + bool anisoEnable, bool compareEnable, VkSamplerReductionModeEXT reduction) { TextureFilter ret; @@ -1509,6 +1509,22 @@ TextureFilter MakeFilter(VkFilter minFilter, VkFilter magFilter, VkSamplerMipmap } ret.filter = compareEnable ? FilterFunction::Comparison : FilterFunction::Normal; + if(compareEnable) + { + ret.filter = FilterFunction::Comparison; + } + else + { + switch(reduction) + { + case VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT: + ret.filter = FilterFunction::Normal; + break; + case VK_SAMPLER_REDUCTION_MODE_MIN_EXT: ret.filter = FilterFunction::Minimum; break; + case VK_SAMPLER_REDUCTION_MODE_MAX_EXT: ret.filter = FilterFunction::Maximum; break; + } + } + return ret; } diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 6c8e9cd0e..f150bb0c1 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -94,7 +94,7 @@ AddressMode MakeAddressMode(VkSamplerAddressMode addr); void MakeBorderColor(VkBorderColor border, FloatVector *BorderColor); CompareFunction MakeCompareFunc(VkCompareOp func); TextureFilter MakeFilter(VkFilter minFilter, VkFilter magFilter, VkSamplerMipmapMode mipmapMode, - bool anisoEnable, bool compareEnable); + bool anisoEnable, bool compareEnable, VkSamplerReductionModeEXT reduction); LogicOperation MakeLogicOp(VkLogicOp op); BlendMultiplier MakeBlendMultiplier(VkBlendFactor blend); BlendOperation MakeBlendOp(VkBlendOp op); @@ -627,6 +627,7 @@ DECLARE_REFLECTION_STRUCT(VkInputAttachmentAspectReference); DECLARE_REFLECTION_STRUCT(VkRenderPassInputAttachmentAspectCreateInfoKHR); DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDivisorDescriptionEXT); DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputDivisorStateCreateInfoEXT); +DECLARE_REFLECTION_STRUCT(VkSamplerReductionModeCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo); DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo); @@ -671,6 +672,7 @@ DECLARE_DESERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfoKHR); DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT); +DECLARE_DESERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT); DECLARE_REFLECTION_ENUM(VkFlagWithNoBits); DECLARE_REFLECTION_ENUM(VkQueueFlagBits); @@ -737,4 +739,5 @@ DECLARE_REFLECTION_ENUM(VkColorSpaceKHR); DECLARE_REFLECTION_ENUM(VkPresentModeKHR); DECLARE_REFLECTION_ENUM(VkDescriptorUpdateTemplateType); DECLARE_REFLECTION_ENUM(VkConservativeRasterizationModeEXT); -DECLARE_REFLECTION_ENUM(VkTessellationDomainOriginKHR); \ No newline at end of file +DECLARE_REFLECTION_ENUM(VkTessellationDomainOriginKHR); +DECLARE_REFLECTION_ENUM(VkSamplerReductionModeEXT); \ No newline at end of file diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index e4ddca747..1446e4ece 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -555,6 +555,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION, }, + { + VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION, + }, { VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 085b9e010..237fed455 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -325,7 +325,8 @@ CheckExt(EXT_conservative_rasterization, VKXX); \ CheckExt(EXT_global_priority, VKXX); \ CheckExt(AMD_buffer_marker, VKXX); \ - CheckExt(EXT_vertex_attribute_divisor, VKXX); + CheckExt(EXT_vertex_attribute_divisor, VKXX); \ + CheckExt(EXT_sampler_filter_minmax, VKXX); #define HookInitVulkanInstanceExts() \ HookInitExtension(KHR_surface, DestroySurfaceKHR); \ diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index ec5d6d55c..78173ecfa 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -632,6 +632,16 @@ void VulkanCreationInfo::Sampler::Init(VulkanResourceManager *resourceMan, Vulka maxLod = pCreateInfo->maxLod; borderColor = pCreateInfo->borderColor; unnormalizedCoordinates = pCreateInfo->unnormalizedCoordinates != 0; + + reductionMode = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT; + + const VkSamplerReductionModeCreateInfoEXT *reduction = + (const VkSamplerReductionModeCreateInfoEXT *)FindNextStruct( + pCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT); + if(reduction) + { + reductionMode = reduction->reductionMode; + } } static TextureSwizzle Convert(VkComponentSwizzle s, int i) diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index e68e47bb3..444a3c345 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -372,6 +372,7 @@ struct VulkanCreationInfo float maxLod; VkBorderColor borderColor; bool unnormalizedCoordinates; + VkSamplerReductionModeEXT reductionMode; }; map m_Sampler; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 9d28893fd..437b9f301 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1307,7 +1307,8 @@ void VulkanReplay::SavePipelineState() // sampler info el.filter = MakeFilter(sampl.minFilter, sampl.magFilter, sampl.mipmapMode, - sampl.maxAnisotropy > 1.0f, sampl.compareEnable); + sampl.maxAnisotropy > 1.0f, sampl.compareEnable, + sampl.reductionMode); el.addressU = MakeAddressMode(sampl.address[0]); el.addressV = MakeAddressMode(sampl.address[1]); el.addressW = MakeAddressMode(sampl.address[2]); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 6ed555487..5afbbcee0 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -182,7 +182,11 @@ SERIALISE_VK_HANDLES(); \ /* VK_EXT_vertex_attribute_divisor */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, \ - VkPipelineVertexInputDivisorStateCreateInfoEXT) + VkPipelineVertexInputDivisorStateCreateInfoEXT) \ + \ + /* VK_EXT_sampler_filter_minmax */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, \ + VkSamplerReductionModeCreateInfoEXT) template static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext) @@ -2330,6 +2334,21 @@ void Deserialise(const VkPipelineVertexInputDivisorStateCreateInfoEXT &el) delete[] el.pVertexBindingDivisors; } +template +void DoSerialise(SerialiserType &ser, VkSamplerReductionModeCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(reductionMode); +} + +template <> +void Deserialise(const VkSamplerReductionModeCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + INSTANTIATE_SERIALISE_TYPE(VkOffset2D); INSTANTIATE_SERIALISE_TYPE(VkExtent2D); INSTANTIATE_SERIALISE_TYPE(VkMemoryType); @@ -2432,6 +2451,7 @@ INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkBindImageMemoryInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT); +INSTANTIATE_SERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(DescriptorSetSlot); INSTANTIATE_SERIALISE_TYPE(ImageRegionState); diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index f5e39a936..eda7426dd 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -1712,6 +1712,18 @@ std::string DoStringise(const VkTessellationDomainOriginKHR &el) END_ENUM_STRINGISE(); } +template <> +std::string DoStringise(const VkSamplerReductionModeEXT &el) +{ + BEGIN_ENUM_STRINGISE(VkSamplerReductionModeEXT); + { + STRINGISE_ENUM(VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT) + STRINGISE_ENUM(VK_SAMPLER_REDUCTION_MODE_MIN_EXT) + STRINGISE_ENUM(VK_SAMPLER_REDUCTION_MODE_MAX_EXT) + } + END_ENUM_STRINGISE(); +} + template <> std::string DoStringise(const VkExtent3D &el) {