From 3b28df0543a9447739a6c7b3bbbbf8556d392f4a Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 27 May 2020 12:53:55 +0100 Subject: [PATCH] Add helper for uploading data into an image --- util/test/demos/vk/vk_resource_lifetimes.cpp | 56 ++------------------ util/test/demos/vk/vk_test.cpp | 33 ++++++++++++ util/test/demos/vk/vk_test.h | 3 ++ 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/util/test/demos/vk/vk_resource_lifetimes.cpp b/util/test/demos/vk/vk_resource_lifetimes.cpp index 90df70c4f..465693eed 100644 --- a/util/test/demos/vk/vk_resource_lifetimes.cpp +++ b/util/test/demos/vk/vk_resource_lifetimes.cpp @@ -160,6 +160,9 @@ void main() uploadBuf.upload(rgba8.data.data(), rgba8.data.size() * sizeof(uint32_t)); + uploadBufferToImage(smiley.image, {rgba8.width, rgba8.height, 1}, uploadBuf.buffer, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + { VkCommandBuffer cmd = GetCommandBuffer(); @@ -167,23 +170,6 @@ void main() vkh::cmdPipelineBarrier( cmd, { - vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, smiley.image), - }); - - VkBufferImageCopy copy = {}; - copy.imageExtent = {rgba8.width, rgba8.height, 1}; - copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - copy.imageSubresource.layerCount = 1; - - vkCmdCopyBufferToImage(cmd, uploadBuf.buffer, smiley.image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); - - vkh::cmdPipelineBarrier( - cmd, { - vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, smiley.image), vkh::ImageMemoryBarrier(0, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, badimg.image), }); @@ -191,8 +177,6 @@ void main() vkEndCommandBuffer(cmd); Submit(99, 99, {cmd}); - - vkDeviceWaitIdle(device); } Vec4f flags = {}; @@ -311,39 +295,7 @@ void main() uploadBuf.upload(checker); - { - VkCommandBuffer cmd = GetCommandBuffer(); - - vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo()); - - vkh::cmdPipelineBarrier( - cmd, - { - vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, img), - }); - - VkBufferImageCopy copy = {}; - copy.imageExtent = {4, 4, 1}; - copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - copy.imageSubresource.layerCount = 1; - - vkCmdCopyBufferToImage(cmd, uploadBuf.buffer, img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, - ©); - - vkh::cmdPipelineBarrier( - cmd, { - vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, img), - }); - - vkEndCommandBuffer(cmd); - - Submit(99, 99, {cmd}); - - vkDeviceWaitIdle(device); - } + uploadBufferToImage(img, {4, 4, 1}, uploadBuf.buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); return mem; }; diff --git a/util/test/demos/vk/vk_test.cpp b/util/test/demos/vk/vk_test.cpp index 81563d838..4354c2245 100644 --- a/util/test/demos/vk/vk_test.cpp +++ b/util/test/demos/vk/vk_test.cpp @@ -797,6 +797,39 @@ void VulkanGraphicsTest::blitToSwap(VkCommandBuffer cmd, VkImage src, VkImageLay vkCmdBlitImage(cmd, src, srcLayout, dst, dstLayout, 1, ®ion, VK_FILTER_LINEAR); } +void VulkanGraphicsTest::uploadBufferToImage(VkImage destImage, VkExtent3D destExtent, + VkBuffer srcBuffer, VkImageLayout finalLayout) +{ + VkCommandBuffer cmd = GetCommandBuffer(); + + vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo()); + + vkh::cmdPipelineBarrier( + cmd, { + vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, destImage), + }); + + VkBufferImageCopy copy = {}; + copy.imageExtent = destExtent; + copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + copy.imageSubresource.layerCount = 1; + + vkCmdCopyBufferToImage(cmd, srcBuffer, destImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); + + vkh::cmdPipelineBarrier( + cmd, { + vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, finalLayout, destImage), + }); + + vkEndCommandBuffer(cmd); + + Submit(99, 99, {cmd}); + + vkDeviceWaitIdle(device); +} + void VulkanGraphicsTest::pushMarker(VkQueue q, const std::string &name) { if(vkQueueBeginDebugUtilsLabelEXT) diff --git a/util/test/demos/vk/vk_test.h b/util/test/demos/vk/vk_test.h index ca2fdb867..f5a5fce89 100644 --- a/util/test/demos/vk/vk_test.h +++ b/util/test/demos/vk/vk_test.h @@ -208,6 +208,9 @@ struct VulkanGraphicsTest : public GraphicsTest void blitToSwap(VkCommandBuffer cmd, VkImage src, VkImageLayout srcLayout, VkImage dst, VkImageLayout dstLayout); + void uploadBufferToImage(VkImage destImage, VkExtent3D destExtent, VkBuffer srcBuffer, + VkImageLayout finalLayout); + template void setName(T obj, const std::string &name);