Renderer: Allow to set a preferred render api using configuration

This commit is contained in:
Jérôme Leclercq 2020-09-17 20:11:10 +02:00
parent 36d3c51eeb
commit 37418d482e
2 changed files with 29 additions and 6 deletions

View File

@ -11,6 +11,7 @@
#include <Nazara/Core/DynLib.hpp>
#include <Nazara/Platform/Platform.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RendererImpl.hpp>
#include <Nazara/Shader/Shader.hpp>
@ -26,13 +27,18 @@ namespace Nz
public:
using Dependencies = TypeList<Platform, Shader>;
struct Config {};
struct Config;
Renderer(Config /*config*/);
~Renderer();
inline RendererImpl* GetRendererImpl();
struct Config
{
Nz::RenderAPI preferredAPI = Nz::RenderAPI::Unknown;
};
private:
std::unique_ptr<RendererImpl> m_rendererImpl;
DynLib m_rendererLib;

View File

@ -30,7 +30,20 @@
namespace Nz
{
Renderer::Renderer(Config /*config*/) :
namespace
{
std::array<const char*, UnderlyingCast(RenderAPI::Max) + 1> 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<RendererImplementations> 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<int>::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; });