mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22: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,
|
cSrcImage = srcImage,
|
||||||
cRegion = region
|
cRegion = region
|
||||||
] (DxvkContext* ctx) {
|
] (DxvkContext* ctx) {
|
||||||
if (cRegion.srcSubresource.aspectMask != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
// Deliberately use AVERAGE even for depth resolves here
|
||||||
ctx->resolveImage(cDstImage, cSrcImage, cRegion, cSrcImage->info().format,
|
ctx->resolveImage(cDstImage, cSrcImage, cRegion, cSrcImage->info().format,
|
||||||
VK_RESOLVE_MODE_AVERAGE_BIT, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
|
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);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -4943,16 +4936,8 @@ namespace dxvk {
|
|||||||
region.dstOffset = VkOffset3D { 0, 0, 0 };
|
region.dstOffset = VkOffset3D { 0, 0, 0 };
|
||||||
region.extent = cMainImage->mipLevelExtent(cSubresource.mipLevel);
|
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,
|
||||||
ctx->resolveImage(cResolveImage, cMainImage, region, format,
|
getDefaultResolveMode(format), VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
|
||||||
getDefaultResolveMode(format), VK_RESOLVE_MODE_NONE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ctx->resolveDepthStencilImage(
|
|
||||||
cResolveImage, cMainImage, region,
|
|
||||||
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
|
|
||||||
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8176,8 +8161,6 @@ 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;
|
|
||||||
|
|
||||||
VkImageResolve region;
|
VkImageResolve region;
|
||||||
region.srcSubresource = cSrcSubres;
|
region.srcSubresource = cSrcSubres;
|
||||||
region.srcOffset = VkOffset3D { 0, 0, 0 };
|
region.srcOffset = VkOffset3D { 0, 0, 0 };
|
||||||
@ -8185,7 +8168,8 @@ namespace dxvk {
|
|||||||
region.dstOffset = VkOffset3D { 0, 0, 0 };
|
region.dstOffset = VkOffset3D { 0, 0, 0 };
|
||||||
region.extent = cDstImage->mipLevelExtent(cDstSubres.mipLevel);
|
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;
|
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 = { };
|
DxvkImageUsageInfo dstUsage = { };
|
||||||
dstUsage.viewFormatCount = 1;
|
dstUsage.viewFormatCount = 1;
|
||||||
dstUsage.viewFormats = &format;
|
dstUsage.viewFormats = &format;
|
||||||
@ -1999,6 +1999,8 @@ namespace dxvk {
|
|||||||
dstUsage.access = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
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;
|
DxvkImageUsageInfo srcUsage = dstUsage;
|
||||||
|
|
||||||
if (useFb) {
|
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(
|
void DxvkContext::transformImage(
|
||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const VkImageSubresourceRange& dstSubresources,
|
const VkImageSubresourceRange& dstSubresources,
|
||||||
@ -2544,13 +2486,8 @@ namespace dxvk {
|
|||||||
region.srcSubresource.layerCount = layerCount;
|
region.srcSubresource.layerCount = layerCount;
|
||||||
region.extent = resolve.imageView->mipLevelExtent(0u);
|
region.extent = resolve.imageView->mipLevelExtent(0u);
|
||||||
|
|
||||||
if (dstSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
resolveImage(resolve.imageView->image(), attachment.view->image(),
|
||||||
resolveDepthStencilImage(resolve.imageView->image(),
|
region, attachment.view->info().format, resolve.depthMode, resolve.stencilMode);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve.layerMask &= ~0u << (layerIndex + layerCount);
|
resolve.layerMask &= ~0u << (layerIndex + layerCount);
|
||||||
}
|
}
|
||||||
|
@ -1057,22 +1057,6 @@ namespace dxvk {
|
|||||||
VkResolveModeFlagBits mode,
|
VkResolveModeFlagBits mode,
|
||||||
VkResolveModeFlagBits stencilMode);
|
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
|
* \brief Transforms image subresource layouts
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user