Commit ba873309 by Nicolas Capens Committed by Nicolas Capens

Take the plane/aspect into account when copying/blitting

Bug: b/132437008 Tests: dEQP-VK.*ycbcr* Change-Id: Ic09d04c63f38247d0f0d6acbd6969f62aa4405ce Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31615 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 6b63c80e
...@@ -80,7 +80,7 @@ namespace sw ...@@ -80,7 +80,7 @@ namespace sw
for(; subresLayers.mipLevel <= lastMipLevel; subresLayers.mipLevel++) for(; subresLayers.mipLevel <= lastMipLevel; subresLayers.mipLevel++)
{ {
VkExtent3D extent = dest->getMipLevelExtent(subresLayers.mipLevel); VkExtent3D extent = dest->getMipLevelExtent(aspect, subresLayers.mipLevel);
if(!renderArea) if(!renderArea)
{ {
area.extent.width = extent.width; area.extent.width = extent.width;
...@@ -203,7 +203,7 @@ namespace sw ...@@ -203,7 +203,7 @@ namespace sw
{ {
int rowPitchBytes = dest->rowPitchBytes(aspect, subresLayers.mipLevel); int rowPitchBytes = dest->rowPitchBytes(aspect, subresLayers.mipLevel);
int slicePitchBytes = dest->slicePitchBytes(aspect, subresLayers.mipLevel); int slicePitchBytes = dest->slicePitchBytes(aspect, subresLayers.mipLevel);
VkExtent3D extent = dest->getMipLevelExtent(subresLayers.mipLevel); VkExtent3D extent = dest->getMipLevelExtent(aspect, subresLayers.mipLevel);
if(!renderArea) if(!renderArea)
{ {
area.extent.width = extent.width; area.extent.width = extent.width;
...@@ -1712,14 +1712,13 @@ namespace sw ...@@ -1712,14 +1712,13 @@ namespace sw
std::swap(region.dstOffsets[0].y, region.dstOffsets[1].y); std::swap(region.dstOffsets[0].y, region.dstOffsets[1].y);
} }
VkExtent3D srcExtent = src->getMipLevelExtent(region.srcSubresource.mipLevel); VkImageAspectFlagBits srcAspect = static_cast<VkImageAspectFlagBits>(region.srcSubresource.aspectMask);
VkImageAspectFlagBits dstAspect = static_cast<VkImageAspectFlagBits>(region.dstSubresource.aspectMask);
VkExtent3D srcExtent = src->getMipLevelExtent(srcAspect, region.srcSubresource.mipLevel);
int32_t numSlices = (region.srcOffsets[1].z - region.srcOffsets[0].z); int32_t numSlices = (region.srcOffsets[1].z - region.srcOffsets[0].z);
ASSERT(numSlices == (region.dstOffsets[1].z - region.dstOffsets[0].z)); ASSERT(numSlices == (region.dstOffsets[1].z - region.dstOffsets[0].z));
VkImageAspectFlagBits srcAspect = static_cast<VkImageAspectFlagBits>(region.srcSubresource.aspectMask);
VkImageAspectFlagBits dstAspect = static_cast<VkImageAspectFlagBits>(region.dstSubresource.aspectMask);
float widthRatio = static_cast<float>(region.srcOffsets[1].x - region.srcOffsets[0].x) / float widthRatio = static_cast<float>(region.srcOffsets[1].x - region.srcOffsets[0].x) /
static_cast<float>(region.dstOffsets[1].x - region.dstOffsets[0].x); static_cast<float>(region.dstOffsets[1].x - region.dstOffsets[0].x);
float heightRatio = static_cast<float>(region.srcOffsets[1].y - region.srcOffsets[0].y) / float heightRatio = static_cast<float>(region.srcOffsets[1].y - region.srcOffsets[0].y) /
...@@ -1955,7 +1954,7 @@ namespace sw ...@@ -1955,7 +1954,7 @@ namespace sw
void(*cornerUpdateFunction)(const CubeBorderData *data) = (void(*)(const CubeBorderData*))cornerUpdateRoutine->getEntry(); void(*cornerUpdateFunction)(const CubeBorderData *data) = (void(*)(const CubeBorderData*))cornerUpdateRoutine->getEntry();
VkExtent3D extent = image->getMipLevelExtent(subresourceLayers.mipLevel); VkExtent3D extent = image->getMipLevelExtent(aspect, subresourceLayers.mipLevel);
CubeBorderData data = CubeBorderData data =
{ {
image->getTexelPointer({ 0, 0, 0 }, posX), image->getTexelPointer({ 0, 0, 0 }, posX),
...@@ -1994,7 +1993,7 @@ namespace sw ...@@ -1994,7 +1993,7 @@ namespace sw
int bytes = image->getFormat(aspect).bytes(); int bytes = image->getFormat(aspect).bytes();
int pitchB = image->rowPitchBytes(aspect, srcSubresourceLayers.mipLevel); int pitchB = image->rowPitchBytes(aspect, srcSubresourceLayers.mipLevel);
VkExtent3D extent = image->getMipLevelExtent(srcSubresourceLayers.mipLevel); VkExtent3D extent = image->getMipLevelExtent(aspect, srcSubresourceLayers.mipLevel);
int w = extent.width; int w = extent.width;
int h = extent.height; int h = extent.height;
if(w != h) if(w != h)
......
...@@ -54,7 +54,7 @@ public: ...@@ -54,7 +54,7 @@ public:
uint32_t getLastLayerIndex(const VkImageSubresourceRange& subresourceRange) const; uint32_t getLastLayerIndex(const VkImageSubresourceRange& subresourceRange) const;
uint32_t getLastMipLevel(const VkImageSubresourceRange& subresourceRange) const; uint32_t getLastMipLevel(const VkImageSubresourceRange& subresourceRange) const;
VkSampleCountFlagBits getSampleCountFlagBits() const { return samples; } VkSampleCountFlagBits getSampleCountFlagBits() const { return samples; }
VkExtent3D getMipLevelExtent(uint32_t mipLevel) const; VkExtent3D getMipLevelExtent(VkImageAspectFlagBits aspect, uint32_t mipLevel) const;
int rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel) const; int rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel) const;
int slicePitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel) const; int slicePitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel) const;
void* getTexelPointer(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const; void* getTexelPointer(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const;
...@@ -79,10 +79,9 @@ private: ...@@ -79,10 +79,9 @@ private:
VkExtent3D imageExtentInBlocks(const VkExtent3D& extent, VkImageAspectFlagBits aspect) const; VkExtent3D imageExtentInBlocks(const VkExtent3D& extent, VkImageAspectFlagBits aspect) const;
VkOffset3D imageOffsetInBlocks(const VkOffset3D& offset, VkImageAspectFlagBits aspect) const; VkOffset3D imageOffsetInBlocks(const VkOffset3D& offset, VkImageAspectFlagBits aspect) const;
VkExtent2D bufferExtentInBlocks(const VkExtent2D& extent, const VkBufferImageCopy& region) const; VkExtent2D bufferExtentInBlocks(const VkExtent2D& extent, const VkBufferImageCopy& region) const;
int bytesPerTexel(VkImageAspectFlagBits flags) const;
VkFormat getClearFormat() const; VkFormat getClearFormat() const;
void clear(void* pixelData, VkFormat pixelFormat, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D& renderArea); void clear(void* pixelData, VkFormat pixelFormat, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D& renderArea);
int borderSize(VkImageAspectFlagBits aspect) const; int borderSize() const;
void decodeETC2(const VkImageSubresourceRange& subresourceRange) const; void decodeETC2(const VkImageSubresourceRange& subresourceRange) const;
const Device *const device = nullptr; const Device *const device = nullptr;
......
...@@ -178,7 +178,8 @@ void ImageView::resolve(ImageView* resolveAttachment) ...@@ -178,7 +178,8 @@ void ImageView::resolve(ImageView* resolveAttachment)
resolveAttachment->subresourceRange.layerCount resolveAttachment->subresourceRange.layerCount
}; };
region.dstOffset = { 0, 0, 0 }; region.dstOffset = { 0, 0, 0 };
region.extent = image->getMipLevelExtent(subresourceRange.baseMipLevel); region.extent = image->getMipLevelExtent(static_cast<VkImageAspectFlagBits>(subresourceRange.aspectMask),
subresourceRange.baseMipLevel);
image->copyTo(*(resolveAttachment->image), region); image->copyTo(*(resolveAttachment->image), region);
} }
...@@ -219,7 +220,8 @@ int ImageView::layerPitchBytes(VkImageAspectFlagBits aspect, Usage usage) const ...@@ -219,7 +220,8 @@ int ImageView::layerPitchBytes(VkImageAspectFlagBits aspect, Usage usage) const
VkExtent3D ImageView::getMipLevelExtent(uint32_t mipLevel) const VkExtent3D ImageView::getMipLevelExtent(uint32_t mipLevel) const
{ {
return image->getMipLevelExtent(subresourceRange.baseMipLevel + mipLevel); return image->getMipLevelExtent(static_cast<VkImageAspectFlagBits>(subresourceRange.aspectMask),
subresourceRange.baseMipLevel + mipLevel);
} }
void *ImageView::getOffsetPointer(const VkOffset3D& offset, VkImageAspectFlagBits aspect, uint32_t mipLevel, uint32_t layer, Usage usage) const void *ImageView::getOffsetPointer(const VkOffset3D& offset, VkImageAspectFlagBits aspect, uint32_t mipLevel, uint32_t layer, Usage usage) const
...@@ -233,6 +235,7 @@ void *ImageView::getOffsetPointer(const VkOffset3D& offset, VkImageAspectFlagBit ...@@ -233,6 +235,7 @@ void *ImageView::getOffsetPointer(const VkOffset3D& offset, VkImageAspectFlagBit
subresourceRange.baseArrayLayer + layer, subresourceRange.baseArrayLayer + layer,
subresourceRange.layerCount subresourceRange.layerCount
}; };
return getImage(usage)->getTexelPointer(offset, imageSubresourceLayers); return getImage(usage)->getTexelPointer(offset, imageSubresourceLayers);
} }
......
...@@ -45,6 +45,7 @@ public: ...@@ -45,6 +45,7 @@ public:
VkImageViewType getType() const { return viewType; } VkImageViewType getType() const { return viewType; }
Format getFormat(Usage usage = RAW) const; Format getFormat(Usage usage = RAW) const;
Format getFormat(VkImageAspectFlagBits aspect) const { return image->getFormat(aspect); }
int rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage = RAW) const; int rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage = RAW) const;
int slicePitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage = RAW) const; int slicePitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage = RAW) const;
int layerPitchBytes(VkImageAspectFlagBits aspect, Usage usage = RAW) const; int layerPitchBytes(VkImageAspectFlagBits aspect, Usage usage = RAW) const;
......
...@@ -58,7 +58,7 @@ void XlibSurfaceKHR::attachImage(PresentImage* image) ...@@ -58,7 +58,7 @@ void XlibSurfaceKHR::attachImage(PresentImage* image)
XWindowAttributes attr; XWindowAttributes attr;
libX11->XGetWindowAttributes(pDisplay, window, &attr); libX11->XGetWindowAttributes(pDisplay, window, &attr);
VkExtent3D extent = vk::Cast(image->image)->getMipLevelExtent(0); VkExtent3D extent = vk::Cast(image->image)->getMipLevelExtent(VK_IMAGE_ASPECT_COLOR_BIT, 0);
int bytes_per_line = vk::Cast(image->image)->rowPitchBytes(VK_IMAGE_ASPECT_COLOR_BIT, 0); int bytes_per_line = vk::Cast(image->image)->rowPitchBytes(VK_IMAGE_ASPECT_COLOR_BIT, 0);
char* buffer = static_cast<char*>(vk::Cast(image->imageMemory)->getOffsetPointer(0)); char* buffer = static_cast<char*>(vk::Cast(image->imageMemory)->getOffsetPointer(0));
...@@ -89,7 +89,7 @@ void XlibSurfaceKHR::present(PresentImage* image) ...@@ -89,7 +89,7 @@ void XlibSurfaceKHR::present(PresentImage* image)
if(xImage->data) if(xImage->data)
{ {
VkExtent3D extent = vk::Cast(image->image)->getMipLevelExtent(0); VkExtent3D extent = vk::Cast(image->image)->getMipLevelExtent(VK_IMAGE_ASPECT_COLOR_BIT, 0);
libX11->XPutImage(pDisplay, window, gc, xImage, 0, 0, 0, 0, extent.width, extent.height); libX11->XPutImage(pDisplay, window, gc, xImage, 0, 0, 0, 0, extent.width, extent.height);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment