1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-01 19:29:16 +01:00

[dxvk] Replace VK_KHR_depth_stencil_resolve with core feature

This commit is contained in:
Philip Rebohle 2022-07-14 20:13:38 +02:00
parent b701dd497f
commit 956f293a69
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
10 changed files with 59 additions and 67 deletions

@ -1071,8 +1071,8 @@ namespace dxvk {
else { else {
ctx->resolveDepthStencilImage( ctx->resolveDepthStencilImage(
cDstImage, cSrcImage, cRegion, cDstImage, cSrcImage, cRegion,
VK_RESOLVE_MODE_AVERAGE_BIT_KHR, VK_RESOLVE_MODE_AVERAGE_BIT,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR); VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
} }
}); });
}; };
@ -4250,8 +4250,8 @@ namespace dxvk {
else { else {
ctx->resolveDepthStencilImage( ctx->resolveDepthStencilImage(
cResolveImage, cMainImage, region, cResolveImage, cMainImage, region,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR); VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
} }
}); });
} }
@ -6876,7 +6876,7 @@ namespace dxvk {
// We should resolve using the first sample according to // 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 // 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." // "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; VkImageResolve region;
region.srcSubresource = cSrcSubres; region.srcSubresource = cSrcSubres;

@ -283,7 +283,7 @@ namespace dxvk {
DxvkDeviceFeatures enabledFeatures) { DxvkDeviceFeatures enabledFeatures) {
DxvkDeviceExtensions devExtensions; DxvkDeviceExtensions devExtensions;
std::array<DxvkExt*, 29> devExtensionList = {{ std::array<DxvkExt*, 28> devExtensionList = {{
&devExtensions.amdMemoryOverallocationBehaviour, &devExtensions.amdMemoryOverallocationBehaviour,
&devExtensions.amdShaderFragmentMask, &devExtensions.amdShaderFragmentMask,
&devExtensions.ext4444Formats, &devExtensions.ext4444Formats,
@ -303,7 +303,6 @@ namespace dxvk {
&devExtensions.extShaderStencilExport, &devExtensions.extShaderStencilExport,
&devExtensions.extTransformFeedback, &devExtensions.extTransformFeedback,
&devExtensions.extVertexAttributeDivisor, &devExtensions.extVertexAttributeDivisor,
&devExtensions.khrDepthStencilResolve,
&devExtensions.khrDriverProperties, &devExtensions.khrDriverProperties,
&devExtensions.khrDynamicRendering, &devExtensions.khrDynamicRendering,
&devExtensions.khrExternalMemoryWin32, &devExtensions.khrExternalMemoryWin32,
@ -662,11 +661,6 @@ namespace dxvk {
m_deviceInfo.extVertexAttributeDivisor.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extVertexAttributeDivisor); 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)) { 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.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
m_deviceInfo.khrDeviceDriverProperties.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDeviceDriverProperties); m_deviceInfo.khrDeviceDriverProperties.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDeviceDriverProperties);

@ -1809,8 +1809,8 @@ namespace dxvk {
} else { } else {
this->resolveImageFb( this->resolveImageFb(
dstImage, srcImage, region, format, dstImage, srcImage, region, format,
VK_RESOLVE_MODE_NONE_KHR, VK_RESOLVE_MODE_NONE,
VK_RESOLVE_MODE_NONE_KHR); VK_RESOLVE_MODE_NONE);
} }
} }
@ -1819,8 +1819,8 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode) { VkResolveModeFlagBits stencilMode) {
this->spillRenderPass(true); this->spillRenderPass(true);
this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(region.dstSubresource)); this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(region.dstSubresource));
this->prepareImage(m_execBarriers, srcImage, vk::makeSubresourceRange(region.srcSubresource)); this->prepareImage(m_execBarriers, srcImage, vk::makeSubresourceRange(region.srcSubresource));
@ -1834,7 +1834,7 @@ namespace dxvk {
if (!(region.dstSubresource.aspectMask if (!(region.dstSubresource.aspectMask
& region.srcSubresource.aspectMask & region.srcSubresource.aspectMask
& VK_IMAGE_ASPECT_STENCIL_BIT)) & 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 // We can only use the depth-stencil resolve path if we are resolving
// a full subresource and both images have the same format. // a full subresource and both images have the same format.
@ -1844,7 +1844,7 @@ namespace dxvk {
if (!useFb) { if (!useFb) {
// Additionally, the given mode combination must be supported. // 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 useFb |= (properties.supportedDepthResolveModes & depthMode) != depthMode
|| (properties.supportedStencilResolveModes & stencilMode) != stencilMode; || (properties.supportedStencilResolveModes & stencilMode) != stencilMode;
@ -3711,8 +3711,8 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode) { VkResolveModeFlagBits stencilMode) {
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource);
@ -3813,8 +3813,8 @@ namespace dxvk {
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkFormat format, VkFormat format,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode) { VkResolveModeFlagBits stencilMode) {
this->invalidateState(); this->invalidateState();
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
@ -3829,9 +3829,9 @@ namespace dxvk {
bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent); bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent);
if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) 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) if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)
doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE_KHR; doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE;
VkPipelineStageFlags dstStages; VkPipelineStageFlags dstStages;
VkImageLayout dstLayout; VkImageLayout dstLayout;

@ -832,8 +832,8 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode); VkResolveModeFlagBits stencilMode);
/** /**
* \brief Transforms image subresource layouts * \brief Transforms image subresource layouts
@ -1270,16 +1270,16 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode); VkResolveModeFlagBits stencilMode);
void resolveImageFb( void resolveImageFb(
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageResolve& region, const VkImageResolve& region,
VkFormat format, VkFormat format,
VkResolveModeFlagBitsKHR depthMode, VkResolveModeFlagBits depthMode,
VkResolveModeFlagBitsKHR stencilMode); VkResolveModeFlagBits stencilMode);
void performClear( void performClear(
const Rc<DxvkImageView>& imageView, const Rc<DxvkImageView>& imageView,

@ -22,7 +22,6 @@ namespace dxvk {
VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2; VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2;
VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback; VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback;
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor; VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
VkPhysicalDeviceDepthStencilResolvePropertiesKHR khrDepthStencilResolve;
VkPhysicalDeviceDriverPropertiesKHR khrDeviceDriverProperties; VkPhysicalDeviceDriverPropertiesKHR khrDeviceDriverProperties;
VkPhysicalDeviceFloatControlsPropertiesKHR khrShaderFloatControls; VkPhysicalDeviceFloatControlsPropertiesKHR khrShaderFloatControls;
}; };

@ -295,7 +295,6 @@ namespace dxvk {
DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_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 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 khrDriverProperties = { VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt khrDynamicRendering = { VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt khrDynamicRendering = { VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, DxvkExtMode::Required };
DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional };

@ -95,8 +95,8 @@ namespace dxvk {
DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline( DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline(
VkFormat format, VkFormat format,
VkSampleCountFlagBits samples, VkSampleCountFlagBits samples,
VkResolveModeFlagBitsKHR depthResolveMode, VkResolveModeFlagBits depthResolveMode,
VkResolveModeFlagBitsKHR stencilResolveMode) { VkResolveModeFlagBits stencilResolveMode) {
std::lock_guard<dxvk::mutex> lock(m_mutex); std::lock_guard<dxvk::mutex> lock(m_mutex);
DxvkMetaResolvePipelineKey key; DxvkMetaResolvePipelineKey key;
@ -214,8 +214,8 @@ namespace dxvk {
std::array<VkSpecializationMapEntry, 3> specEntries = {{ std::array<VkSpecializationMapEntry, 3> specEntries = {{
{ 0, offsetof(DxvkMetaResolvePipelineKey, samples), sizeof(VkSampleCountFlagBits) }, { 0, offsetof(DxvkMetaResolvePipelineKey, samples), sizeof(VkSampleCountFlagBits) },
{ 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBitsKHR) }, { 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBits) },
{ 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBitsKHR) }, { 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBits) },
}}; }};
VkSpecializationInfo specInfo; VkSpecializationInfo specInfo;
@ -304,10 +304,10 @@ namespace dxvk {
stencilOp.writeMask = 0xFFFFFFFF; stencilOp.writeMask = 0xFFFFFFFF;
VkPipelineDepthStencilStateCreateInfo dsState = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO }; VkPipelineDepthStencilStateCreateInfo dsState = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO };
dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR; dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE;
dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR; dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE;
dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS; 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.front = stencilOp;
dsState.back = stencilOp; dsState.back = stencilOp;

@ -32,8 +32,8 @@ namespace dxvk {
struct DxvkMetaResolvePipelineKey { struct DxvkMetaResolvePipelineKey {
VkFormat format; VkFormat format;
VkSampleCountFlagBits samples; VkSampleCountFlagBits samples;
VkResolveModeFlagBitsKHR modeD; VkResolveModeFlagBits modeD;
VkResolveModeFlagBitsKHR modeS; VkResolveModeFlagBits modeS;
bool eq(const DxvkMetaResolvePipelineKey& other) const { bool eq(const DxvkMetaResolvePipelineKey& other) const {
return this->format == other.format return this->format == other.format
@ -105,8 +105,8 @@ namespace dxvk {
DxvkMetaResolvePipeline getPipeline( DxvkMetaResolvePipeline getPipeline(
VkFormat format, VkFormat format,
VkSampleCountFlagBits samples, VkSampleCountFlagBits samples,
VkResolveModeFlagBitsKHR depthResolveMode, VkResolveModeFlagBits depthResolveMode,
VkResolveModeFlagBitsKHR stencilResolveMode); VkResolveModeFlagBits stencilResolveMode);
private: private:

@ -1,13 +1,13 @@
#version 450 #version 450
#define VK_RESOLVE_MODE_NONE_KHR (0) #define VK_RESOLVE_MODE_NONE (0)
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0) #define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1) #define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1)
#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2) #define VK_RESOLVE_MODE_MIN_BIT (1 << 2)
#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3) #define VK_RESOLVE_MODE_MAX_BIT (1 << 3)
layout(constant_id = 0) const int c_samples = 1; 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; layout(binding = 0) uniform sampler2DMSArray s_depth;
@ -20,24 +20,24 @@ float resolve_depth(ivec3 coord) {
float depth = 0.0f; float depth = 0.0f;
switch (c_mode_d) { 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; depth = texelFetch(s_depth, coord, 0).r;
break; break;
case VK_RESOLVE_MODE_AVERAGE_BIT_KHR: case VK_RESOLVE_MODE_AVERAGE_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth += texelFetch(s_depth, coord, i).r; depth += texelFetch(s_depth, coord, i).r;
depth /= float(c_samples); depth /= float(c_samples);
break; break;
case VK_RESOLVE_MODE_MIN_BIT_KHR: case VK_RESOLVE_MODE_MIN_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth = min(depth, texelFetch(s_depth, coord, i).r); depth = min(depth, texelFetch(s_depth, coord, i).r);
break; break;
case VK_RESOLVE_MODE_MAX_BIT_KHR: case VK_RESOLVE_MODE_MAX_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth = max(depth, texelFetch(s_depth, coord, i).r); depth = max(depth, texelFetch(s_depth, coord, i).r);

@ -2,15 +2,15 @@
#extension GL_ARB_shader_stencil_export : enable #extension GL_ARB_shader_stencil_export : enable
#define VK_RESOLVE_MODE_NONE_KHR (0) #define VK_RESOLVE_MODE_NONE (0)
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0) #define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1) #define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1)
#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2) #define VK_RESOLVE_MODE_MIN_BIT (1 << 2)
#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3) #define VK_RESOLVE_MODE_MAX_BIT (1 << 3)
layout(constant_id = 0) const int c_samples = 1; 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(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; layout(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
layout(binding = 0) uniform sampler2DMSArray s_depth; layout(binding = 0) uniform sampler2DMSArray s_depth;
layout(binding = 1) uniform usampler2DMSArray s_stencil; layout(binding = 1) uniform usampler2DMSArray s_stencil;
@ -24,24 +24,24 @@ float resolve_depth(ivec3 coord) {
float depth = 0.0f; float depth = 0.0f;
switch (c_mode_d) { 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; depth = texelFetch(s_depth, coord, 0).r;
break; break;
case VK_RESOLVE_MODE_AVERAGE_BIT_KHR: case VK_RESOLVE_MODE_AVERAGE_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth += texelFetch(s_depth, coord, i).r; depth += texelFetch(s_depth, coord, i).r;
depth /= float(c_samples); depth /= float(c_samples);
break; break;
case VK_RESOLVE_MODE_MIN_BIT_KHR: case VK_RESOLVE_MODE_MIN_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth = min(depth, texelFetch(s_depth, coord, i).r); depth = min(depth, texelFetch(s_depth, coord, i).r);
break; break;
case VK_RESOLVE_MODE_MAX_BIT_KHR: case VK_RESOLVE_MODE_MAX_BIT:
depth = texelFetch(s_depth, coord, 0).r; depth = texelFetch(s_depth, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
depth = max(depth, texelFetch(s_depth, coord, i).r); depth = max(depth, texelFetch(s_depth, coord, i).r);
@ -55,17 +55,17 @@ int resolve_stencil(ivec3 coord) {
uint stencil = 0u; uint stencil = 0u;
switch (c_mode_s) { 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; stencil = texelFetch(s_stencil, coord, 0).r;
break; break;
case VK_RESOLVE_MODE_MIN_BIT_KHR: case VK_RESOLVE_MODE_MIN_BIT:
stencil = texelFetch(s_stencil, coord, 0).r; stencil = texelFetch(s_stencil, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
stencil = min(stencil, texelFetch(s_stencil, coord, i).r); stencil = min(stencil, texelFetch(s_stencil, coord, i).r);
break; break;
case VK_RESOLVE_MODE_MAX_BIT_KHR: case VK_RESOLVE_MODE_MAX_BIT:
stencil = texelFetch(s_stencil, coord, 0).r; stencil = texelFetch(s_stencil, coord, 0).r;
for (int i = 1; i < c_samples; i++) for (int i = 1; i < c_samples; i++)
stencil = max(stencil, texelFetch(s_stencil, coord, i).r); stencil = max(stencil, texelFetch(s_stencil, coord, i).r);