From 9f7a5a077f117048a77096dc712ef274c789a309 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 22 Jun 2021 06:50:43 +0200 Subject: [PATCH] [dxvk] Fix broken row/slice alignment in buffer<->image copies If the specified row or slice alignment matches the row size exactly but is not a power of two, we could accidentally screw up the alignment. --- src/dxvk/dxvk_context.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index ec186e49..c26f6d36 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2751,12 +2751,12 @@ namespace dxvk { VkDeviceSize rowPitch = blockCount.width * elementSize; if (bufferRowAlignment > elementSize) - rowPitch = bufferRowAlignment > rowPitch ? bufferRowAlignment : align(rowPitch, bufferRowAlignment); + rowPitch = bufferRowAlignment >= rowPitch ? bufferRowAlignment : align(rowPitch, bufferRowAlignment); VkDeviceSize slicePitch = blockCount.height * rowPitch; if (image->info().type == VK_IMAGE_TYPE_3D && bufferSliceAlignment > elementSize) - slicePitch = bufferSliceAlignment > slicePitch ? bufferSliceAlignment : align(slicePitch, bufferSliceAlignment); + slicePitch = bufferSliceAlignment >= slicePitch ? bufferSliceAlignment : align(slicePitch, bufferSliceAlignment); copyRegion.bufferOffset = aspectOffset; copyRegion.bufferRowLength = formatInfo->blockSize.width * rowPitch / elementSize; @@ -2779,7 +2779,7 @@ namespace dxvk { VkDeviceSize layerPitch = aspectOffset - bufferOffset; if (bufferSliceAlignment) - layerPitch = bufferSliceAlignment > layerPitch ? bufferSliceAlignment : align(layerPitch, bufferSliceAlignment); + layerPitch = bufferSliceAlignment >= layerPitch ? bufferSliceAlignment : align(layerPitch, bufferSliceAlignment); bufferOffset += layerPitch; }