From 37418d482e66276281d52b9b4e004e4a869dfbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 17 Sep 2020 20:11:10 +0200 Subject: [PATCH] Renderer: Allow to set a preferred render api using configuration --- include/Nazara/Renderer/Renderer.hpp | 8 +++++++- src/Nazara/Renderer/Renderer.cpp | 27 ++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Renderer/Renderer.hpp b/include/Nazara/Renderer/Renderer.hpp index 363a9ae76..72d51b3a7 100644 --- a/include/Nazara/Renderer/Renderer.hpp +++ b/include/Nazara/Renderer/Renderer.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -26,13 +27,18 @@ namespace Nz public: using Dependencies = TypeList; - struct Config {}; + struct Config; Renderer(Config /*config*/); ~Renderer(); inline RendererImpl* GetRendererImpl(); + struct Config + { + Nz::RenderAPI preferredAPI = Nz::RenderAPI::Unknown; + }; + private: std::unique_ptr m_rendererImpl; DynLib m_rendererLib; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 8a021234a..04fa06029 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -30,7 +30,20 @@ namespace Nz { - Renderer::Renderer(Config /*config*/) : + namespace + { + std::array s_rendererPaths = { + NazaraRendererPrefix "NazaraDirect3DRenderer" NazaraRendererDebugSuffix, // Direct3D + NazaraRendererPrefix "NazaraMantleRenderer" NazaraRendererDebugSuffix, // Mantle + NazaraRendererPrefix "NazaraMetalRenderer" NazaraRendererDebugSuffix, // Metal + NazaraRendererPrefix "NazaraOpenGLRenderer" NazaraRendererDebugSuffix, // OpenGL + NazaraRendererPrefix "NazaraVulkanRenderer" NazaraRendererDebugSuffix, // Vulkan + + nullptr // Unknown + }; + } + + Renderer::Renderer(Config config) : ModuleBase("Renderer", this) { struct RendererImplementations @@ -40,8 +53,12 @@ namespace Nz }; std::vector implementations; - auto RegisterImpl = [&](std::filesystem::path fileName, auto ComputeScore) + auto RegisterImpl = [&](RenderAPI api, auto ComputeScore) { + const char* rendererName = s_rendererPaths[UnderlyingCast(api)]; + assert(rendererName); + + std::filesystem::path fileName(rendererName); fileName.replace_extension(NAZARA_DYNLIB_EXTENSION); int score = ComputeScore(); @@ -49,12 +66,12 @@ namespace Nz { auto& impl = implementations.emplace_back(); impl.fileName = std::move(fileName); - impl.score = score; + impl.score = (config.preferredAPI == api) ? std::numeric_limits::max() : score; } }; - RegisterImpl(NazaraRendererPrefix "NazaraOpenGLRenderer" NazaraRendererDebugSuffix, [] { return 50; }); - RegisterImpl(NazaraRendererPrefix "NazaraVulkanRenderer" NazaraRendererDebugSuffix, [] { return 100; }); + RegisterImpl(RenderAPI::OpenGL, [] { return 50; }); + RegisterImpl(RenderAPI::Vulkan, [] { return 100; }); std::sort(implementations.begin(), implementations.end(), [](const auto& lhs, const auto& rhs) { return lhs.score > rhs.score; });