From 1655c243b76004eb85dbfa104cf5c7ec8520c36c Mon Sep 17 00:00:00 2001 From: Benau Date: Wed, 6 Apr 2022 11:35:22 +0800 Subject: [PATCH] Batch upload image command buffer --- lib/graphics_engine/src/ge_vulkan_texture.cpp | 33 +++++++++++-------- lib/graphics_engine/src/ge_vulkan_texture.hpp | 6 ++-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/graphics_engine/src/ge_vulkan_texture.cpp b/lib/graphics_engine/src/ge_vulkan_texture.cpp index fb3c405f9..d5e022106 100644 --- a/lib/graphics_engine/src/ge_vulkan_texture.cpp +++ b/lib/graphics_engine/src/ge_vulkan_texture.cpp @@ -87,6 +87,7 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data) VkResult ret = VK_SUCCESS; void* data; + VkCommandBuffer command_buffer = VK_NULL_HANDLE; if ((ret = vkMapMemory(m_vulkan_device, staging_buffer_memory, 0, image_size, 0, &data)) != VK_SUCCESS) goto destroy; @@ -101,14 +102,19 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data) goto destroy; } - transitionImageLayout(VK_IMAGE_LAYOUT_UNDEFINED, + command_buffer = getVKDriver()->beginSingleTimeCommands(); + + transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - copyBufferToImage(staging_buffer, m_size.Width, m_size.Height, 0, 0); + copyBufferToImage(command_buffer, staging_buffer, m_size.Width, + m_size.Height, 0, 0); - transitionImageLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + getVKDriver()->endSingleTimeCommands(command_buffer); + destroy: vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL); vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL); @@ -181,7 +187,8 @@ bool GEVulkanTexture::createImage(VkImageUsageFlags usage) } // createImage // ---------------------------------------------------------------------------- -void GEVulkanTexture::transitionImageLayout(VkImageLayout old_layout, +void GEVulkanTexture::transitionImageLayout(VkCommandBuffer command_buffer, + VkImageLayout old_layout, VkImageLayout new_layout) { VkImageMemoryBarrier barrier = {}; @@ -250,18 +257,15 @@ void GEVulkanTexture::transitionImageLayout(VkImageLayout old_layout, return; } - VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands(); vkCmdPipelineBarrier(command_buffer, source_stage, destination_stage, 0, 0, NULL, 0, NULL, 1, &barrier); - getVKDriver()->endSingleTimeCommands(command_buffer); } // transitionImageLayout // ---------------------------------------------------------------------------- -void GEVulkanTexture::copyBufferToImage(VkBuffer buffer, u32 w, u32 h, s32 x, +void GEVulkanTexture::copyBufferToImage(VkCommandBuffer command_buffer, + VkBuffer buffer, u32 w, u32 h, s32 x, s32 y) { - VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands(); - VkBufferImageCopy region = {}; region.bufferOffset = 0; region.bufferRowLength = 0; @@ -275,8 +279,6 @@ void GEVulkanTexture::copyBufferToImage(VkBuffer buffer, u32 w, u32 h, s32 x, vkCmdCopyBufferToImage(command_buffer, buffer, m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); - - getVKDriver()->endSingleTimeCommands(command_buffer); } // copyBufferToImage // ---------------------------------------------------------------------------- @@ -436,11 +438,14 @@ void GEVulkanTexture::updateTexture(void* data, video::ECOLOR_FORMAT format, } } - transitionImageLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands(); + transitionImageLayout(command_buffer, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - copyBufferToImage(staging_buffer, w, h, x, y); - transitionImageLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + copyBufferToImage(command_buffer, staging_buffer, w, h, x, y); + transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + getVKDriver()->endSingleTimeCommands(command_buffer); vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL); vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL); diff --git a/lib/graphics_engine/src/ge_vulkan_texture.hpp b/lib/graphics_engine/src/ge_vulkan_texture.hpp index cb5690380..3c4ba6d54 100644 --- a/lib/graphics_engine/src/ge_vulkan_texture.hpp +++ b/lib/graphics_engine/src/ge_vulkan_texture.hpp @@ -41,10 +41,12 @@ private: // ------------------------------------------------------------------------ bool createImageView(VkImageAspectFlags aspect_flags); // ------------------------------------------------------------------------ - void transitionImageLayout(VkImageLayout old_layout, + void transitionImageLayout(VkCommandBuffer command_buffer, + VkImageLayout old_layout, VkImageLayout new_layout); // ------------------------------------------------------------------------ - void copyBufferToImage(VkBuffer buffer, u32 w, u32 h, s32 x, s32 y); + void copyBufferToImage(VkCommandBuffer command_buffer, VkBuffer buffer, + u32 w, u32 h, s32 x, s32 y); // ------------------------------------------------------------------------ void upload(uint8_t* data); // ------------------------------------------------------------------------