From 74e8af152529efd7ce2e7f2b60d61cf0269ed6d2 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Mon, 12 Aug 2019 16:35:59 -0400 Subject: [PATCH] vkCmdBlitImage() support format component swizzling. --- Docs/Whats_New.md | 1 + MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h | 3 ++- MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm | 11 +++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 0a629744..73d38a53 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -26,6 +26,7 @@ Released TBD - Ensure Vulkan loader magic number is set every time before returning any dispatchable Vulkan handle. - Fix crash when `VkDeviceCreateInfo` specifies queue families out of numerical order. - Fix crash in `vkDestroyPipelineLayout()`. +- `vkCmdBlitImage()` support format component swizzling. - `vkCmdClearImage()` set error if attempt made to clear 1D image, and fix validation of depth attachment formats. - Remove error logging on `VK_TIMEOUT` of `VkSemaphore` and `VkFence`. - Consolidate the various linkable objects into a `MVKLinkableMixin` template base class. diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h index a7b9486b..49812c88 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h +++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h @@ -52,7 +52,8 @@ public: protected: void setContent(VkImage srcImage, VkImageLayout srcImageLayout, - VkImage dstImage, VkImageLayout dstImageLayout, MVKCommandUse commandUse); + VkImage dstImage, VkImageLayout dstImageLayout, + bool formatsMustMatch, MVKCommandUse commandUse); void addImageCopyRegion(const VkImageCopy& region); void addTempBufferImageCopyRegion(const VkImageCopy& region); diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm index 9c7c1736..df846e8c 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm @@ -41,7 +41,7 @@ void MVKCmdCopyImage::setContent(VkImage srcImage, const VkImageCopy* pRegions, MVKCommandUse commandUse) { - setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, commandUse); + setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, false, commandUse); for (uint32_t i = 0; i < regionCount; i++) { addImageCopyRegion(pRegions[i]); @@ -56,11 +56,12 @@ void MVKCmdCopyImage::setContent(VkImage srcImage, } } -// Sets basic content for use by this class and subclasses +// Sets common content for use by this class and subclasses void MVKCmdCopyImage::setContent(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, + bool formatsMustMatch, MVKCommandUse commandUse) { _srcImage = (MVKImage*)srcImage; _srcLayout = srcImageLayout; @@ -76,7 +77,9 @@ void MVKCmdCopyImage::setContent(VkImage srcImage, _isDstCompressed = _dstImage->getIsCompressed(); uint32_t dstBytesPerBlock = mvkMTLPixelFormatBytesPerBlock(_dstMTLPixFmt); - _canCopyFormats = (srcBytesPerBlock == dstBytesPerBlock) && (_srcSampleCount == _dstSampleCount); + _canCopyFormats = formatsMustMatch + ? (_dstMTLPixFmt == _srcMTLPixFmt) + : ((dstBytesPerBlock == srcBytesPerBlock) && (_dstSampleCount == _srcSampleCount)); _useTempBuffer = (_srcMTLPixFmt != _dstMTLPixFmt) && (_isSrcCompressed || _isDstCompressed); // Different formats and at least one is compressed _commandUse = commandUse; @@ -214,7 +217,7 @@ void MVKCmdBlitImage::setContent(VkImage srcImage, VkFilter filter, MVKCommandUse commandUse) { - MVKCmdCopyImage::setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, commandUse); + MVKCmdCopyImage::setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, true, commandUse); _mtlFilter = mvkMTLSamplerMinMagFilterFromVkFilter(filter);