From 2f20c12d82d367e6ebd3f5b772ebea62ccf05da7 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Wed, 5 Nov 2025 21:52:54 -0600 Subject: [PATCH] VideoCommon: pass the EFB buffer scale into the FramebufferManager instead of pulling it from config, in the future this will allow us to have multiple framebuffers --- Source/Core/VideoCommon/FramebufferManager.cpp | 18 +++++++++--------- Source/Core/VideoCommon/FramebufferManager.h | 8 ++++---- Source/Core/VideoCommon/Present.cpp | 2 +- Source/Core/VideoCommon/VideoBackendBase.cpp | 3 ++- Source/Core/VideoCommon/VideoConfig.cpp | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Source/Core/VideoCommon/FramebufferManager.cpp b/Source/Core/VideoCommon/FramebufferManager.cpp index fc514811d5..71027fb15a 100644 --- a/Source/Core/VideoCommon/FramebufferManager.cpp +++ b/Source/Core/VideoCommon/FramebufferManager.cpp @@ -45,9 +45,9 @@ FramebufferManager::~FramebufferManager() DestroyEFBFramebuffer(); } -bool FramebufferManager::Initialize() +bool FramebufferManager::Initialize(int efb_scale) { - if (!CreateEFBFramebuffer()) + if (!CreateEFBFramebuffer(efb_scale)) { PanicAlertFmt("Failed to create EFB framebuffer"); return false; @@ -90,14 +90,14 @@ bool FramebufferManager::Initialize() return true; } -void FramebufferManager::RecreateEFBFramebuffer() +void FramebufferManager::RecreateEFBFramebuffer(int efb_scale) { FlushEFBPokes(); InvalidatePeekCache(true); DestroyReadbackFramebuffer(); DestroyEFBFramebuffer(); - if (!CreateEFBFramebuffer() || !CreateReadbackFramebuffer()) + if (!CreateEFBFramebuffer(efb_scale) || !CreateReadbackFramebuffer()) PanicAlertFmt("Failed to recreate EFB framebuffer"); } @@ -210,12 +210,12 @@ float FramebufferManager::EFBToScaledYf(float y) const return y * ((float)GetEFBHeight() / (float)EFB_HEIGHT); } -std::tuple FramebufferManager::CalculateTargetSize() +std::tuple FramebufferManager::CalculateTargetSize(int efb_scale) { - if (g_ActiveConfig.iEFBScale == EFB_SCALE_AUTO_INTEGRAL) + if (efb_scale == EFB_SCALE_AUTO_INTEGRAL) m_efb_scale = g_presenter->AutoIntegralScale(); else - m_efb_scale = g_ActiveConfig.iEFBScale; + m_efb_scale = efb_scale; const u32 max_size = g_backend_info.MaxTextureSize; if (max_size < EFB_WIDTH * m_efb_scale) @@ -227,9 +227,9 @@ std::tuple FramebufferManager::CalculateTargetSize() return std::make_tuple(new_efb_width, new_efb_height); } -bool FramebufferManager::CreateEFBFramebuffer() +bool FramebufferManager::CreateEFBFramebuffer(int efb_scale) { - auto [width, height] = CalculateTargetSize(); + auto [width, height] = CalculateTargetSize(efb_scale); const TextureConfig efb_color_texture_config = GetEFBColorTextureConfig(width, height); const TextureConfig efb_depth_texture_config = GetEFBDepthTextureConfig(width, height); diff --git a/Source/Core/VideoCommon/FramebufferManager.h b/Source/Core/VideoCommon/FramebufferManager.h index 62c8c177fc..7654698070 100644 --- a/Source/Core/VideoCommon/FramebufferManager.h +++ b/Source/Core/VideoCommon/FramebufferManager.h @@ -85,10 +85,10 @@ public: float EFBToScaledYf(float y) const; // First-time setup. - bool Initialize(); + bool Initialize(int efb_scale); // Recreate EFB framebuffers, call when the EFB size (IR) changes. - void RecreateEFBFramebuffer(); + void RecreateEFBFramebuffer(int efb_scale); // Recompile shaders, use when MSAA mode changes. void RecompileShaders(); @@ -160,7 +160,7 @@ protected: bool needs_flush; }; - bool CreateEFBFramebuffer(); + bool CreateEFBFramebuffer(int efb_scale); void DestroyEFBFramebuffer(); bool CompileConversionPipelines(); @@ -189,7 +189,7 @@ protected: void DrawPokeVertices(const EFBPokeVertex* vertices, u32 vertex_count, const AbstractPipeline* pipeline); - std::tuple CalculateTargetSize(); + std::tuple CalculateTargetSize(int efb_scale); void DoLoadState(PointerWrap& p); void DoSaveState(PointerWrap& p); diff --git a/Source/Core/VideoCommon/Present.cpp b/Source/Core/VideoCommon/Present.cpp index 24c767cc69..4d2a1ff978 100644 --- a/Source/Core/VideoCommon/Present.cpp +++ b/Source/Core/VideoCommon/Present.cpp @@ -329,7 +329,7 @@ void Presenter::OnBackbufferSet(bool size_changed, bool is_first_set) if (size_changed && !is_first_set && g_ActiveConfig.iEFBScale == EFB_SCALE_AUTO_INTEGRAL && m_auto_resolution_scale != AutoIntegralScale()) { - g_framebuffer_manager->RecreateEFBFramebuffer(); + g_framebuffer_manager->RecreateEFBFramebuffer(g_ActiveConfig.iEFBScale); } if (size_changed || is_first_set) { diff --git a/Source/Core/VideoCommon/VideoBackendBase.cpp b/Source/Core/VideoCommon/VideoBackendBase.cpp index d964eac3f9..676349b65b 100644 --- a/Source/Core/VideoCommon/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/VideoBackendBase.cpp @@ -310,7 +310,8 @@ bool VideoBackendBase::InitializeShared(std::unique_ptr gfx, if (!g_vertex_manager->Initialize() || !g_shader_cache->Initialize() || !g_perf_query->Initialize() || !g_presenter->Initialize() || - !g_framebuffer_manager->Initialize() || !g_texture_cache->Initialize() || + !g_framebuffer_manager->Initialize(g_ActiveConfig.iEFBScale) || + !g_texture_cache->Initialize() || (g_backend_info.bSupportsBBox && !g_bounding_box->Initialize()) || !g_graphics_mod_manager->Initialize()) { diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 63d061e684..f2d5df38f9 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -369,7 +369,7 @@ void CheckForConfigChanges() if (changed_bits & (CONFIG_CHANGE_BIT_MULTISAMPLES | CONFIG_CHANGE_BIT_STEREO_MODE | CONFIG_CHANGE_BIT_TARGET_SIZE | CONFIG_CHANGE_BIT_HDR)) { - g_framebuffer_manager->RecreateEFBFramebuffer(); + g_framebuffer_manager->RecreateEFBFramebuffer(g_ActiveConfig.iEFBScale); } if (old_scale != g_framebuffer_manager->GetEFBScale())