From 956f293a69fafc34a1069d92b4679d5a08ac11d1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 14 Jul 2022 20:13:38 +0200 Subject: [PATCH] [dxvk] Replace VK_KHR_depth_stencil_resolve with core feature --- src/d3d9/d3d9_device.cpp | 10 ++++---- src/dxvk/dxvk_adapter.cpp | 8 +------ src/dxvk/dxvk_context.cpp | 24 +++++++++---------- src/dxvk/dxvk_context.h | 12 +++++----- src/dxvk/dxvk_device_info.h | 1 - src/dxvk/dxvk_extensions.h | 1 - src/dxvk/dxvk_meta_resolve.cpp | 14 +++++------ src/dxvk/dxvk_meta_resolve.h | 8 +++---- src/dxvk/shaders/dxvk_resolve_frag_d.frag | 20 ++++++++-------- src/dxvk/shaders/dxvk_resolve_frag_ds.frag | 28 +++++++++++----------- 10 files changed, 59 insertions(+), 67 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 9e1581c24..a09ee6347 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -1071,8 +1071,8 @@ namespace dxvk { else { ctx->resolveDepthStencilImage( cDstImage, cSrcImage, cRegion, - VK_RESOLVE_MODE_AVERAGE_BIT_KHR, - VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR); + VK_RESOLVE_MODE_AVERAGE_BIT, + VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); } }); }; @@ -4250,8 +4250,8 @@ namespace dxvk { else { ctx->resolveDepthStencilImage( cResolveImage, cMainImage, region, - VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR, - VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR); + VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, + VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); } }); } @@ -6876,7 +6876,7 @@ namespace dxvk { // We should resolve using the first sample according to // http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/Advanced-DX9-Capabilities-for-ATI-Radeon-Cards_v2.pdf // "The resolve operation copies the depth value from the *first sample only* into the resolved depth stencil texture." - constexpr auto resolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; + constexpr auto resolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; VkImageResolve region; region.srcSubresource = cSrcSubres; diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 6ad12f6d4..4cf6a4027 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -283,7 +283,7 @@ namespace dxvk { DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; - std::array devExtensionList = {{ + std::array devExtensionList = {{ &devExtensions.amdMemoryOverallocationBehaviour, &devExtensions.amdShaderFragmentMask, &devExtensions.ext4444Formats, @@ -303,7 +303,6 @@ namespace dxvk { &devExtensions.extShaderStencilExport, &devExtensions.extTransformFeedback, &devExtensions.extVertexAttributeDivisor, - &devExtensions.khrDepthStencilResolve, &devExtensions.khrDriverProperties, &devExtensions.khrDynamicRendering, &devExtensions.khrExternalMemoryWin32, @@ -662,11 +661,6 @@ namespace dxvk { m_deviceInfo.extVertexAttributeDivisor.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extVertexAttributeDivisor); } - if (m_deviceExtensions.supports(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)) { - m_deviceInfo.khrDepthStencilResolve.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR; - m_deviceInfo.khrDepthStencilResolve.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDepthStencilResolve); - } - if (m_deviceExtensions.supports(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) { m_deviceInfo.khrDeviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR; m_deviceInfo.khrDeviceDriverProperties.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDeviceDriverProperties); diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b51c43290..f77d24207 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1809,8 +1809,8 @@ namespace dxvk { } else { this->resolveImageFb( dstImage, srcImage, region, format, - VK_RESOLVE_MODE_NONE_KHR, - VK_RESOLVE_MODE_NONE_KHR); + VK_RESOLVE_MODE_NONE, + VK_RESOLVE_MODE_NONE); } } @@ -1819,8 +1819,8 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageResolve& region, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode) { + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode) { this->spillRenderPass(true); this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(region.dstSubresource)); this->prepareImage(m_execBarriers, srcImage, vk::makeSubresourceRange(region.srcSubresource)); @@ -1834,7 +1834,7 @@ namespace dxvk { if (!(region.dstSubresource.aspectMask & region.srcSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)) - stencilMode = VK_RESOLVE_MODE_NONE_KHR; + stencilMode = VK_RESOLVE_MODE_NONE; // We can only use the depth-stencil resolve path if we are resolving // a full subresource and both images have the same format. @@ -1844,7 +1844,7 @@ namespace dxvk { if (!useFb) { // Additionally, the given mode combination must be supported. - const auto& properties = m_device->properties().khrDepthStencilResolve; + const auto& properties = m_device->properties().vk12; useFb |= (properties.supportedDepthResolveModes & depthMode) != depthMode || (properties.supportedStencilResolveModes & stencilMode) != stencilMode; @@ -3711,8 +3711,8 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageResolve& region, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode) { + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode) { auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource); @@ -3813,8 +3813,8 @@ namespace dxvk { const Rc& srcImage, const VkImageResolve& region, VkFormat format, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode) { + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode) { this->invalidateState(); auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); @@ -3829,9 +3829,9 @@ namespace dxvk { bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent); if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) - doDiscard &= depthMode != VK_RESOLVE_MODE_NONE_KHR; + doDiscard &= depthMode != VK_RESOLVE_MODE_NONE; if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) - doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE_KHR; + doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE; VkPipelineStageFlags dstStages; VkImageLayout dstLayout; diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 6047617a6..5f4528124 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -832,8 +832,8 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageResolve& region, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode); + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode); /** * \brief Transforms image subresource layouts @@ -1270,16 +1270,16 @@ namespace dxvk { const Rc& dstImage, const Rc& srcImage, const VkImageResolve& region, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode); + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode); void resolveImageFb( const Rc& dstImage, const Rc& srcImage, const VkImageResolve& region, VkFormat format, - VkResolveModeFlagBitsKHR depthMode, - VkResolveModeFlagBitsKHR stencilMode); + VkResolveModeFlagBits depthMode, + VkResolveModeFlagBits stencilMode); void performClear( const Rc& imageView, diff --git a/src/dxvk/dxvk_device_info.h b/src/dxvk/dxvk_device_info.h index 69fb1263c..611d94a8b 100644 --- a/src/dxvk/dxvk_device_info.h +++ b/src/dxvk/dxvk_device_info.h @@ -22,7 +22,6 @@ namespace dxvk { VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2; VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback; VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor; - VkPhysicalDeviceDepthStencilResolvePropertiesKHR khrDepthStencilResolve; VkPhysicalDeviceDriverPropertiesKHR khrDeviceDriverProperties; VkPhysicalDeviceFloatControlsPropertiesKHR khrShaderFloatControls; }; diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index cab5dd48f..b012e590b 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -295,7 +295,6 @@ namespace dxvk { DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional }; - DxvkExt khrDepthStencilResolve = { VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt khrDriverProperties = { VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrDynamicRendering = { VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional }; diff --git a/src/dxvk/dxvk_meta_resolve.cpp b/src/dxvk/dxvk_meta_resolve.cpp index 3e84e87af..d1f00697a 100644 --- a/src/dxvk/dxvk_meta_resolve.cpp +++ b/src/dxvk/dxvk_meta_resolve.cpp @@ -95,8 +95,8 @@ namespace dxvk { DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline( VkFormat format, VkSampleCountFlagBits samples, - VkResolveModeFlagBitsKHR depthResolveMode, - VkResolveModeFlagBitsKHR stencilResolveMode) { + VkResolveModeFlagBits depthResolveMode, + VkResolveModeFlagBits stencilResolveMode) { std::lock_guard lock(m_mutex); DxvkMetaResolvePipelineKey key; @@ -214,8 +214,8 @@ namespace dxvk { std::array specEntries = {{ { 0, offsetof(DxvkMetaResolvePipelineKey, samples), sizeof(VkSampleCountFlagBits) }, - { 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBitsKHR) }, - { 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBitsKHR) }, + { 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBits) }, + { 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBits) }, }}; VkSpecializationInfo specInfo; @@ -304,10 +304,10 @@ namespace dxvk { stencilOp.writeMask = 0xFFFFFFFF; VkPipelineDepthStencilStateCreateInfo dsState = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO }; - dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR; - dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR; + dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE; + dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE; dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS; - dsState.stencilTestEnable = key.modeS != VK_RESOLVE_MODE_NONE_KHR; + dsState.stencilTestEnable = key.modeS != VK_RESOLVE_MODE_NONE; dsState.front = stencilOp; dsState.back = stencilOp; diff --git a/src/dxvk/dxvk_meta_resolve.h b/src/dxvk/dxvk_meta_resolve.h index 0f738e01a..5bf26301a 100644 --- a/src/dxvk/dxvk_meta_resolve.h +++ b/src/dxvk/dxvk_meta_resolve.h @@ -32,8 +32,8 @@ namespace dxvk { struct DxvkMetaResolvePipelineKey { VkFormat format; VkSampleCountFlagBits samples; - VkResolveModeFlagBitsKHR modeD; - VkResolveModeFlagBitsKHR modeS; + VkResolveModeFlagBits modeD; + VkResolveModeFlagBits modeS; bool eq(const DxvkMetaResolvePipelineKey& other) const { return this->format == other.format @@ -105,8 +105,8 @@ namespace dxvk { DxvkMetaResolvePipeline getPipeline( VkFormat format, VkSampleCountFlagBits samples, - VkResolveModeFlagBitsKHR depthResolveMode, - VkResolveModeFlagBitsKHR stencilResolveMode); + VkResolveModeFlagBits depthResolveMode, + VkResolveModeFlagBits stencilResolveMode); private: diff --git a/src/dxvk/shaders/dxvk_resolve_frag_d.frag b/src/dxvk/shaders/dxvk_resolve_frag_d.frag index 0b726c97e..dd913bee9 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_d.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_d.frag @@ -1,13 +1,13 @@ #version 450 -#define VK_RESOLVE_MODE_NONE_KHR (0) -#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0) -#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1) -#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2) -#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3) +#define VK_RESOLVE_MODE_NONE (0) +#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0) +#define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1) +#define VK_RESOLVE_MODE_MIN_BIT (1 << 2) +#define VK_RESOLVE_MODE_MAX_BIT (1 << 3) layout(constant_id = 0) const int c_samples = 1; -layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; +layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; layout(binding = 0) uniform sampler2DMSArray s_depth; @@ -20,24 +20,24 @@ float resolve_depth(ivec3 coord) { float depth = 0.0f; switch (c_mode_d) { - case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR: + case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT: depth = texelFetch(s_depth, coord, 0).r; break; - case VK_RESOLVE_MODE_AVERAGE_BIT_KHR: + case VK_RESOLVE_MODE_AVERAGE_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth += texelFetch(s_depth, coord, i).r; depth /= float(c_samples); break; - case VK_RESOLVE_MODE_MIN_BIT_KHR: + case VK_RESOLVE_MODE_MIN_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth = min(depth, texelFetch(s_depth, coord, i).r); break; - case VK_RESOLVE_MODE_MAX_BIT_KHR: + case VK_RESOLVE_MODE_MAX_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth = max(depth, texelFetch(s_depth, coord, i).r); diff --git a/src/dxvk/shaders/dxvk_resolve_frag_ds.frag b/src/dxvk/shaders/dxvk_resolve_frag_ds.frag index 734fe0fbb..3c9564685 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_ds.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_ds.frag @@ -2,15 +2,15 @@ #extension GL_ARB_shader_stencil_export : enable -#define VK_RESOLVE_MODE_NONE_KHR (0) -#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0) -#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1) -#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2) -#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3) +#define VK_RESOLVE_MODE_NONE (0) +#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0) +#define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1) +#define VK_RESOLVE_MODE_MIN_BIT (1 << 2) +#define VK_RESOLVE_MODE_MAX_BIT (1 << 3) layout(constant_id = 0) const int c_samples = 1; -layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; -layout(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; +layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; +layout(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; layout(binding = 0) uniform sampler2DMSArray s_depth; layout(binding = 1) uniform usampler2DMSArray s_stencil; @@ -24,24 +24,24 @@ float resolve_depth(ivec3 coord) { float depth = 0.0f; switch (c_mode_d) { - case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR: + case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT: depth = texelFetch(s_depth, coord, 0).r; break; - case VK_RESOLVE_MODE_AVERAGE_BIT_KHR: + case VK_RESOLVE_MODE_AVERAGE_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth += texelFetch(s_depth, coord, i).r; depth /= float(c_samples); break; - case VK_RESOLVE_MODE_MIN_BIT_KHR: + case VK_RESOLVE_MODE_MIN_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth = min(depth, texelFetch(s_depth, coord, i).r); break; - case VK_RESOLVE_MODE_MAX_BIT_KHR: + case VK_RESOLVE_MODE_MAX_BIT: depth = texelFetch(s_depth, coord, 0).r; for (int i = 1; i < c_samples; i++) depth = max(depth, texelFetch(s_depth, coord, i).r); @@ -55,17 +55,17 @@ int resolve_stencil(ivec3 coord) { uint stencil = 0u; switch (c_mode_s) { - case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR: + case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT: stencil = texelFetch(s_stencil, coord, 0).r; break; - case VK_RESOLVE_MODE_MIN_BIT_KHR: + case VK_RESOLVE_MODE_MIN_BIT: stencil = texelFetch(s_stencil, coord, 0).r; for (int i = 1; i < c_samples; i++) stencil = min(stencil, texelFetch(s_stencil, coord, i).r); break; - case VK_RESOLVE_MODE_MAX_BIT_KHR: + case VK_RESOLVE_MODE_MAX_BIT: stencil = texelFetch(s_stencil, coord, 0).r; for (int i = 1; i < c_samples; i++) stencil = max(stencil, texelFetch(s_stencil, coord, i).r);