From bc10681156a146eade378e0ebb89be0d6e8485b8 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Sun, 5 Feb 2023 18:42:29 +0200 Subject: [PATCH] renderer_vulkan: Cleanup renderpass code --- .../renderer_vulkan/renderer_vulkan.cpp | 75 +++++++------------ .../renderer_vulkan/renderer_vulkan.h | 7 +- 2 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 1252e5faa..67baf6b56 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -213,9 +213,31 @@ void RendererVulkan::RenderToMailbox(const Layout::FramebufferLayout& layout, cmdbuf.setScissor(0, scissor); }); + DrawScreens(frame, layout, flipped); + + scheduler.Flush(frame->render_ready); + scheduler.Record([&mailbox, frame](vk::CommandBuffer) { mailbox->Present(frame); }); + scheduler.DispatchWork(); +} + +void RendererVulkan::BeginRendering(Frame* frame) { + for (std::size_t i = 0; i < screen_infos.size(); i++) { + const auto& info = screen_infos[i]; + present_textures[i] = vk::DescriptorImageInfo{ + .imageView = info.image_view, + .imageLayout = vk::ImageLayout::eGeneral, + }; + } + present_textures[3].sampler = present_samplers[current_sampler]; + + vk::DescriptorSet set = desc_manager.AllocateSet(present_descriptor_layout); + instance.GetDevice().updateDescriptorSetWithTemplate(set, present_update_template, + present_textures[0]); + renderpass_cache.ExitRenderpass(); scheduler.Record([this, framebuffer = frame->framebuffer, width = frame->width, - height = frame->height](vk::CommandBuffer cmdbuf) { + height = frame->height, set, + pipeline_index = current_pipeline](vk::CommandBuffer cmdbuf) { const vk::ClearValue clear{.color = clear_color}; const vk::RenderPassBeginInfo renderpass_begin_info = { .renderPass = renderpass_cache.GetPresentRenderpass(), @@ -230,32 +252,7 @@ void RendererVulkan::RenderToMailbox(const Layout::FramebufferLayout& layout, }; cmdbuf.beginRenderPass(renderpass_begin_info, vk::SubpassContents::eInline); - }); - - DrawScreens(layout, flipped); - - scheduler.Flush(frame->render_ready); - scheduler.Record([&mailbox, frame](vk::CommandBuffer) { mailbox->Present(frame); }); - scheduler.DispatchWork(); -} - -void RendererVulkan::BeginRendering() { - for (std::size_t i = 0; i < screen_infos.size(); i++) { - const auto& info = screen_infos[i]; - present_textures[i] = vk::DescriptorImageInfo{ - .imageView = info.image_view, - .imageLayout = vk::ImageLayout::eGeneral, - }; - } - present_textures[3].sampler = present_samplers[current_sampler]; - - vk::DescriptorSet set = desc_manager.AllocateSet(present_descriptor_layout); - instance.GetDevice().updateDescriptorSetWithTemplate(set, present_update_template, - present_textures[0]); - - scheduler.Record([this, set, pipeline_index = current_pipeline](vk::CommandBuffer cmdbuf) { cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, present_pipelines[pipeline_index]); - cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, present_pipeline_layout, 0, set, {}); }); @@ -808,7 +805,8 @@ void RendererVulkan::DrawSingleScreenStereo(u32 screen_id_l, u32 screen_id_r, fl }); } -void RendererVulkan::DrawScreens(const Layout::FramebufferLayout& layout, bool flipped) { +void RendererVulkan::DrawScreens(Frame* frame, const Layout::FramebufferLayout& layout, + bool flipped) { if (settings.bg_color_update_requested.exchange(false)) { clear_color.float32[0] = Settings::values.bg_red.GetValue(); clear_color.float32[1] = Settings::values.bg_green.GetValue(); @@ -837,7 +835,7 @@ void RendererVulkan::DrawScreens(const Layout::FramebufferLayout& layout, bool f render_3d == Settings::StereoRenderOption::ReverseInterlaced; // Bind necessary state before drawing the screens - BeginRendering(); + BeginRendering(frame); draw_info.layer = 0; if (layout.top_screen_enabled) { @@ -1028,26 +1026,7 @@ void RendererVulkan::RenderScreenshot() { Frame frame{}; mailbox->ReloadFrame(&frame, width, height); - renderpass_cache.ExitRenderpass(); - scheduler.Record([this, framebuffer = frame.framebuffer, width = frame.width, - height = frame.height](vk::CommandBuffer cmdbuf) { - const vk::ClearValue clear{.color = clear_color}; - const vk::RenderPassBeginInfo renderpass_begin_info = { - .renderPass = renderpass_cache.GetPresentRenderpass(), - .framebuffer = framebuffer, - .renderArea = - vk::Rect2D{ - .offset = {0, 0}, - .extent = {width, height}, - }, - .clearValueCount = 1, - .pClearValues = &clear, - }; - - cmdbuf.beginRenderPass(renderpass_begin_info, vk::SubpassContents::eInline); - }); - - DrawScreens(layout, false); + DrawScreens(&frame, layout, false); scheduler.Record( [width, height, source_image = frame.image, staging_image](vk::CommandBuffer cmdbuf) { diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index 344b840c9..90e1ade26 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -54,6 +54,7 @@ struct ScreenInfo { vk::ImageView image_view; }; +struct Frame; class PresentMailbox; class RendererVulkan : public VideoCore::RendererBase { @@ -89,12 +90,12 @@ private: void RenderScreenshot(); void RenderToMailbox(const Layout::FramebufferLayout& layout, std::unique_ptr& mailbox, bool flipped); - void BeginRendering(); + void BeginRendering(Frame* frame); /** - * Draws the emulated screens to the emulator window. + * Draws the emulated screens to the render frame. */ - void DrawScreens(const Layout::FramebufferLayout& layout, bool flipped); + void DrawScreens(Frame* frame, const Layout::FramebufferLayout& layout, bool flipped); /** * Draws a single texture to the emulator window.