[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

View File

@ -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;

View File

@ -283,7 +283,7 @@ namespace dxvk {
DxvkDeviceFeatures enabledFeatures) {
DxvkDeviceExtensions devExtensions;
std::array<DxvkExt*, 29> devExtensionList = {{
std::array<DxvkExt*, 28> 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);

View File

@ -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<DxvkImage>& dstImage,
const Rc<DxvkImage>& 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<DxvkImage>& dstImage,
const Rc<DxvkImage>& 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<DxvkImage>& 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;

View File

@ -832,8 +832,8 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& 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<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage,
const VkImageResolve& region,
VkResolveModeFlagBitsKHR depthMode,
VkResolveModeFlagBitsKHR stencilMode);
VkResolveModeFlagBits depthMode,
VkResolveModeFlagBits stencilMode);
void resolveImageFb(
const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage,
const VkImageResolve& region,
VkFormat format,
VkResolveModeFlagBitsKHR depthMode,
VkResolveModeFlagBitsKHR stencilMode);
VkResolveModeFlagBits depthMode,
VkResolveModeFlagBits stencilMode);
void performClear(
const Rc<DxvkImageView>& imageView,

View File

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

View File

@ -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 };

View File

@ -95,8 +95,8 @@ namespace dxvk {
DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline(
VkFormat format,
VkSampleCountFlagBits samples,
VkResolveModeFlagBitsKHR depthResolveMode,
VkResolveModeFlagBitsKHR stencilResolveMode) {
VkResolveModeFlagBits depthResolveMode,
VkResolveModeFlagBits stencilResolveMode) {
std::lock_guard<dxvk::mutex> lock(m_mutex);
DxvkMetaResolvePipelineKey key;
@ -214,8 +214,8 @@ namespace dxvk {
std::array<VkSpecializationMapEntry, 3> 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;

View File

@ -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:

View File

@ -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);

View File

@ -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);