From a9040c5ccedf4fe2c09c5c9437c2b9f0a842a753 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 18 Mar 2020 04:59:27 +0000 Subject: [PATCH] [d3d9] Allow multisampled depth stencil resolves in StretchRect Fixes a crash in some Source 2 titles --- src/d3d9/d3d9_device.cpp | 60 +++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index a90eb7b5..778d6e01 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -943,24 +943,36 @@ namespace dxvk { return D3DERR_INVALIDCALL; } - if (fastPath) { - if (needsResolve) { - VkImageResolve region; - region.srcSubresource = blitInfo.srcSubresource; - region.srcOffset = blitInfo.srcOffsets[0]; - region.dstSubresource = blitInfo.dstSubresource; - region.dstOffset = blitInfo.dstOffsets[0]; - region.extent = srcCopyExtent; - - EmitCs([ - cDstImage = dstImage, - cSrcImage = srcImage, - cRegion = region - ] (DxvkContext* ctx) { + auto EmitResolveCS = [&](const Rc& resolveDst) { + VkImageResolve region; + region.srcSubresource = blitInfo.srcSubresource; + region.srcOffset = blitInfo.srcOffsets[0]; + region.dstSubresource = blitInfo.dstSubresource; + region.dstOffset = blitInfo.dstOffsets[0]; + region.extent = srcCopyExtent; + + EmitCs([ + cDstImage = resolveDst, + 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, VK_FORMAT_UNDEFINED); - }); + } + else { + ctx->resolveDepthStencilImage( + cDstImage, cSrcImage, cRegion, + VK_RESOLVE_MODE_AVERAGE_BIT_KHR, + VK_RESOLVE_MODE_AVERAGE_BIT_KHR); + } + }); + }; + + if (fastPath) { + if (needsResolve) { + EmitResolveCS(dstImage); } else { EmitCs([ cDstImage = dstImage, @@ -982,23 +994,7 @@ namespace dxvk { if (needsResolve) { auto resolveSrc = srcTextureInfo->GetResolveImage(); - VkImageResolve region; - region.srcSubresource = blitInfo.srcSubresource; - region.srcOffset = blitInfo.srcOffsets[0]; - region.dstSubresource = blitInfo.srcSubresource; - region.dstOffset = blitInfo.srcOffsets[0]; - region.extent = srcCopyExtent; - - EmitCs([ - cDstImage = resolveSrc, - cSrcImage = srcImage, - cRegion = region - ] (DxvkContext* ctx) { - ctx->resolveImage( - cDstImage, cSrcImage, cRegion, - VK_FORMAT_UNDEFINED); - }); - + EmitResolveCS(resolveSrc); srcImage = resolveSrc; }