From 956b23c9e9adf21735422178695d8b86c183ce86 Mon Sep 17 00:00:00 2001 From: Robin Kertels Date: Wed, 18 Aug 2021 22:12:48 +0200 Subject: [PATCH] [d3d9] Use correct pitch to calculate buffer offset --- src/d3d9/d3d9_device.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 869e37de..7115c880 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -701,12 +701,11 @@ namespace dxvk { DxvkBufferSliceHandle srcSlice = srcTextureInfo->GetMappedSlice(src->GetSubresource()); VkDeviceSize dirtySize = copyBlockCount.width * copyBlockCount.height * formatInfo->elementSize; D3D9BufferSlice slice = AllocTempBuffer(dirtySize); - VkDeviceSize copySrcOffset = (srcBlockOffset.z * texLevelBlockCount.height * texLevelBlockCount.width - + srcBlockOffset.y * texLevelBlockCount.width - + srcBlockOffset.x) - * formatInfo->elementSize; - VkDeviceSize pitch = align(texLevelBlockCount.width * formatInfo->elementSize, 4); + VkDeviceSize copySrcOffset = srcBlockOffset.z * texLevelBlockCount.height * pitch + + srcBlockOffset.y * pitch + + srcBlockOffset.x * formatInfo->elementSize; + void* srcData = reinterpret_cast(srcSlice.mapPtr) + copySrcOffset; util::packImageData( slice.mapPtr, srcData, copyBlockCount, formatInfo->elementSize, @@ -791,12 +790,11 @@ namespace dxvk { VkDeviceSize dirtySize = scaledBoxExtentBlockCount.width * scaledBoxExtentBlockCount.height * scaledBoxExtentBlockCount.depth * formatInfo->elementSize; D3D9BufferSlice slice = AllocTempBuffer(dirtySize); VkOffset3D boxOffsetBlockCount = util::computeBlockOffset(scaledBoxOffset, formatInfo->blockSize); - VkDeviceSize copySrcOffset = (boxOffsetBlockCount.z * texLevelExtentBlockCount.height * texLevelExtentBlockCount.width - + boxOffsetBlockCount.y * texLevelExtentBlockCount.width - + boxOffsetBlockCount.x) - * formatInfo->elementSize; - VkDeviceSize pitch = align(texLevelExtentBlockCount.width * formatInfo->elementSize, 4); + VkDeviceSize copySrcOffset = boxOffsetBlockCount.z * texLevelExtentBlockCount.height * pitch + + boxOffsetBlockCount.y * pitch + + boxOffsetBlockCount.x * formatInfo->elementSize; + void* srcData = reinterpret_cast(srcTexInfo->GetMappedSlice(srcTexInfo->CalcSubresource(a, m)).mapPtr) + copySrcOffset; util::packImageData( slice.mapPtr, srcData, scaledBoxExtentBlockCount, formatInfo->elementSize, @@ -4429,11 +4427,10 @@ namespace dxvk { scaledAlignedBoxExtent.depth = std::min(texLevelExtent.depth - scaledBoxOffset.z, scaledAlignedBoxExtent.depth); VkOffset3D boxOffsetBlockCount = util::computeBlockOffset(scaledBoxOffset, formatInfo->blockSize); - VkDeviceSize copySrcOffset = (boxOffsetBlockCount.z * texLevelExtentBlockCount.height * texLevelExtentBlockCount.width - + boxOffsetBlockCount.y * texLevelExtentBlockCount.width - + boxOffsetBlockCount.x) - * formatInfo->elementSize; VkDeviceSize pitch = align(texLevelExtentBlockCount.width * formatInfo->elementSize, 4); + VkDeviceSize copySrcOffset = boxOffsetBlockCount.z * texLevelExtentBlockCount.height * pitch + + boxOffsetBlockCount.y * pitch + + boxOffsetBlockCount.x * formatInfo->elementSize; VkDeviceSize rowAlignment = 0; DxvkBufferSlice copySrcSlice;