VideoBackends: Merge Initialize and Shutdown functions.

This commit is contained in:
degasus
2016-01-13 21:14:20 +01:00
parent b16333a25c
commit 7833ff25df
27 changed files with 154 additions and 282 deletions

View File

@ -16,6 +16,7 @@ class VideoBackend : public VideoBackendBase
std::string GetName() const override;
std::string GetDisplayName() const override;
std::string GetConfigName() const override;
void Video_Prepare() override;
void Video_Cleanup() override;

View File

@ -61,6 +61,11 @@ std::string VideoBackend::GetDisplayName() const
return "Direct3D 11";
}
std::string VideoBackend::GetConfigName() const
{
return "gfx_dx11";
}
void InitBackendInfo()
{
HRESULT hr = DX11::D3D::LoadDXGI();
@ -141,7 +146,7 @@ void InitBackendInfo()
void VideoBackend::ShowConfig(void* hParent)
{
InitBackendInfo();
Host_ShowVideoConfig(hParent, GetDisplayName(), "gfx_dx11");
Host_ShowVideoConfig(hParent, GetDisplayName(), GetConfigName());
}
bool VideoBackend::Initialize(void* window_handle)
@ -149,23 +154,10 @@ bool VideoBackend::Initialize(void* window_handle)
if (window_handle == nullptr)
return false;
InitializeShared();
InitBackendInfo();
frameCount = 0;
if (File::Exists(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini"))
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini");
else
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "gfx_dx11.ini");
g_Config.GameIniLoad();
g_Config.UpdateProjectionHack();
g_Config.VerifyValidity();
UpdateActiveConfig();
InitializeShared();
m_window_handle = window_handle;
m_initialized = true;
return true;
}
@ -181,55 +173,27 @@ void VideoBackend::Video_Prepare()
PixelShaderCache::Init();
GeometryShaderCache::Init();
D3D::InitUtils();
// VideoCommon
BPInit();
Fifo::Init();
IndexGenerator::Init();
VertexLoaderManager::Init();
OpcodeDecoder::Init();
VertexShaderManager::Init();
PixelShaderManager::Init();
GeometryShaderManager::Init();
CommandProcessor::Init();
PixelEngine::Init();
BBox::Init();
// Tell the host that the window is ready
Host_Message(WM_USER_CREATE);
}
void VideoBackend::Shutdown()
{
m_initialized = false;
// TODO: should be in Video_Cleanup
if (g_renderer)
{
// VideoCommon
Fifo::Shutdown();
CommandProcessor::Shutdown();
GeometryShaderManager::Shutdown();
PixelShaderManager::Shutdown();
VertexShaderManager::Shutdown();
OpcodeDecoder::Shutdown();
VertexLoaderManager::Shutdown();
D3D::ShutdownUtils();
PixelShaderCache::Shutdown();
VertexShaderCache::Shutdown();
GeometryShaderCache::Shutdown();
BBox::Shutdown();
// internal interfaces
D3D::ShutdownUtils();
PixelShaderCache::Shutdown();
VertexShaderCache::Shutdown();
GeometryShaderCache::Shutdown();
BBox::Shutdown();
g_perf_query.reset();
g_vertex_manager.reset();
g_texture_cache.reset();
g_renderer.reset();
g_perf_query.reset();
g_vertex_manager.reset();
g_texture_cache.reset();
g_renderer.reset();
}
ShutdownShared();
}
void VideoBackend::Video_Cleanup()
{
CleanupShared();
}
}

View File

@ -16,6 +16,7 @@ class VideoBackend : public VideoBackendBase
std::string GetName() const override;
std::string GetDisplayName() const override;
std::string GetConfigName() const override;
void Video_Prepare() override;
void Video_Cleanup() override;

View File

@ -62,6 +62,11 @@ std::string VideoBackend::GetDisplayName() const
return "Direct3D 12 (experimental)";
}
std::string VideoBackend::GetConfigName() const
{
return "gfx_dx12";
}
void InitBackendInfo()
{
HRESULT hr = D3D::LoadDXGI();
@ -155,7 +160,7 @@ void InitBackendInfo()
void VideoBackend::ShowConfig(void* hParent)
{
InitBackendInfo();
Host_ShowVideoConfig(hParent, GetDisplayName(), "gfx_dx12");
Host_ShowVideoConfig(hParent, GetDisplayName(), GetConfigName());
}
bool VideoBackend::Initialize(void* window_handle)
@ -163,26 +168,13 @@ bool VideoBackend::Initialize(void* window_handle)
if (window_handle == nullptr)
return false;
InitializeShared();
InitBackendInfo();
frameCount = 0;
if (File::Exists(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini"))
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini");
else
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "gfx_dx12.ini");
g_Config.GameIniLoad();
g_Config.UpdateProjectionHack();
g_Config.VerifyValidity();
UpdateActiveConfig();
InitializeShared();
if (FAILED(D3D::Create((HWND)window_handle)))
return false;
m_window_handle = window_handle;
m_initialized = true;
return true;
}
@ -200,62 +192,36 @@ void VideoBackend::Video_Prepare()
StaticShaderCache::Init();
StateCache::Init(); // PSO cache is populated here, after constituent shaders are loaded.
D3D::InitUtils();
// VideoCommon
BPInit();
Fifo::Init();
IndexGenerator::Init();
VertexLoaderManager::Init();
OpcodeDecoder::Init();
VertexShaderManager::Init();
PixelShaderManager::Init();
GeometryShaderManager::Init();
CommandProcessor::Init();
PixelEngine::Init();
BBox::Init();
// Tell the host that the window is ready
Host_Message(WM_USER_CREATE);
}
void VideoBackend::Shutdown()
{
m_initialized = true;
// TODO: should be in Video_Cleanup
if (g_renderer)
{
// Immediately stop app from submitting work to GPU, and wait for all submitted work to
// complete. D3D12TODO: Check this.
D3D::command_list_mgr->ExecuteQueuedWork(true);
// VideoCommon
Fifo::Shutdown();
CommandProcessor::Shutdown();
GeometryShaderManager::Shutdown();
PixelShaderManager::Shutdown();
VertexShaderManager::Shutdown();
OpcodeDecoder::Shutdown();
VertexLoaderManager::Shutdown();
// Immediately stop app from submitting work to GPU, and wait for all submitted work to complete.
// D3D12TODO: Check this.
D3D::command_list_mgr->ExecuteQueuedWork(true);
// internal interfaces
D3D::ShutdownUtils();
ShaderCache::Shutdown();
ShaderConstantsManager::Shutdown();
StaticShaderCache::Shutdown();
BBox::Shutdown();
// internal interfaces
D3D::ShutdownUtils();
ShaderCache::Shutdown();
ShaderConstantsManager::Shutdown();
StaticShaderCache::Shutdown();
BBox::Shutdown();
g_xfb_encoder.reset();
g_perf_query.reset();
g_vertex_manager.reset();
g_texture_cache.reset();
g_renderer.reset();
g_xfb_encoder.reset();
g_perf_query.reset();
g_vertex_manager.reset();
g_texture_cache.reset();
g_renderer.reset();
D3D::Close();
}
D3D::Close();
ShutdownShared();
}
void VideoBackend::Video_Cleanup()
{
CleanupShared();
}
}

View File

@ -53,7 +53,7 @@ static void InitBackendInfo()
void VideoBackend::ShowConfig(void* parent)
{
InitBackendInfo();
Host_ShowVideoConfig(parent, GetDisplayName(), "gfx_null");
Host_ShowVideoConfig(parent, GetDisplayName(), GetConfigName());
}
bool VideoBackend::Initialize(void* window_handle)
@ -61,28 +61,6 @@ bool VideoBackend::Initialize(void* window_handle)
InitializeShared();
InitBackendInfo();
// Load Configs
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini");
g_Config.GameIniLoad();
g_Config.UpdateProjectionHack();
g_Config.VerifyValidity();
UpdateActiveConfig();
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Initialization);
// Initialize VideoCommon
CommandProcessor::Init();
PixelEngine::Init();
BPInit();
Fifo::Init();
OpcodeDecoder::Init();
IndexGenerator::Init();
VertexShaderManager::Init();
PixelShaderManager::Init();
VertexLoaderManager::Init();
Host_Message(WM_USER_CREATE);
return true;
}
@ -102,19 +80,12 @@ void VideoBackend::Video_Prepare()
void VideoBackend::Shutdown()
{
// Shutdown VideoCommon
Fifo::Shutdown();
VertexLoaderManager::Shutdown();
VertexShaderManager::Shutdown();
PixelShaderManager::Shutdown();
OpcodeDecoder::Shutdown();
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Shutdown);
ShutdownShared();
}
void VideoBackend::Video_Cleanup()
{
CleanupShared();
PixelShaderCache::s_instance.reset();
VertexShaderCache::s_instance.reset();
GeometryShaderCache::s_instance.reset();

View File

@ -15,6 +15,7 @@ class VideoBackend : public VideoBackendBase
std::string GetName() const override { return "Null"; }
std::string GetDisplayName() const override { return "Null"; }
std::string GetConfigName() const override { return "gfx_null"; }
void Video_Prepare() override;
void Video_Cleanup() override;

View File

@ -39,6 +39,7 @@
#include "VideoCommon/DriverDetails.h"
#include "VideoCommon/Fifo.h"
#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/IndexGenerator.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/PixelEngine.h"
#include "VideoCommon/PixelShaderManager.h"
@ -753,6 +754,8 @@ Renderer::Renderer()
}
}
}
IndexGenerator::Init();
UpdateActiveConfig();
ClearEFBCache();
}

View File

@ -16,6 +16,7 @@ class VideoBackend : public VideoBackendBase
std::string GetName() const override;
std::string GetDisplayName() const override;
std::string GetConfigName() const override;
void Video_Prepare() override;
void Video_Cleanup() override;

View File

@ -91,6 +91,11 @@ std::string VideoBackend::GetDisplayName() const
return "OpenGL";
}
std::string VideoBackend::GetConfigName() const
{
return "gfx_opengl";
}
static std::vector<std::string> GetShaders(const std::string& sub_dir = "")
{
std::vector<std::string> paths =
@ -116,6 +121,12 @@ static void InitBackendInfo()
g_Config.backend_info.bSupportsPostProcessing = true;
g_Config.backend_info.bSupportsSSAA = true;
// Overwritten in Render.cpp later
g_Config.backend_info.bSupportsDualSourceBlend = true;
g_Config.backend_info.bSupportsPrimitiveRestart = true;
g_Config.backend_info.bSupportsPaletteConversion = true;
g_Config.backend_info.bSupportsClipControl = true;
g_Config.backend_info.Adapters.clear();
// aamodes - 1 is to stay consistent with D3D (means no AA)
@ -131,35 +142,19 @@ void VideoBackend::ShowConfig(void* parent_handle)
if (!m_initialized)
InitBackendInfo();
Host_ShowVideoConfig(parent_handle, GetDisplayName(), "gfx_opengl");
Host_ShowVideoConfig(parent_handle, GetDisplayName(), GetConfigName());
}
bool VideoBackend::Initialize(void* window_handle)
{
InitializeShared();
InitBackendInfo();
frameCount = 0;
if (File::Exists(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini"))
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "GFX.ini");
else
g_Config.Load(File::GetUserPath(D_CONFIG_IDX) + "gfx_opengl.ini");
g_Config.GameIniLoad();
g_Config.UpdateProjectionHack();
g_Config.VerifyValidity();
UpdateActiveConfig();
InitializeShared();
InitInterface();
GLInterface->SetMode(GLInterfaceMode::MODE_DETECT);
if (!GLInterface->Create(window_handle))
return false;
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Initialization);
m_initialized = true;
return true;
}
@ -171,65 +166,36 @@ void VideoBackend::Video_Prepare()
g_renderer = std::make_unique<Renderer>();
CommandProcessor::Init();
PixelEngine::Init();
BPInit();
g_vertex_manager = std::make_unique<VertexManager>();
g_perf_query = GetPerfQuery();
Fifo::Init(); // must be done before OpcodeDecoder::Init()
OpcodeDecoder::Init();
IndexGenerator::Init();
VertexShaderManager::Init();
PixelShaderManager::Init();
GeometryShaderManager::Init();
ProgramShaderCache::Init();
g_texture_cache = std::make_unique<TextureCache>();
g_sampler_cache = std::make_unique<SamplerCache>();
Renderer::Init();
VertexLoaderManager::Init();
TextureConverter::Init();
BoundingBox::Init();
// Notify the core that the video backend is ready
Host_Message(WM_USER_CREATE);
}
void VideoBackend::Shutdown()
{
m_initialized = false;
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Shutdown);
GLInterface->Shutdown();
GLInterface.reset();
ShutdownShared();
}
void VideoBackend::Video_Cleanup()
{
if (!g_renderer)
return;
Fifo::Shutdown();
// The following calls are NOT Thread Safe
// And need to be called from the video thread
CleanupShared();
Renderer::Shutdown();
BoundingBox::Shutdown();
TextureConverter::Shutdown();
VertexLoaderManager::Shutdown();
g_sampler_cache.reset();
g_texture_cache.reset();
ProgramShaderCache::Shutdown();
VertexShaderManager::Shutdown();
PixelShaderManager::Shutdown();
GeometryShaderManager::Shutdown();
g_perf_query.reset();
g_vertex_manager.reset();
OpcodeDecoder::Shutdown();
g_renderer.reset();
GLInterface->ClearCurrent();
}

View File

@ -134,6 +134,11 @@ std::string VideoSoftware::GetDisplayName() const
return "Software Renderer";
}
std::string VideoSoftware::GetConfigName() const
{
return "gfx_software";
}
static void InitBackendInfo()
{
g_Config.backend_info.APIType = API_NONE;
@ -151,19 +156,13 @@ void VideoSoftware::ShowConfig(void* hParent)
{
if (!m_initialized)
InitBackendInfo();
Host_ShowVideoConfig(hParent, GetDisplayName(), "gfx_software");
Host_ShowVideoConfig(hParent, GetDisplayName(), GetConfigName());
}
bool VideoSoftware::Initialize(void* window_handle)
{
InitializeShared();
InitBackendInfo();
g_Config.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_software.ini").c_str());
g_Config.GameIniLoad();
g_Config.UpdateProjectionHack();
g_Config.VerifyValidity();
UpdateActiveConfig();
InitializeShared();
SWOGLWindow::Init(window_handle);
@ -173,71 +172,41 @@ bool VideoSoftware::Initialize(void* window_handle)
SWRenderer::Init();
DebugUtil::Init();
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Initialization);
m_initialized = true;
return true;
}
void VideoSoftware::Shutdown()
{
m_initialized = false;
// Do our OSD callbacks
OSD::DoCallbacks(OSD::CallbackType::Shutdown);
SWOGLWindow::Shutdown();
ShutdownShared();
}
void VideoSoftware::Video_Cleanup()
{
if (g_renderer)
{
Fifo::Shutdown();
SWRenderer::Shutdown();
DebugUtil::Shutdown();
// The following calls are NOT Thread Safe
// And need to be called from the video thread
SWRenderer::Shutdown();
VertexLoaderManager::Shutdown();
g_framebuffer_manager.reset();
g_texture_cache.reset();
VertexShaderManager::Shutdown();
PixelShaderManager::Shutdown();
g_perf_query.reset();
g_vertex_manager.reset();
OpcodeDecoder::Shutdown();
g_renderer.reset();
}
CleanupShared();
SWRenderer::Shutdown();
DebugUtil::Shutdown();
// The following calls are NOT Thread Safe
// And need to be called from the video thread
SWRenderer::Shutdown();
g_framebuffer_manager.reset();
g_texture_cache.reset();
g_perf_query.reset();
g_vertex_manager.reset();
g_renderer.reset();
}
// This is called after Video_Initialize() from the Core
void VideoSoftware::Video_Prepare()
{
g_renderer = std::make_unique<SWRenderer>();
CommandProcessor::Init();
PixelEngine::Init();
BPInit();
g_vertex_manager = std::make_unique<SWVertexLoader>();
g_perf_query = std::make_unique<PerfQuery>();
Fifo::Init(); // must be done before OpcodeDecoder::Init()
OpcodeDecoder::Init();
IndexGenerator::Init();
VertexShaderManager::Init();
PixelShaderManager::Init();
g_texture_cache = std::make_unique<TextureCache>();
SWRenderer::Init();
VertexLoaderManager::Init();
g_framebuffer_manager = std::make_unique<FramebufferManager>();
// Notify the core that the video backend is ready
Host_Message(WM_USER_CREATE);
INFO_LOG(VIDEO, "Video backend initialized.");
}
unsigned int VideoSoftware::PeekMessages()

View File

@ -21,6 +21,7 @@ class VideoSoftware : public VideoBackendBase
std::string GetName() const override;
std::string GetDisplayName() const override;
std::string GetConfigName() const override;
void Video_Prepare() override;
void Video_Cleanup() override;