From ee68facc5d9f47730e49c30b1ec4017e938ef9b7 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Mon, 13 Feb 2023 17:52:50 +0000 Subject: [PATCH] Apply RP barrier masks for every draw, rather than the 1st in RP I missed that addSubpass was only called once-per-subpass, meaning that if a new barrier req was discovered several draws into the RP it wouldn't be applied. Split out barriers into a seperate function to avoid this. --- .../cpp/skyline/gpu/interconnect/command_executor.cpp | 4 +++- .../cpp/skyline/gpu/interconnect/command_nodes.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp b/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp index 90e694ef..c1f403e1 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp @@ -281,7 +281,7 @@ namespace skyline::gpu::interconnect { bool CommandExecutor::CreateRenderPassWithSubpass(vk::Rect2D renderArea, span sampledImages, span inputAttachments, span colorAttachments, TextureView *depthStencilAttachment, bool noSubpassCreation, vk::PipelineStageFlags srcStageMask, vk::PipelineStageFlags dstStageMask) { auto addSubpass{[&] { - renderPass->AddSubpass(inputAttachments, colorAttachments, depthStencilAttachment, gpu, srcStageMask, dstStageMask); + renderPass->AddSubpass(inputAttachments, colorAttachments, depthStencilAttachment, gpu); lastSubpassColorAttachments.clear(); lastSubpassInputAttachments.clear(); @@ -317,6 +317,8 @@ namespace skyline::gpu::interconnect { gotoNext = true; } + renderPass->UpdateDependency(srcStageMask, dstStageMask); + for (auto view : outputAttachmentViews) if (view) view->texture->UpdateRenderPassUsage(renderPassIndex, texture::RenderPassUsage::RenderTarget); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/command_nodes.cpp b/app/src/main/cpp/skyline/gpu/interconnect/command_nodes.cpp index b193ae89..7ed11770 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/command_nodes.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/command_nodes.cpp @@ -126,10 +126,7 @@ namespace skyline::gpu::interconnect::node { } } - void RenderPassNode::AddSubpass(span inputAttachments, span colorAttachments, TextureView *depthStencilAttachment, GPU &gpu, vk::PipelineStageFlags srcStageMask, vk::PipelineStageFlags dstStageMask) { - externalDependency.srcStageMask |= srcStageMask; - externalDependency.dstStageMask |= dstStageMask; - + void RenderPassNode::AddSubpass(span inputAttachments, span colorAttachments, TextureView *depthStencilAttachment, GPU &gpu) { attachmentReferences.reserve(attachmentReferences.size() + inputAttachments.size() + colorAttachments.size() + (depthStencilAttachment ? 1 : 0)); auto inputAttachmentsOffset{attachmentReferences.size() * sizeof(vk::AttachmentReference)}; @@ -175,6 +172,11 @@ namespace skyline::gpu::interconnect::node { }); } + void RenderPassNode::UpdateDependency(vk::PipelineStageFlags srcStageMask, vk::PipelineStageFlags dstStageMask) { + externalDependency.srcStageMask |= srcStageMask; + externalDependency.dstStageMask |= dstStageMask; + } + bool RenderPassNode::ClearColorAttachment(u32 colorAttachment, const vk::ClearColorValue &value, GPU& gpu) { auto attachmentReference{RebasePointer(attachmentReferences, subpassDescriptions.back().pColorAttachments) + colorAttachment}; auto attachmentIndex{attachmentReference->attachment};