From 27eeea3d0cabfbc90fb8326b4c76ff8fc39c6775 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Sun, 6 Jul 2025 16:14:53 +0200 Subject: [PATCH] replace copy with blit, allowing for most swapchain formats fixes #1 --- include/layer.hpp | 7 ++++--- src/layer.cpp | 13 +++++++------ src/utils/utils.cpp | 21 ++++++++++++++------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/include/layer.hpp b/include/layer.hpp index 87c6857..a7dd653 100644 --- a/include/layer.hpp +++ b/include/layer.hpp @@ -186,15 +186,16 @@ namespace Layer { const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); - /// Call to the original vkCmdCopyImage function. - void ovkCmdCopyImage( + /// Call to the original vkCmdBlitImage function. + void ovkCmdBlitImage( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, - const VkImageCopy* pRegions); + const VkImageBlit* pRegions, + VkFilter filter); /// Call to the original vkAcquireNextImageKHR function. VkResult ovkAcquireNextImageKHR( diff --git a/src/layer.cpp b/src/layer.cpp index af0bf5c..5b8f952 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -46,7 +46,7 @@ namespace { PFN_vkGetDeviceQueue next_vkGetDeviceQueue{}; PFN_vkQueueSubmit next_vkQueueSubmit{}; PFN_vkCmdPipelineBarrier next_vkCmdPipelineBarrier{}; - PFN_vkCmdCopyImage next_vkCmdCopyImage{}; + PFN_vkCmdBlitImage next_vkCmdBlitImage{}; PFN_vkAcquireNextImageKHR next_vkAcquireNextImageKHR{}; template @@ -195,7 +195,7 @@ namespace { success &= initDeviceFunc(*pDevice, "vkGetDeviceQueue", &next_vkGetDeviceQueue); success &= initDeviceFunc(*pDevice, "vkQueueSubmit", &next_vkQueueSubmit); success &= initDeviceFunc(*pDevice, "vkCmdPipelineBarrier", &next_vkCmdPipelineBarrier); - success &= initDeviceFunc(*pDevice, "vkCmdCopyImage", &next_vkCmdCopyImage); + success &= initDeviceFunc(*pDevice, "vkCmdBlitImage", &next_vkCmdBlitImage); success &= initDeviceFunc(*pDevice, "vkAcquireNextImageKHR", &next_vkAcquireNextImageKHR); if (!success) { Log::error("layer", "Failed to get device function pointers"); @@ -635,19 +635,20 @@ void Layer::ovkCmdPipelineBarrier( bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); } -void Layer::ovkCmdCopyImage( +void Layer::ovkCmdBlitImage( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, - const VkImageCopy* pRegions) { - Log::debug("vulkan2", "vkCmdCopyImage called for command buffer {:x}, src image {:x}, dst image {:x}", + const VkImageBlit* pRegions, + VkFilter filter) { + Log::debug("vulkan2", "vkCmdBlitImage called for command buffer {:x}, src image {:x}, dst image {:x}", reinterpret_cast(commandBuffer), reinterpret_cast(srcImage), reinterpret_cast(dstImage)); - next_vkCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions); + next_vkCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter); } VkResult Layer::ovkAcquireNextImageKHR( diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index a50c067..0bc4ee4 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -6,6 +6,7 @@ #include #include +#include using namespace Utils; @@ -96,25 +97,31 @@ void Utils::copyImage(VkCommandBuffer buf, 0, nullptr, 0, nullptr, static_cast(barriers.size()), barriers.data()); - const VkImageCopy imageCopy{ + const VkImageBlit imageBlit{ .srcSubresource = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .layerCount = 1 }, + .srcOffsets = { + { 0, 0, 0 }, + { static_cast(width), static_cast(height), 1 } + }, .dstSubresource = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .layerCount = 1 }, - .extent = { - .width = width, - .height = height, - .depth = 1 + .dstOffsets = { + { 0, 0, 0 }, + { static_cast(width), static_cast(height), 1 } } }; - Layer::ovkCmdCopyImage(buf, + Layer::ovkCmdBlitImage( + buf, src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &imageCopy); + 1, &imageBlit, + VK_FILTER_NEAREST + ); if (makeSrcPresentable) { const VkImageMemoryBarrier presentBarrier{