diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 7d7e496d..1965c12d 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -342,12 +342,22 @@ namespace dxvk { cDstSlice = dstBuffer.subSlice(dstOffset, regLength), cSrcSlice = srcBuffer.subSlice(srcOffset, regLength) ] (DxvkContext* ctx) { - ctx->copyBuffer( - cDstSlice.buffer(), - cDstSlice.offset(), - cSrcSlice.buffer(), - cSrcSlice.offset(), - cSrcSlice.length()); + bool sameResource = cDstSlice.buffer() == cSrcSlice.buffer(); + + if (!sameResource) { + ctx->copyBuffer( + cDstSlice.buffer(), + cDstSlice.offset(), + cSrcSlice.buffer(), + cSrcSlice.offset(), + cSrcSlice.length()); + } else { + ctx->copyBufferRegion( + cDstSlice.buffer(), + cDstSlice.offset(), + cSrcSlice.offset(), + cSrcSlice.length()); + } }); } else { const D3D11CommonTexture* dstTextureInfo = GetCommonTexture(pDstResource); @@ -476,10 +486,20 @@ namespace dxvk { cSrcOffset = srcOffset, cExtent = regExtent ] (DxvkContext* ctx) { - ctx->copyImage( - cDstImage, cDstLayers, cDstOffset, - cSrcImage, cSrcLayers, cSrcOffset, - cExtent); + bool sameSubresource = cDstImage == cSrcImage + && cDstLayers == cSrcLayers; + + if (!sameSubresource) { + ctx->copyImage( + cDstImage, cDstLayers, cDstOffset, + cSrcImage, cSrcLayers, cSrcOffset, + cExtent); + } else { + ctx->copyImageRegion( + cDstImage, cDstLayers, + cDstOffset, cSrcOffset, + cExtent); + } }); } } diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index d8d46555..77d555f8 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1153,7 +1153,7 @@ namespace dxvk { info->DiscardAPIsSeenByDriver = TRUE; info->FlagsForUpdateAndCopySeenByDriver = TRUE; info->ClearView = TRUE; - info->CopyWithOverlap = FALSE; + info->CopyWithOverlap = TRUE; info->ConstantBufferPartialUpdate = TRUE; info->ConstantBufferOffsetting = TRUE; info->MapNoOverwriteOnDynamicConstantBuffer = TRUE;