From 238a70b0060c1d45b12d4702bb41725e9ebb5fa6 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 4 Mar 2017 16:40:08 +1000 Subject: [PATCH] VideoCommon: Move some common initialization logic to RenderBase --- .../VideoBackends/D3D/FramebufferManager.cpp | 14 +++---------- .../VideoBackends/D3D/FramebufferManager.h | 2 +- Source/Core/VideoBackends/D3D/Render.cpp | 20 +++---------------- Source/Core/VideoBackends/D3D/Render.h | 4 ++-- Source/Core/VideoBackends/D3D/main.cpp | 7 ++++++- .../D3D12/FramebufferManager.cpp | 6 +++--- .../VideoBackends/D3D12/FramebufferManager.h | 2 +- Source/Core/VideoBackends/D3D12/Render.cpp | 18 +++-------------- Source/Core/VideoBackends/D3D12/Render.h | 4 ++-- Source/Core/VideoBackends/D3D12/main.cpp | 3 ++- .../Core/VideoBackends/Null/NullBackend.cpp | 1 + Source/Core/VideoBackends/Null/Render.cpp | 2 +- Source/Core/VideoBackends/Null/Render.h | 2 +- Source/Core/VideoBackends/OGL/Render.cpp | 19 ++++-------------- Source/Core/VideoBackends/OGL/Render.h | 2 +- .../VideoBackends/Software/SWRenderer.cpp | 5 +++++ .../Core/VideoBackends/Software/SWRenderer.h | 1 + Source/Core/VideoBackends/Software/SWmain.cpp | 1 + Source/Core/VideoBackends/Vulkan/Renderer.cpp | 16 ++++----------- Source/Core/VideoBackends/Vulkan/Renderer.h | 2 +- Source/Core/VideoCommon/RenderBase.cpp | 17 +++++++++++++++- Source/Core/VideoCommon/RenderBase.h | 6 +++++- 22 files changed, 67 insertions(+), 87 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/FramebufferManager.cpp b/Source/Core/VideoBackends/D3D/FramebufferManager.cpp index 46554bdfaf..b2eb16f345 100644 --- a/Source/Core/VideoBackends/D3D/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/D3D/FramebufferManager.cpp @@ -98,18 +98,10 @@ D3DTexture2D*& FramebufferManager::GetResolvedEFBDepthTexture() } } -FramebufferManager::FramebufferManager() +FramebufferManager::FramebufferManager(int target_width, int target_height) { - m_target_width = g_renderer->GetTargetWidth(); - m_target_height = g_renderer->GetTargetHeight(); - if (m_target_height < 1) - { - m_target_height = 1; - } - if (m_target_width < 1) - { - m_target_width = 1; - } + m_target_width = static_cast(std::max(target_width, 1)); + m_target_height = static_cast(std::max(target_height, 1)); DXGI_SAMPLE_DESC sample_desc; sample_desc.Count = g_ActiveConfig.iMultisamples; sample_desc.Quality = 0; diff --git a/Source/Core/VideoBackends/D3D/FramebufferManager.h b/Source/Core/VideoBackends/D3D/FramebufferManager.h index eb124aebe0..bded95df47 100644 --- a/Source/Core/VideoBackends/D3D/FramebufferManager.h +++ b/Source/Core/VideoBackends/D3D/FramebufferManager.h @@ -60,7 +60,7 @@ struct XFBSource : public XFBSourceBase class FramebufferManager : public FramebufferManagerBase { public: - FramebufferManager(); + FramebufferManager(int target_width, int target_height); ~FramebufferManager(); static D3DTexture2D*& GetEFBColorTexture(); diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 7e74177da8..606849a39c 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -84,8 +84,6 @@ static void SetupDeviceObjects() { s_television.Init(); - g_framebuffer_manager = std::make_unique(); - HRESULT hr; D3D11_DEPTH_STENCIL_DESC ddesc; @@ -235,25 +233,13 @@ static void Create3DVisionTexture(int width, int height) delete[] sysData.pSysMem; } -Renderer::Renderer(void*& window_handle) +Renderer::Renderer() : ::Renderer(D3D::GetBackBufferWidth(), D3D::GetBackBufferHeight()) { - D3D::Create((HWND)window_handle); - - s_backbuffer_width = D3D::GetBackBufferWidth(); - s_backbuffer_height = D3D::GetBackBufferHeight(); - - FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); - FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); - - UpdateDrawRectangle(); - s_last_multisamples = g_ActiveConfig.iMultisamples; - s_last_efb_scale = g_ActiveConfig.iEFBScale; s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; - CalculateTargetSize(); - PixelShaderManager::SetEfbScaleChanged(); + g_framebuffer_manager = std::make_unique(s_target_width, s_target_height); SetupDeviceObjects(); // Setup GX pipeline state @@ -907,7 +893,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, D3D::context->OMSetRenderTargets(1, &D3D::GetBackBuffer()->GetRTV(), nullptr); g_framebuffer_manager.reset(); - g_framebuffer_manager = std::make_unique(); + g_framebuffer_manager = std::make_unique(s_target_width, s_target_height); float clear_col[4] = {0.f, 0.f, 0.f, 1.f}; D3D::context->ClearRenderTargetView(FramebufferManager::GetEFBColorTexture()->GetRTV(), clear_col); diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h index 4fdc85afcb..ffb35fc7e7 100644 --- a/Source/Core/VideoBackends/D3D/Render.h +++ b/Source/Core/VideoBackends/D3D/Render.h @@ -16,8 +16,8 @@ class D3DTexture2D; class Renderer : public ::Renderer { public: - Renderer(void*& window_handle); - ~Renderer(); + Renderer(); + ~Renderer() override; void SetColorMask() override; void SetBlendMode(bool forceUpdate) override; diff --git a/Source/Core/VideoBackends/D3D/main.cpp b/Source/Core/VideoBackends/D3D/main.cpp index fe32d89603..6b0e23ef1f 100644 --- a/Source/Core/VideoBackends/D3D/main.cpp +++ b/Source/Core/VideoBackends/D3D/main.cpp @@ -6,6 +6,7 @@ #include #include "Common/CommonTypes.h" +#include "Common/MsgHandler.h" #include "Common/StringUtil.h" #include "VideoBackends/D3D/BoundingBox.h" @@ -144,11 +145,15 @@ bool VideoBackend::Initialize(void* window_handle) void VideoBackend::Video_Prepare() { + if (FAILED(D3D::Create(reinterpret_cast(m_window_handle)))) + PanicAlert("Failed to create D3D device."); + // internal interfaces - g_renderer = std::make_unique(m_window_handle); + g_renderer = std::make_unique(); g_texture_cache = std::make_unique(); g_vertex_manager = std::make_unique(); g_perf_query = std::make_unique(); + g_renderer->InitializeCommon(); VertexShaderCache::Init(); PixelShaderCache::Init(); GeometryShaderCache::Init(); diff --git a/Source/Core/VideoBackends/D3D12/FramebufferManager.cpp b/Source/Core/VideoBackends/D3D12/FramebufferManager.cpp index 3229980b29..fccafcd484 100644 --- a/Source/Core/VideoBackends/D3D12/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/D3D12/FramebufferManager.cpp @@ -84,10 +84,10 @@ D3DTexture2D*& FramebufferManager::GetResolvedEFBDepthTexture() } } -FramebufferManager::FramebufferManager() +FramebufferManager::FramebufferManager(int target_width, int target_height) { - m_target_width = std::max(g_renderer->GetTargetWidth(), 1); - m_target_height = std::max(g_renderer->GetTargetHeight(), 1); + m_target_width = static_cast(std::max(target_width, 1)); + m_target_height = static_cast(std::max(target_height, 1)); DXGI_SAMPLE_DESC sample_desc; sample_desc.Count = g_ActiveConfig.iMultisamples; diff --git a/Source/Core/VideoBackends/D3D12/FramebufferManager.h b/Source/Core/VideoBackends/D3D12/FramebufferManager.h index 12a950c192..d8074f11b3 100644 --- a/Source/Core/VideoBackends/D3D12/FramebufferManager.h +++ b/Source/Core/VideoBackends/D3D12/FramebufferManager.h @@ -58,7 +58,7 @@ struct XFBSource final : public XFBSourceBase class FramebufferManager final : public FramebufferManagerBase { public: - FramebufferManager(); + FramebufferManager(int target_width, int target_height); ~FramebufferManager(); static D3DTexture2D*& GetEFBColorTexture(); diff --git a/Source/Core/VideoBackends/D3D12/Render.cpp b/Source/Core/VideoBackends/D3D12/Render.cpp index c9e8c618c1..d63af49a04 100644 --- a/Source/Core/VideoBackends/D3D12/Render.cpp +++ b/Source/Core/VideoBackends/D3D12/Render.cpp @@ -101,8 +101,6 @@ StateCache gx_state_cache; static void SetupDeviceObjects() { - g_framebuffer_manager = std::make_unique(); - D3D12_DEPTH_STENCIL_DESC depth_desc; depth_desc.DepthEnable = FALSE; depth_desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO; @@ -211,7 +209,7 @@ static void Create3DVisionTexture(int width, int height) // D3D12TODO: 3D Vision not implemented on D3D12 backend. } -Renderer::Renderer(void*& window_handle) +Renderer::Renderer() : ::Renderer(D3D::GetBackBufferWidth(), D3D::GetBackBufferHeight()) { if (g_ActiveConfig.iStereoMode == STEREO_3DVISION) { @@ -219,21 +217,11 @@ Renderer::Renderer(void*& window_handle) return; } - s_backbuffer_width = D3D::GetBackBufferWidth(); - s_backbuffer_height = D3D::GetBackBufferHeight(); - - FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); - FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); - - UpdateDrawRectangle(); - s_last_multisamples = g_ActiveConfig.iMultisamples; - s_last_efb_scale = g_ActiveConfig.iEFBScale; s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; - CalculateTargetSize(); - PixelShaderManager::SetEfbScaleChanged(); + g_framebuffer_manager = std::make_unique(s_target_width, s_target_height); SetupDeviceObjects(); // Setup GX pipeline state @@ -877,7 +865,7 @@ void Renderer::SwapImpl(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height nullptr); g_framebuffer_manager.reset(); - g_framebuffer_manager = std::make_unique(); + g_framebuffer_manager = std::make_unique(s_target_width, s_target_height); const float clear_color[4] = {0.f, 0.f, 0.f, 1.f}; FramebufferManager::GetEFBColorTexture()->TransitionToResourceState( diff --git a/Source/Core/VideoBackends/D3D12/Render.h b/Source/Core/VideoBackends/D3D12/Render.h index bb40e689eb..90471f7e6b 100644 --- a/Source/Core/VideoBackends/D3D12/Render.h +++ b/Source/Core/VideoBackends/D3D12/Render.h @@ -17,8 +17,8 @@ class D3DTexture2D; class Renderer final : public ::Renderer { public: - Renderer(void*& window_handle); - ~Renderer(); + Renderer(); + ~Renderer() override; void SetColorMask() override; void SetBlendMode(bool force_update) override; diff --git a/Source/Core/VideoBackends/D3D12/main.cpp b/Source/Core/VideoBackends/D3D12/main.cpp index ef377bab41..f6a2347e40 100644 --- a/Source/Core/VideoBackends/D3D12/main.cpp +++ b/Source/Core/VideoBackends/D3D12/main.cpp @@ -163,11 +163,12 @@ bool VideoBackend::Initialize(void* window_handle) void VideoBackend::Video_Prepare() { // internal interfaces - g_renderer = std::make_unique(m_window_handle); + g_renderer = std::make_unique(); g_texture_cache = std::make_unique(); g_vertex_manager = std::make_unique(); g_perf_query = std::make_unique(); g_xfb_encoder = std::make_unique(); + g_renderer->InitializeCommon(); ShaderCache::Init(); ShaderConstantsManager::Init(); StaticShaderCache::Init(); diff --git a/Source/Core/VideoBackends/Null/NullBackend.cpp b/Source/Core/VideoBackends/Null/NullBackend.cpp index 1e3117088e..f0d073db71 100644 --- a/Source/Core/VideoBackends/Null/NullBackend.cpp +++ b/Source/Core/VideoBackends/Null/NullBackend.cpp @@ -67,6 +67,7 @@ void VideoBackend::Video_Prepare() g_perf_query = std::make_unique(); g_framebuffer_manager = std::make_unique(); g_texture_cache = std::make_unique(); + g_renderer->InitializeCommon(); VertexShaderCache::s_instance = std::make_unique(); GeometryShaderCache::s_instance = std::make_unique(); PixelShaderCache::s_instance = std::make_unique(); diff --git a/Source/Core/VideoBackends/Null/Render.cpp b/Source/Core/VideoBackends/Null/Render.cpp index 4a8cfe9bae..2e1c31069f 100644 --- a/Source/Core/VideoBackends/Null/Render.cpp +++ b/Source/Core/VideoBackends/Null/Render.cpp @@ -11,7 +11,7 @@ namespace Null { // Init functions -Renderer::Renderer() +Renderer::Renderer() : ::Renderer(1, 1) { g_Config.bRunning = true; UpdateActiveConfig(); diff --git a/Source/Core/VideoBackends/Null/Render.h b/Source/Core/VideoBackends/Null/Render.h index 0c2bd035c2..9e303281a1 100644 --- a/Source/Core/VideoBackends/Null/Render.h +++ b/Source/Core/VideoBackends/Null/Render.h @@ -12,7 +12,7 @@ class Renderer : public ::Renderer { public: Renderer(); - ~Renderer(); + ~Renderer() override; void RenderText(const std::string& pstr, int left, int top, u32 color) override; u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override { return 0; } diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 8ccabe5732..ddf1d3b9fb 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -329,6 +329,8 @@ static void InitDriverInfo() // Init functions Renderer::Renderer() + : ::Renderer(static_cast(std::max(GLInterface->GetBackBufferWidth(), 1u)), + static_cast(std::max(GLInterface->GetBackBufferHeight(), 1u))) { bool bSuccess = true; @@ -687,26 +689,11 @@ Renderer::Renderer() s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; - // Decide framebuffer size - s_backbuffer_width = static_cast(std::max(GLInterface->GetBackBufferWidth(), 1u)); - s_backbuffer_height = static_cast(std::max(GLInterface->GetBackBufferHeight(), 1u)); - // Handle VSync on/off s_vsync = g_ActiveConfig.IsVSync(); if (!DriverDetails::HasBug(DriverDetails::BUG_BROKEN_VSYNC)) GLInterface->SwapInterval(s_vsync); - // TODO: Move these somewhere else? - FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); - FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); - - UpdateDrawRectangle(); - - s_last_efb_scale = g_ActiveConfig.iEFBScale; - CalculateTargetSize(); - - PixelShaderManager::SetEfbScaleChanged(); - // Because of the fixed framebuffer size we need to disable the resolution // options while running g_Config.bRunning = true; @@ -786,6 +773,8 @@ void Renderer::Shutdown() void Renderer::Init() { + InitializeCommon(); + // Initialize the FramebufferManager g_framebuffer_manager = std::make_unique(s_target_width, s_target_height, s_MSAASamples); diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index 5ae65f1395..095ddcd1ea 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -69,7 +69,7 @@ class Renderer : public ::Renderer { public: Renderer(); - ~Renderer(); + ~Renderer() override; void Init(); void Shutdown(); diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp index 746a533ee6..fb239f06c5 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.cpp +++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp @@ -25,6 +25,11 @@ static u8* s_xfbColorTexture[2]; static int s_currentColorTexture = 0; +SWRenderer::SWRenderer() + : ::Renderer(static_cast(MAX_XFB_WIDTH), static_cast(MAX_XFB_HEIGHT)) +{ +} + SWRenderer::~SWRenderer() { delete[] s_xfbColorTexture[0]; diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h index b7449eb81a..ab75c761d8 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.h +++ b/Source/Core/VideoBackends/Software/SWRenderer.h @@ -13,6 +13,7 @@ class SWRenderer : public Renderer { public: + SWRenderer(); ~SWRenderer() override; static void Init(); diff --git a/Source/Core/VideoBackends/Software/SWmain.cpp b/Source/Core/VideoBackends/Software/SWmain.cpp index adbe5046b6..11ddad99b4 100644 --- a/Source/Core/VideoBackends/Software/SWmain.cpp +++ b/Source/Core/VideoBackends/Software/SWmain.cpp @@ -181,6 +181,7 @@ void VideoSoftware::Video_Prepare() g_vertex_manager = std::make_unique(); g_perf_query = std::make_unique(); g_texture_cache = std::make_unique(); + g_renderer->InitializeCommon(); SWRenderer::Init(); g_framebuffer_manager = std::make_unique(); } diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 3f43df4b70..a2bfbcf606 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -42,7 +42,10 @@ namespace Vulkan { -Renderer::Renderer(std::unique_ptr swap_chain) : m_swap_chain(std::move(swap_chain)) +Renderer::Renderer(std::unique_ptr swap_chain) + : ::Renderer(swap_chain ? static_cast(swap_chain->GetWidth()) : 1, + swap_chain ? static_cast(swap_chain->GetHeight()) : 0), + m_swap_chain(std::move(swap_chain)) { g_Config.bRunning = true; UpdateActiveConfig(); @@ -50,17 +53,6 @@ Renderer::Renderer(std::unique_ptr swap_chain) : m_swap_chain(std::mo // Set to something invalid, forcing all states to be re-initialized. for (size_t i = 0; i < m_sampler_states.size(); i++) m_sampler_states[i].bits = std::numeric_limits::max(); - - // These have to be initialized before FramebufferManager is created. - // If running surfaceless, assume a window size of MAX_XFB_{WIDTH,HEIGHT}. - FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); - FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); - s_backbuffer_width = m_swap_chain ? m_swap_chain->GetWidth() : MAX_XFB_WIDTH; - s_backbuffer_height = m_swap_chain ? m_swap_chain->GetHeight() : MAX_XFB_HEIGHT; - s_last_efb_scale = g_ActiveConfig.iEFBScale; - UpdateDrawRectangle(); - CalculateTargetSize(); - PixelShaderManager::SetEfbScaleChanged(); } Renderer::~Renderer() diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h index d07389da71..34a3202b4f 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.h +++ b/Source/Core/VideoBackends/Vulkan/Renderer.h @@ -28,7 +28,7 @@ class Renderer : public ::Renderer { public: Renderer(std::unique_ptr swap_chain); - ~Renderer(); + ~Renderer() override; static Renderer* GetInstance(); diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 6f61a84d94..ab7a2adedf 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -50,6 +50,7 @@ #include "VideoCommon/FramebufferManagerBase.h" #include "VideoCommon/ImageWrite.h" #include "VideoCommon/OnScreenDisplay.h" +#include "VideoCommon/PixelShaderManager.h" #include "VideoCommon/PostProcessing.h" #include "VideoCommon/Statistics.h" #include "VideoCommon/TextureCacheBase.h" @@ -75,10 +76,19 @@ static float AspectToWidescreen(float aspect) return aspect * ((16.0f / 9.0f) / (4.0f / 3.0f)); } -Renderer::Renderer() +Renderer::Renderer(int backbuffer_width, int backbuffer_height) { + FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); + FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); + UpdateActiveConfig(); + s_backbuffer_width = backbuffer_width; + s_backbuffer_height = backbuffer_height; + s_last_efb_scale = g_ActiveConfig.iEFBScale; + CalculateTargetSize(); + UpdateDrawRectangle(); + OSDChoice = 0; OSDTime = 0; } @@ -606,6 +616,11 @@ void Renderer::UpdateDrawRectangle() target_rc.bottom = YOffset + iHeight; } +void Renderer::InitializeCommon() +{ + PixelShaderManager::SetEfbScaleChanged(); +} + void Renderer::SetWindowSize(int width, int height) { if (width < 1) diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index ba855a1d11..c8a7b05852 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -50,7 +50,7 @@ extern int OSDChoice; class Renderer { public: - Renderer(); + Renderer(int backbuffer_width, int backbuffer_height); virtual ~Renderer(); enum PixelPerfQuery @@ -79,6 +79,10 @@ public: virtual void RestoreState() {} virtual void ResetAPIState() {} virtual void RestoreAPIState() {} + // Some of the methods called by here assume g_renderer is initialized, therefore + // we must call it after constructing the backend's Renderer instance. + void InitializeCommon(); + // Ideal internal resolution - determined by display resolution (automatic scaling) and/or a // multiple of the native EFB resolution int GetTargetWidth() { return s_target_width; }