From 1f00d807ddd7ccfeb70619a8e225db50ccd822d3 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 21 Nov 2021 14:41:29 +0200 Subject: [PATCH] Only do layout transitions in render pass for swapchain images Transitions for other images will be handles through Synchronizer. --- source/backends/vulkan/pipelinecache.cpp | 17 +++++++++-------- source/backends/vulkan/pixelformat_backend.cpp | 10 ++++++++++ source/backends/vulkan/pixelformat_backend.h | 1 + 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/source/backends/vulkan/pipelinecache.cpp b/source/backends/vulkan/pipelinecache.cpp index 22356c73..425be40a 100644 --- a/source/backends/vulkan/pipelinecache.cpp +++ b/source/backends/vulkan/pipelinecache.cpp @@ -62,32 +62,33 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clea depth_stencil_ref.attachment = VK_ATTACHMENT_UNUSED; VkSampleCountFlagBits vk_samples = static_cast(get_vulkan_samples(format.get_samples())); - VkImageLayout default_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); unsigned i = 0; unsigned color_count = 0; for(FrameAttachment a: format) { + VkImageLayout subpass_layout = static_cast(get_vulkan_attachment_layout(get_components(get_attachment_pixelformat(a)))); + VkImageLayout external_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : subpass_layout); + attachments[i].format = static_cast(get_vulkan_pixelformat(get_attachment_pixelformat(a))); attachments[i].samples = vk_samples; attachments[i].loadOp = (clear ? discard ? VK_ATTACHMENT_LOAD_OP_DONT_CARE : VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD); attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[i].initialLayout = (clear ? VK_IMAGE_LAYOUT_UNDEFINED : default_layout); - attachments[i].finalLayout = default_layout; + attachments[i].initialLayout = (clear ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout); + attachments[i].finalLayout = external_layout; - unsigned attach_pt = get_attach_point(a); - if(attach_pt==get_attach_point(COLOR_ATTACHMENT)) + if(subpass_layout==VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { color_refs[color_count].attachment = i; - color_refs[color_count].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + color_refs[color_count].layout = subpass_layout; ++color_count; } - else if(attach_pt==get_attach_point(DEPTH_ATTACHMENT)) + else { depth_stencil_ref.attachment = i; - depth_stencil_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + depth_stencil_ref.layout = subpass_layout; } ++i; diff --git a/source/backends/vulkan/pixelformat_backend.cpp b/source/backends/vulkan/pixelformat_backend.cpp index 13df7ee8..1da14357 100644 --- a/source/backends/vulkan/pixelformat_backend.cpp +++ b/source/backends/vulkan/pixelformat_backend.cpp @@ -74,6 +74,16 @@ unsigned get_vulkan_aspect(PixelComponents comp) } } +unsigned get_vulkan_attachment_layout(PixelComponents comp) +{ + switch(comp) + { + case DEPTH_COMPONENT: + case STENCIL_INDEX: return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + default: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + } +} + PixelFormat pixelformat_from_vulkan(unsigned vkf) { switch(vkf) diff --git a/source/backends/vulkan/pixelformat_backend.h b/source/backends/vulkan/pixelformat_backend.h index 8641824e..1cfc0133 100644 --- a/source/backends/vulkan/pixelformat_backend.h +++ b/source/backends/vulkan/pixelformat_backend.h @@ -10,6 +10,7 @@ namespace GL { unsigned get_vulkan_pixelformat(PixelFormat); unsigned get_vulkan_aspect(PixelComponents); +unsigned get_vulkan_attachment_layout(PixelComponents); PixelFormat pixelformat_from_vulkan(unsigned); const unsigned *get_vulkan_swizzle(ComponentSwizzle); -- 2.43.0