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:
parent
e0dea48dae
commit
50af4d497c
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user