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;
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, &region);
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);

View File

@ -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);
// ------------------------------------------------------------------------