X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinecache.cpp;h=8cc447aedbf91c2bf8f68cb302483637d2aaaa8a;hb=5c35768c310847df816d216eecf8fa2e93f5f8b8;hp=e24c72dbba4944dc6f3180b61af8557f6ac0a8ec;hpb=99ca354f18119f82f1adeca100cd665a8f640317;p=libs%2Fgl.git diff --git a/source/backends/vulkan/pipelinecache.cpp b/source/backends/vulkan/pipelinecache.cpp index e24c72db..8cc447ae 100644 --- a/source/backends/vulkan/pipelinecache.cpp +++ b/source/backends/vulkan/pipelinecache.cpp @@ -44,11 +44,11 @@ PipelineCache::~PipelineCache() vk.DestroyDescriptorPool(descriptor_pool); } -VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool is_cleared, bool to_present) +VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clear, bool discard, bool to_present) { const VulkanFunctions &vk = device.get_functions(); - uint64_t key = hash<64>(static_cast(is_cleared | (to_present*2))); + uint64_t key = hash<64>(static_cast(clear | (discard*2) | (to_present*4))); for(FrameAttachment a: format) key = hash_update<64>(key, a); @@ -67,26 +67,28 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool is_c 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 = (is_cleared ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD); + 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 = (is_cleared ? VK_IMAGE_LAYOUT_UNDEFINED : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - attachments[i].finalLayout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + 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; @@ -98,6 +100,7 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool is_c subpass.pColorAttachments = color_refs; subpass.pDepthStencilAttachment = &depth_stencil_ref; + VkSubpassDependency dependency = { }; VkRenderPassCreateInfo render_pass_info = { }; render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; render_pass_info.attachmentCount = format.size(); @@ -105,6 +108,19 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool is_c render_pass_info.subpassCount = 1; render_pass_info.pSubpasses = &subpass; + if(to_present) + { + dependency.srcSubpass = 0; + dependency.dstSubpass = VK_SUBPASS_EXTERNAL; + dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependency.dstAccessMask = 0; + + render_pass_info.dependencyCount = 1; + render_pass_info.pDependencies = &dependency; + } + VkRenderPass render_pass; vk.CreateRenderPass(render_pass_info, render_pass);