vkCmdBlitImage() support format component swizzling.
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 0a62974..73d38a5 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -26,6 +26,7 @@
- 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 a7b9486..49812c8 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h
@@ -52,7 +52,8 @@
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 9c7c173..df846e8 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
@@ -41,7 +41,7 @@
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 @@
}
}
-// 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 @@
_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 @@
VkFilter filter,
MVKCommandUse commandUse) {
- MVKCmdCopyImage::setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, commandUse);
+ MVKCmdCopyImage::setContent(srcImage, srcImageLayout, dstImage, dstImageLayout, true, commandUse);
_mtlFilter = mvkMTLSamplerMinMagFilterFromVkFilter(filter);