From d1868d9475db2ec99314a2f7f192a63fc40bf962 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 10 Oct 2018 00:57:52 +1100 Subject: RenderBase: Implement imgui rendering --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 718bdec8d7..509269368d 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -702,11 +702,13 @@ void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region xfb_texture->GetRawTexIdentifier()); // Draw OSD - Util::SetViewportAndScissor(g_command_buffer_mgr->GetCurrentCommandBuffer(), 0, 0, - backbuffer->GetWidth(), backbuffer->GetHeight()); + SetViewport(0.0f, 0.0f, static_cast(backbuffer->GetWidth()), + static_cast(backbuffer->GetHeight()), 0.0f, 1.0f); DrawDebugText(); OSD::DoCallbacks(OSD::CallbackType::OnFrame); OSD::DrawMessages(); + StateTracker::GetInstance()->SetPendingRebind(); + DrawImGui(); // End drawing to backbuffer StateTracker::GetInstance()->EndRenderPass(); -- cgit v1.2.3 From 600d1fc0bc884644127057fa8cce5d31cbaef143 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 10 Oct 2018 01:26:31 +1100 Subject: Renderer: Use imgui for drawing debug text and OSD --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 509269368d..5ae6093f24 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -704,9 +704,6 @@ void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region // Draw OSD SetViewport(0.0f, 0.0f, static_cast(backbuffer->GetWidth()), static_cast(backbuffer->GetHeight()), 0.0f, 1.0f); - DrawDebugText(); - OSD::DoCallbacks(OSD::CallbackType::OnFrame); - OSD::DrawMessages(); StateTracker::GetInstance()->SetPendingRebind(); DrawImGui(); -- cgit v1.2.3 From 63dd91628de0c9e8c7a25c403b7900675c515d36 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 10 Oct 2018 01:34:26 +1100 Subject: Remove old RasterFont classes --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 5ae6093f24..eca10a1504 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -21,7 +21,6 @@ #include "VideoBackends/Vulkan/FramebufferManager.h" #include "VideoBackends/Vulkan/ObjectCache.h" #include "VideoBackends/Vulkan/PostProcessing.h" -#include "VideoBackends/Vulkan/RasterFont.h" #include "VideoBackends/Vulkan/Renderer.h" #include "VideoBackends/Vulkan/StateTracker.h" #include "VideoBackends/Vulkan/StreamBuffer.h" @@ -89,13 +88,6 @@ bool Renderer::Initialize() return false; } - m_raster_font = std::make_unique(); - if (!m_raster_font->Initialize()) - { - PanicAlert("Failed to initialize raster font."); - return false; - } - // Swap chain render pass. if (m_swap_chain) { @@ -130,8 +122,7 @@ bool Renderer::Initialize() // Initialize post processing. m_post_processor = std::make_unique(); - if (!static_cast(m_post_processor.get()) - ->Initialize(m_raster_font->GetTexture())) + if (!static_cast(m_post_processor.get())->Initialize()) { PanicAlert("failed to initialize post processor."); return false; @@ -259,17 +250,6 @@ void Renderer::SetPipeline(const AbstractPipeline* pipeline) StateTracker::GetInstance()->SetPipeline(static_cast(pipeline)); } -void Renderer::RenderText(const std::string& text, int left, int top, u32 color) -{ - u32 backbuffer_width = m_swap_chain->GetWidth(); - u32 backbuffer_height = m_swap_chain->GetHeight(); - - m_raster_font->PrintMultiLineText(m_swap_chain_render_pass, text, - left * 2.0f / static_cast(backbuffer_width) - 1, - 1 - top * 2.0f / static_cast(backbuffer_height), - backbuffer_width, backbuffer_height, color); -} - u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) { if (type == EFBAccessType::PeekColor) -- cgit v1.2.3 From c9c0b8505615cb16a770d66650e89c0f41d00dc8 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 19 Jan 2019 00:35:00 +1000 Subject: VideoBackends: Store a backbuffer 'scale' This is a scaling factor, used for hi-dpi configurations. --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index eca10a1504..683df63d21 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -46,9 +46,9 @@ namespace Vulkan { -Renderer::Renderer(std::unique_ptr swap_chain) +Renderer::Renderer(std::unique_ptr swap_chain, float backbuffer_scale) : ::Renderer(swap_chain ? static_cast(swap_chain->GetWidth()) : 1, - swap_chain ? static_cast(swap_chain->GetHeight()) : 0, + swap_chain ? static_cast(swap_chain->GetHeight()) : 0, backbuffer_scale, swap_chain ? swap_chain->GetTextureFormat() : AbstractTextureFormat::Undefined), m_swap_chain(std::move(swap_chain)) { -- cgit v1.2.3 From e4b205c76937d379cd9043939e2cef1651b1a21b Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 28 Nov 2018 14:30:47 +1000 Subject: Decouple XFB scanout from presentation --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 144 ++++++++------------------ 1 file changed, 46 insertions(+), 98 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 683df63d21..dbb0c6e582 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -557,76 +557,24 @@ void Renderer::ReinterpretPixelData(unsigned int convtype) BindEFBToStateTracker(); } -void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region, u64 ticks) +void Renderer::Flush() { - // Pending/batched EFB pokes should be included in the final image. - FramebufferManager::GetInstance()->FlushEFBPokes(); - - auto* xfb_texture = static_cast(texture); + Util::ExecuteCurrentCommandsAndRestoreState(true, false); +} - // End the current render pass. +void Renderer::BindBackbuffer(const ClearColor& clear_color) +{ StateTracker::GetInstance()->EndRenderPass(); - StateTracker::GetInstance()->OnEndFrame(); // Handle host window resizes. CheckForSurfaceChange(); CheckForSurfaceResize(); - // There are a few variables which can alter the final window draw rectangle, and some of them - // are determined by guest state. Currently, the only way to catch these is to update every frame. - UpdateDrawRectangle(); - // Ensure the worker thread is not still submitting a previous command buffer. // In other words, the last frame has been submitted (otherwise the next call would // be a race, as the image may not have been consumed yet). g_command_buffer_mgr->PrepareToSubmitCommandBuffer(); - // Draw to the screen if we have a swap chain. - if (m_swap_chain) - { - DrawScreen(xfb_texture, xfb_region); - - // Submit the current command buffer, signaling rendering finished semaphore when it's done - // Because this final command buffer is rendering to the swap chain, we need to wait for - // the available semaphore to be signaled before executing the buffer. This final submission - // can happen off-thread in the background while we're preparing the next frame. - g_command_buffer_mgr->SubmitCommandBuffer( - true, m_image_available_semaphore, m_rendering_finished_semaphore, - m_swap_chain->GetSwapChain(), m_swap_chain->GetCurrentImageIndex()); - } - else - { - // No swap chain, just execute command buffer. - g_command_buffer_mgr->SubmitCommandBuffer(true); - } - - // NOTE: It is important that no rendering calls are made to the EFB between submitting the - // (now-previous) frame and after the below config checks are completed. If the target size - // changes, as the resize methods to not defer the destruction of the framebuffer, the current - // command buffer will contain references to a now non-existent framebuffer. - - // Prep for the next frame (get command buffer ready) before doing anything else. - BeginFrame(); - - // Restore the EFB color texture to color attachment ready for rendering the next frame. - FramebufferManager::GetInstance()->GetEFBColorTexture()->TransitionToLayout( - g_command_buffer_mgr->GetCurrentCommandBuffer(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - RestoreAPIState(); - - // Determine what (if anything) has changed in the config. - CheckForConfigChanges(); - - // Clean up stale textures. - TextureCache::GetInstance()->Cleanup(frameCount); -} - -void Renderer::Flush() -{ - Util::ExecuteCurrentCommandsAndRestoreState(true, false); -} - -void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region) -{ VkResult res; if (!g_command_buffer_mgr->CheckLastPresentFail()) { @@ -676,48 +624,65 @@ void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region // Begin render pass for rendering to the swap chain. VkClearValue clear_value = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; StateTracker::GetInstance()->BeginClearRenderPass(region, &clear_value, 1); +} - // Draw - BlitScreen(m_swap_chain_render_pass, GetTargetRectangle(), xfb_region, - xfb_texture->GetRawTexIdentifier()); - - // Draw OSD - SetViewport(0.0f, 0.0f, static_cast(backbuffer->GetWidth()), - static_cast(backbuffer->GetHeight()), 0.0f, 1.0f); - StateTracker::GetInstance()->SetPendingRebind(); - DrawImGui(); - +void Renderer::PresentBackbuffer() +{ // End drawing to backbuffer StateTracker::GetInstance()->EndRenderPass(); + StateTracker::GetInstance()->OnEndFrame(); // Transition the backbuffer to PRESENT_SRC to ensure all commands drawing // to it have finished before present. + Texture2D* backbuffer = m_swap_chain->GetCurrentTexture(); backbuffer->TransitionToLayout(g_command_buffer_mgr->GetCurrentCommandBuffer(), VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + + // Submit the current command buffer, signaling rendering finished semaphore when it's done + // Because this final command buffer is rendering to the swap chain, we need to wait for + // the available semaphore to be signaled before executing the buffer. This final submission + // can happen off-thread in the background while we're preparing the next frame. + g_command_buffer_mgr->SubmitCommandBuffer( + true, m_image_available_semaphore, m_rendering_finished_semaphore, + m_swap_chain->GetSwapChain(), m_swap_chain->GetCurrentImageIndex()); + + BeginFrame(); } -void Renderer::BlitScreen(VkRenderPass render_pass, const TargetRectangle& dst_rect, - const TargetRectangle& src_rect, const Texture2D* src_tex) +void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc) { + const TargetRectangle target_rc = GetTargetRectangle(); + VulkanPostProcessing* post_processor = static_cast(m_post_processor.get()); if (g_ActiveConfig.stereo_mode == StereoMode::SBS || g_ActiveConfig.stereo_mode == StereoMode::TAB) { TargetRectangle left_rect; TargetRectangle right_rect; - std::tie(left_rect, right_rect) = ConvertStereoRectangle(dst_rect); - - post_processor->BlitFromTexture(left_rect, src_rect, src_tex, 0, render_pass); - post_processor->BlitFromTexture(right_rect, src_rect, src_tex, 1, render_pass); + std::tie(left_rect, right_rect) = ConvertStereoRectangle(target_rc); + + post_processor->BlitFromTexture(left_rect, rc, + static_cast(texture)->GetRawTexIdentifier(), + 0, m_swap_chain_render_pass); + post_processor->BlitFromTexture(right_rect, rc, + static_cast(texture)->GetRawTexIdentifier(), + 1, m_swap_chain_render_pass); } else if (g_ActiveConfig.stereo_mode == StereoMode::QuadBuffer) { - post_processor->BlitFromTexture(dst_rect, src_rect, src_tex, -1, render_pass); + post_processor->BlitFromTexture(target_rc, rc, + static_cast(texture)->GetRawTexIdentifier(), + -1, m_swap_chain_render_pass); } else { - post_processor->BlitFromTexture(dst_rect, src_rect, src_tex, 0, render_pass); + post_processor->BlitFromTexture(target_rc, rc, + static_cast(texture)->GetRawTexIdentifier(), + 0, m_swap_chain_render_pass); } + + // The post-processor uses the old-style Vulkan draws, which mess with the tracked state. + StateTracker::GetInstance()->SetPendingRebind(); } void Renderer::CheckForSurfaceChange() @@ -766,36 +731,20 @@ void Renderer::CheckForSurfaceResize() OnSwapChainResized(); } -void Renderer::CheckForConfigChanges() +void Renderer::OnConfigChanged(u32 bits) { - // Save the video config so we can compare against to determine which settings have changed. - const u32 old_multisamples = g_ActiveConfig.iMultisamples; - const int old_anisotropy = g_ActiveConfig.iMaxAnisotropy; - const bool old_force_filtering = g_ActiveConfig.bForceFiltering; - - // Copy g_Config to g_ActiveConfig. - // NOTE: This can potentially race with the UI thread, however if it does, the changes will be - // delayed until the next time CheckForConfigChanges is called. - UpdateActiveConfig(); - - // Determine which (if any) settings have changed. - const bool multisamples_changed = old_multisamples != g_ActiveConfig.iMultisamples; - const bool anisotropy_changed = old_anisotropy != g_ActiveConfig.iMaxAnisotropy; - const bool force_texture_filtering_changed = - old_force_filtering != g_ActiveConfig.bForceFiltering; - // Update texture cache settings with any changed options. TextureCache::GetInstance()->OnConfigChanged(g_ActiveConfig); // Handle settings that can cause the EFB framebuffer to change. - if (CalculateTargetSize() || multisamples_changed) + if (bits & CONFIG_CHANGE_BIT_TARGET_SIZE) RecreateEFBFramebuffer(); // MSAA samples changed, we need to recreate the EFB render pass. // If the stereoscopy mode changed, we need to recreate the buffers as well. // SSAA changed on/off, we have to recompile shaders. // Changing stereoscopy from off<->on also requires shaders to be recompiled. - if (CheckForHostConfigChanges()) + if (bits & (CONFIG_CHANGE_BIT_HOST_CONFIG | CONFIG_CHANGE_BIT_MULTISAMPLES)) { RecreateEFBFramebuffer(); RecompileShaders(); @@ -805,22 +754,21 @@ void Renderer::CheckForConfigChanges() } // For vsync, we need to change the present mode, which means recreating the swap chain. - if (m_swap_chain && g_ActiveConfig.IsVSync() != m_swap_chain->IsVSyncEnabled()) + if (m_swap_chain && bits & CONFIG_CHANGE_BIT_VSYNC) { g_command_buffer_mgr->WaitForGPUIdle(); m_swap_chain->SetVSync(g_ActiveConfig.IsVSync()); } // For quad-buffered stereo we need to change the layer count, so recreate the swap chain. - if (m_swap_chain && - (g_ActiveConfig.stereo_mode == StereoMode::QuadBuffer) != m_swap_chain->IsStereoEnabled()) + if (m_swap_chain && bits & CONFIG_CHANGE_BIT_STEREO_MODE) { g_command_buffer_mgr->WaitForGPUIdle(); m_swap_chain->RecreateSwapChain(); } // Wipe sampler cache if force texture filtering or anisotropy changes. - if (anisotropy_changed || force_texture_filtering_changed) + if (bits & (CONFIG_CHANGE_BIT_ANISOTROPY | CONFIG_CHANGE_BIT_FORCE_TEXTURE_FILTERING)) ResetSamplerStates(); // Check for a changed post-processing shader and recompile if needed. -- cgit v1.2.3 From e9b02e7dd0f0e9a509e4444e335edec621562c50 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 20 Jan 2019 11:41:37 +1000 Subject: Vulkan: Remove unused UpdateUtilityUniformBuffer function --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 22 ---------------------- 1 file changed, 22 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index dbb0c6e582..dffe3fdd3c 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -223,28 +223,6 @@ Renderer::CreateFramebuffer(const AbstractTexture* color_attachment, static_cast(depth_attachment)); } -std::tuple Renderer::UpdateUtilityUniformBuffer(const void* uniforms, - u32 uniforms_size) -{ - StreamBuffer* ubo_buf = g_object_cache->GetUtilityShaderUniformBuffer(); - if (!ubo_buf->ReserveMemory(uniforms_size, g_vulkan_context->GetUniformBufferAlignment())) - { - Util::ExecuteCurrentCommandsAndRestoreState(false, true); - if (!ubo_buf->ReserveMemory(uniforms_size, g_vulkan_context->GetUniformBufferAlignment())) - { - PanicAlert("Failed to reserve uniform buffer space for utility draw."); - return {}; - } - } - - VkBuffer ubo = ubo_buf->GetBuffer(); - u32 ubo_offset = static_cast(ubo_buf->GetCurrentOffset()); - std::memcpy(ubo_buf->GetCurrentHostPointer(), uniforms, uniforms_size); - ubo_buf->CommitMemory(uniforms_size); - - return std::tie(ubo, ubo_offset); -} - void Renderer::SetPipeline(const AbstractPipeline* pipeline) { StateTracker::GetInstance()->SetPipeline(static_cast(pipeline)); -- cgit v1.2.3