Batch upload image command buffer
This commit is contained in:
parent
159cdcd06b
commit
1655c243b7
@ -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, ®ion);
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
||||||
|
|
||||||
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);
|
||||||
|
@ -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);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user