Rework modules
This commit is contained in:
@@ -38,7 +38,7 @@ namespace Nz
|
||||
|
||||
bool RenderWindow::OnWindowCreated()
|
||||
{
|
||||
RendererImpl *rendererImpl = Renderer::GetRendererImpl();
|
||||
RendererImpl *rendererImpl = Renderer::Instance()->GetRendererImpl();
|
||||
auto surface = rendererImpl->CreateRenderSurfaceImpl();
|
||||
if (!surface->Create(GetSystemHandle()))
|
||||
{
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <Nazara/Utility/Buffer.hpp>
|
||||
#include <Nazara/Utility/Utility.hpp>
|
||||
#include <filesystem>
|
||||
#include <stdexcept>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
#ifdef NAZARA_PLATFORM_WINDOWS
|
||||
@@ -29,31 +30,9 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
bool Renderer::Initialize()
|
||||
Renderer::Renderer() :
|
||||
Module("Renderer", this)
|
||||
{
|
||||
if (s_moduleReferenceCounter > 0)
|
||||
{
|
||||
s_moduleReferenceCounter++;
|
||||
return true; // Already initialized
|
||||
}
|
||||
|
||||
// Initialize module dependencies
|
||||
if (!Utility::Initialize())
|
||||
{
|
||||
NazaraError("Failed to initialize Utility module");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Platform::Initialize())
|
||||
{
|
||||
NazaraError("Failed to initialize Platform module");
|
||||
return false;
|
||||
}
|
||||
|
||||
s_moduleReferenceCounter++;
|
||||
|
||||
CallOnExit onExit(Renderer::Uninitialize);
|
||||
|
||||
struct RendererImplementations
|
||||
{
|
||||
std::filesystem::path fileName;
|
||||
@@ -106,7 +85,7 @@ namespace Nz
|
||||
}
|
||||
|
||||
std::unique_ptr<RendererImpl> impl(createRenderer());
|
||||
if (!impl || !impl->Prepare(s_initializationParameters))
|
||||
if (!impl || !impl->Prepare({}))
|
||||
{
|
||||
NazaraError("Failed to create renderer implementation");
|
||||
continue;
|
||||
@@ -120,57 +99,23 @@ namespace Nz
|
||||
}
|
||||
|
||||
if (!chosenImpl)
|
||||
{
|
||||
NazaraError("No renderer found");
|
||||
return false;
|
||||
}
|
||||
throw std::runtime_error("no renderer found");
|
||||
|
||||
s_rendererImpl = std::move(chosenImpl);
|
||||
s_rendererLib = std::move(chosenLib);
|
||||
m_rendererImpl = std::move(chosenImpl);
|
||||
m_rendererLib = std::move(chosenLib);
|
||||
|
||||
NazaraDebug("Using " + s_rendererImpl->QueryAPIString() + " as renderer");
|
||||
NazaraDebug("Using " + m_rendererImpl->QueryAPIString() + " as renderer");
|
||||
|
||||
Buffer::SetBufferFactory(DataStorage_Hardware, CreateHardwareBufferImpl);
|
||||
|
||||
onExit.Reset();
|
||||
|
||||
NazaraNotice("Initialized: Renderer module");
|
||||
return true;
|
||||
Buffer::SetBufferFactory(DataStorage_Hardware, [](Buffer* parent, BufferType type) -> AbstractBuffer* { return new RenderBuffer(parent, type); });
|
||||
}
|
||||
|
||||
void Renderer::Uninitialize()
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
if (s_moduleReferenceCounter != 1)
|
||||
{
|
||||
// Either the module is not initialized, either it was initialized multiple times
|
||||
if (s_moduleReferenceCounter > 1)
|
||||
s_moduleReferenceCounter--;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
s_moduleReferenceCounter = 0;
|
||||
|
||||
// Uninitialize module here
|
||||
Buffer::SetBufferFactory(DataStorage_Hardware, nullptr);
|
||||
|
||||
s_rendererImpl.reset();
|
||||
s_rendererLib.Unload();
|
||||
|
||||
NazaraNotice("Uninitialized: Renderer module");
|
||||
|
||||
// Free module dependencies
|
||||
Platform::Uninitialize();
|
||||
Utility::Uninitialize();
|
||||
m_rendererImpl.reset();
|
||||
}
|
||||
|
||||
AbstractBuffer* Renderer::CreateHardwareBufferImpl(Buffer* parent, BufferType type)
|
||||
{
|
||||
return new RenderBuffer(parent, type);
|
||||
}
|
||||
|
||||
std::unique_ptr<RendererImpl> Renderer::s_rendererImpl;
|
||||
DynLib Renderer::s_rendererLib;
|
||||
ParameterList Renderer::s_initializationParameters;
|
||||
unsigned int Renderer::s_moduleReferenceCounter = 0;
|
||||
Renderer* Renderer::s_instance = nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user