Batch upload image command buffer

This commit is contained in:
Benau 2022-04-06 11:35:22 +08:00
parent 159cdcd06b
commit 1655c243b7
2 changed files with 23 additions and 16 deletions

View File

@ -87,6 +87,7 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data)
VkResult ret = VK_SUCCESS; VkResult ret = VK_SUCCESS;
void* data; void* data;
VkCommandBuffer command_buffer = VK_NULL_HANDLE;
if ((ret = vkMapMemory(m_vulkan_device, staging_buffer_memory, 0, if ((ret = vkMapMemory(m_vulkan_device, staging_buffer_memory, 0,
image_size, 0, &data)) != VK_SUCCESS) image_size, 0, &data)) != VK_SUCCESS)
goto destroy; goto destroy;
@ -101,14 +102,19 @@ bool GEVulkanTexture::createTextureImage(uint8_t* texture_data)
goto destroy; goto destroy;
} }
transitionImageLayout(VK_IMAGE_LAYOUT_UNDEFINED, command_buffer = getVKDriver()->beginSingleTimeCommands();
transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); 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); VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
getVKDriver()->endSingleTimeCommands(command_buffer);
destroy: destroy:
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL); vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL); vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL);
@ -181,7 +187,8 @@ bool GEVulkanTexture::createImage(VkImageUsageFlags usage)
} // createImage } // createImage
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void GEVulkanTexture::transitionImageLayout(VkImageLayout old_layout, void GEVulkanTexture::transitionImageLayout(VkCommandBuffer command_buffer,
VkImageLayout old_layout,
VkImageLayout new_layout) VkImageLayout new_layout)
{ {
VkImageMemoryBarrier barrier = {}; VkImageMemoryBarrier barrier = {};
@ -250,18 +257,15 @@ void GEVulkanTexture::transitionImageLayout(VkImageLayout old_layout,
return; return;
} }
VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands();
vkCmdPipelineBarrier(command_buffer, source_stage, destination_stage, 0, 0, vkCmdPipelineBarrier(command_buffer, source_stage, destination_stage, 0, 0,
NULL, 0, NULL, 1, &barrier); NULL, 0, NULL, 1, &barrier);
getVKDriver()->endSingleTimeCommands(command_buffer);
} // transitionImageLayout } // 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) s32 y)
{ {
VkCommandBuffer command_buffer = getVKDriver()->beginSingleTimeCommands();
VkBufferImageCopy region = {}; VkBufferImageCopy region = {};
region.bufferOffset = 0; region.bufferOffset = 0;
region.bufferRowLength = 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, vkCmdCopyBufferToImage(command_buffer, buffer, m_image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
getVKDriver()->endSingleTimeCommands(command_buffer);
} // copyBufferToImage } // 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); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
copyBufferToImage(staging_buffer, w, h, x, y); copyBufferToImage(command_buffer, staging_buffer, w, h, x, y);
transitionImageLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, transitionImageLayout(command_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
getVKDriver()->endSingleTimeCommands(command_buffer);
vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL); vkDestroyBuffer(m_vulkan_device, staging_buffer, NULL);
vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL); vkFreeMemory(m_vulkan_device, staging_buffer_memory, NULL);

View File

@ -41,10 +41,12 @@ private:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
bool createImageView(VkImageAspectFlags aspect_flags); bool createImageView(VkImageAspectFlags aspect_flags);
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void transitionImageLayout(VkImageLayout old_layout, void transitionImageLayout(VkCommandBuffer command_buffer,
VkImageLayout old_layout,
VkImageLayout new_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); void upload(uint8_t* data);
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------