diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index b23263a99..84b04504e 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -114,6 +114,8 @@ namespace Nz Max = Unknown }; + constexpr std::size_t RenderAPICount = static_cast(RenderAPI::Max) + 1; + enum class RenderDeviceType { Integrated, ///< Hardware-accelerated chipset integrated to a CPU (ex: Intel Graphics HD 4000) diff --git a/include/Nazara/Renderer/Renderer.hpp b/include/Nazara/Renderer/Renderer.hpp index a314790d6..2a97441a3 100644 --- a/include/Nazara/Renderer/Renderer.hpp +++ b/include/Nazara/Renderer/Renderer.hpp @@ -44,10 +44,12 @@ namespace Nz struct Config { - Nz::RenderAPI preferredAPI = Nz::RenderAPI::Unknown; + Nz::RenderAPI preferredAPI = RenderAPI::Unknown; }; private: + void LoadBackend(const Config& config); + std::unique_ptr m_rendererImpl; DynLib m_rendererLib; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 8fc49bad8..beb12588c 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -30,9 +31,50 @@ namespace Nz { - namespace + Renderer::Renderer(Config config) : + ModuleBase("Renderer", this) { - std::array s_rendererPaths = { + LoadBackend(config); + + Buffer::SetBufferFactory(DataStorage::Hardware, [](Buffer* parent, BufferType type) -> std::unique_ptr { return std::make_unique(parent, type); }); + } + + Renderer::~Renderer() + { + // Uninitialize module here + Buffer::SetBufferFactory(DataStorage::Hardware, nullptr); + + m_rendererImpl.reset(); + } + + std::shared_ptr Renderer::InstanciateRenderDevice(std::size_t deviceIndex) + { + return m_rendererImpl->InstanciateRenderDevice(deviceIndex); + } + + RenderAPI Renderer::QueryAPI() const + { + return m_rendererImpl->QueryAPI(); + } + + std::string Renderer::QueryAPIString() const + { + return m_rendererImpl->QueryAPIString(); + } + + UInt32 Renderer::QueryAPIVersion() const + { + return m_rendererImpl->QueryAPIVersion(); + } + + const std::vector& Renderer::QueryRenderDevices() const + { + return m_rendererImpl->QueryRenderDevices(); + } + + void Renderer::LoadBackend(const Config& config) + { + constexpr std::array rendererPaths = { NazaraRendererPrefix "NazaraDirect3DRenderer" NazaraRendererDebugSuffix, // Direct3D NazaraRendererPrefix "NazaraMantleRenderer" NazaraRendererDebugSuffix, // Mantle NazaraRendererPrefix "NazaraMetalRenderer" NazaraRendererDebugSuffix, // Metal @@ -41,11 +83,7 @@ namespace Nz nullptr // Unknown }; - } - Renderer::Renderer(Config config) : - ModuleBase("Renderer", this) - { struct RendererImplementations { std::filesystem::path fileName; @@ -55,7 +93,7 @@ namespace Nz auto RegisterImpl = [&](RenderAPI api, auto ComputeScore) { - const char* rendererName = s_rendererPaths[UnderlyingCast(api)]; + const char* rendererName = rendererPaths[UnderlyingCast(api)]; assert(rendererName); std::filesystem::path fileName(rendererName); @@ -122,41 +160,6 @@ namespace Nz m_rendererLib = std::move(chosenLib); NazaraDebug("Using " + m_rendererImpl->QueryAPIString() + " as renderer"); - - Buffer::SetBufferFactory(DataStorage::Hardware, [](Buffer* parent, BufferType type) -> std::unique_ptr { return std::make_unique(parent, type); }); - } - - Renderer::~Renderer() - { - // Uninitialize module here - Buffer::SetBufferFactory(DataStorage::Hardware, nullptr); - - m_rendererImpl.reset(); - } - - std::shared_ptr Renderer::InstanciateRenderDevice(std::size_t deviceIndex) - { - return m_rendererImpl->InstanciateRenderDevice(deviceIndex); - } - - RenderAPI Renderer::QueryAPI() const - { - return m_rendererImpl->QueryAPI(); - } - - std::string Renderer::QueryAPIString() const - { - return m_rendererImpl->QueryAPIString(); - } - - UInt32 Renderer::QueryAPIVersion() const - { - return m_rendererImpl->QueryAPIVersion(); - } - - const std::vector& Renderer::QueryRenderDevices() const - { - return m_rendererImpl->QueryRenderDevices(); } Renderer* Renderer::s_instance = nullptr;