|
|
@@ -2013,4 +2013,32 @@ void TextureCacheRuntime::AccelerateImageUpload(
|
|
|
ASSERT(false);
|
|
|
}
|
|
|
|
|
|
+void TextureCacheRuntime::TransitionImageLayout(Image& image) {
|
|
|
+ if (!image.ExchangeInitialization()) {
|
|
|
+ VkImageMemoryBarrier barrier{
|
|
|
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
|
|
+ .pNext = nullptr,
|
|
|
+ .srcAccessMask = VK_ACCESS_NONE,
|
|
|
+ .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
|
|
|
+ .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
|
|
+ .newLayout = VK_IMAGE_LAYOUT_GENERAL,
|
|
|
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .image = image.Handle(),
|
|
|
+ .subresourceRange{
|
|
|
+ .aspectMask = image.AspectMask(),
|
|
|
+ .baseMipLevel = 0,
|
|
|
+ .levelCount = VK_REMAINING_MIP_LEVELS,
|
|
|
+ .baseArrayLayer = 0,
|
|
|
+ .layerCount = VK_REMAINING_ARRAY_LAYERS,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ scheduler.RequestOutsideRenderPassOperationContext();
|
|
|
+ scheduler.Record([barrier = barrier](vk::CommandBuffer cmdbuf) {
|
|
|
+ cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
|
|
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, barrier);
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
} // namespace Vulkan
|