Ensure compressed image copy is height compliant Image copy operations on compressed formats must have dimensions that are multiples of the block dimensions, unless the extent dimension + its corresponding offset is equal to the image subresource dimension. Bug: b/168025369 Change-Id: I3e77bfefe78347d4635128ece10f9d48aef40daa Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/48188 Reviewed-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Tested-by: Sean Risser <srisser@google.com> Commit-Queue: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp index a0287cc..596741c 100644 --- a/src/Vulkan/VkImage.cpp +++ b/src/Vulkan/VkImage.cpp
@@ -703,6 +703,7 @@ VkExtent2D adjustedExtent = extent; VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(region.imageSubresource.aspectMask); Format usedFormat = getFormat(aspect); + if(region.bufferRowLength != 0) { adjustedExtent.width = region.bufferRowLength; @@ -710,10 +711,11 @@ if(usedFormat.isCompressed()) { int blockWidth = usedFormat.blockWidth(); - ASSERT((adjustedExtent.width % blockWidth) == 0); - adjustedExtent.width /= blockWidth; + ASSERT((adjustedExtent.width % blockWidth == 0) || (adjustedExtent.width + region.imageOffset.x == extent.width)); + adjustedExtent.width = (region.bufferRowLength + blockWidth - 1) / blockWidth; } } + if(region.bufferImageHeight != 0) { adjustedExtent.height = region.bufferImageHeight; @@ -721,10 +723,11 @@ if(usedFormat.isCompressed()) { int blockHeight = usedFormat.blockHeight(); - ASSERT((adjustedExtent.height % blockHeight) == 0); - adjustedExtent.height /= blockHeight; + ASSERT((adjustedExtent.height % blockHeight == 0) || (adjustedExtent.height + region.imageOffset.y == extent.height)); + adjustedExtent.height = (region.bufferImageHeight + blockHeight - 1) / blockHeight; } } + return adjustedExtent; }