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

[dxvk] Remove resolveDepthStencilResolve method

This commit is contained in:
Philip Rebohle 2025-03-10 20:44:35 +01:00
parent e0dea48dae
commit 50af4d497c
3 changed files with 12 additions and 107 deletions

View File

@ -1352,16 +1352,9 @@ namespace dxvk {
cSrcImage = srcImage,
cRegion = region
] (DxvkContext* ctx) {
if (cRegion.srcSubresource.aspectMask != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
ctx->resolveImage(cDstImage, cSrcImage, cRegion, cSrcImage->info().format,
VK_RESOLVE_MODE_AVERAGE_BIT, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
}
else {
ctx->resolveDepthStencilImage(
cDstImage, cSrcImage, cRegion,
VK_RESOLVE_MODE_AVERAGE_BIT,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
}
// Deliberately use AVERAGE even for depth resolves here
ctx->resolveImage(cDstImage, cSrcImage, cRegion, cSrcImage->info().format,
VK_RESOLVE_MODE_AVERAGE_BIT, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
});
};
@ -4943,16 +4936,8 @@ namespace dxvk {
region.dstOffset = VkOffset3D { 0, 0, 0 };
region.extent = cMainImage->mipLevelExtent(cSubresource.mipLevel);
if (cSubresource.aspectMask != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
ctx->resolveImage(cResolveImage, cMainImage, region, format,
getDefaultResolveMode(format), VK_RESOLVE_MODE_NONE);
}
else {
ctx->resolveDepthStencilImage(
cResolveImage, cMainImage, region,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
}
ctx->resolveImage(cResolveImage, cMainImage, region, format,
getDefaultResolveMode(format), VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
});
}
@ -8176,8 +8161,6 @@ 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;
VkImageResolve region;
region.srcSubresource = cSrcSubres;
region.srcOffset = VkOffset3D { 0, 0, 0 };
@ -8185,7 +8168,8 @@ namespace dxvk {
region.dstOffset = VkOffset3D { 0, 0, 0 };
region.extent = cDstImage->mipLevelExtent(cDstSubres.mipLevel);
ctx->resolveDepthStencilImage(cDstImage, cSrcImage, region, resolveMode, resolveMode);
ctx->resolveImage(cDstImage, cSrcImage, region, cSrcImage->info().format,
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
});
}

View File

@ -1984,7 +1984,7 @@ namespace dxvk {
useFb |= dstImage->info().format != srcImage->info().format;
}
// Ensure that we can actually use both images as intended
// Ensure that we can actually use the destination image as an attachment
DxvkImageUsageInfo dstUsage = { };
dstUsage.viewFormatCount = 1;
dstUsage.viewFormats = &format;
@ -1999,6 +1999,8 @@ namespace dxvk {
dstUsage.access = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
}
// Same for the source image, but check for shader usage
// instead in case we need to use that path
DxvkImageUsageInfo srcUsage = dstUsage;
if (useFb) {
@ -2034,66 +2036,6 @@ namespace dxvk {
}
void DxvkContext::resolveDepthStencilImage(
const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage,
const VkImageResolve& region,
VkResolveModeFlagBits depthMode,
VkResolveModeFlagBits stencilMode) {
// Technically legal, but no-op
if (!depthMode && !stencilMode)
return;
// Subsequent functions expect stencil mode to be None
// if either of the images have no stencil aspect
if (!(region.dstSubresource.aspectMask
& region.srcSubresource.aspectMask
& VK_IMAGE_ASPECT_STENCIL_BIT))
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.
bool useFb = !dstImage->isFullSubresource(region.dstSubresource, region.extent)
|| !srcImage->isFullSubresource(region.srcSubresource, region.extent)
|| dstImage->info().format != srcImage->info().format;
if (!useFb) {
// Additionally, the given mode combination must be supported.
const auto& properties = m_device->properties().vk12;
useFb |= (properties.supportedDepthResolveModes & depthMode) != depthMode
|| (properties.supportedStencilResolveModes & stencilMode) != stencilMode;
if (depthMode != stencilMode) {
useFb |= (!depthMode || !stencilMode)
? !properties.independentResolveNone
: !properties.independentResolve;
}
}
// If the source image is shader-readable anyway, we can use the
// FB path if it's beneficial on the device we're running on
if (m_device->perfHints().preferFbDepthStencilCopy)
useFb |= srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT;
// Only try to inline the resolve if we don't need to use the fb path
if (!useFb && resolveImageInline(dstImage, srcImage, region, dstImage->info().format, depthMode, stencilMode))
return;
this->spillRenderPass(true);
this->prepareImage(dstImage, vk::makeSubresourceRange(region.dstSubresource));
this->prepareImage(srcImage, vk::makeSubresourceRange(region.srcSubresource));
if (useFb) {
this->resolveImageFb(dstImage, srcImage, region,
VK_FORMAT_UNDEFINED, depthMode, stencilMode);
} else {
this->resolveImageRp(dstImage, srcImage, region,
VK_FORMAT_UNDEFINED, depthMode, stencilMode);
}
}
void DxvkContext::transformImage(
const Rc<DxvkImage>& dstImage,
const VkImageSubresourceRange& dstSubresources,
@ -2544,13 +2486,8 @@ namespace dxvk {
region.srcSubresource.layerCount = layerCount;
region.extent = resolve.imageView->mipLevelExtent(0u);
if (dstSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
resolveDepthStencilImage(resolve.imageView->image(),
attachment.view->image(), region, resolve.depthMode, resolve.stencilMode);
} else {
resolveImage(resolve.imageView->image(), attachment.view->image(),
region, attachment.view->info().format, resolve.depthMode, resolve.stencilMode);
}
resolveImage(resolve.imageView->image(), attachment.view->image(),
region, attachment.view->info().format, resolve.depthMode, resolve.stencilMode);
resolve.layerMask &= ~0u << (layerIndex + layerCount);
}

View File

@ -1057,22 +1057,6 @@ namespace dxvk {
VkResolveModeFlagBits mode,
VkResolveModeFlagBits stencilMode);
/**
* \brief Resolves a multisampled depth-stencil resource
*
* \param [in] dstImage Destination image
* \param [in] srcImage Source image
* \param [in] region Region to resolve
* \param [in] depthMode Resolve mode for depth aspect
* \param [in] stencilMode Resolve mode for stencil aspect
*/
void resolveDepthStencilImage(
const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage,
const VkImageResolve& region,
VkResolveModeFlagBits depthMode,
VkResolveModeFlagBits stencilMode);
/**
* \brief Transforms image subresource layouts
*