Renderer: Allow to set a preferred render api using configuration
This commit is contained in:
parent
36d3c51eeb
commit
37418d482e
|
|
@ -11,6 +11,7 @@
|
||||||
#include <Nazara/Core/DynLib.hpp>
|
#include <Nazara/Core/DynLib.hpp>
|
||||||
#include <Nazara/Platform/Platform.hpp>
|
#include <Nazara/Platform/Platform.hpp>
|
||||||
#include <Nazara/Renderer/Config.hpp>
|
#include <Nazara/Renderer/Config.hpp>
|
||||||
|
#include <Nazara/Renderer/Enums.hpp>
|
||||||
#include <Nazara/Renderer/RendererImpl.hpp>
|
#include <Nazara/Renderer/RendererImpl.hpp>
|
||||||
#include <Nazara/Shader/Shader.hpp>
|
#include <Nazara/Shader/Shader.hpp>
|
||||||
|
|
||||||
|
|
@ -26,13 +27,18 @@ namespace Nz
|
||||||
public:
|
public:
|
||||||
using Dependencies = TypeList<Platform, Shader>;
|
using Dependencies = TypeList<Platform, Shader>;
|
||||||
|
|
||||||
struct Config {};
|
struct Config;
|
||||||
|
|
||||||
Renderer(Config /*config*/);
|
Renderer(Config /*config*/);
|
||||||
~Renderer();
|
~Renderer();
|
||||||
|
|
||||||
inline RendererImpl* GetRendererImpl();
|
inline RendererImpl* GetRendererImpl();
|
||||||
|
|
||||||
|
struct Config
|
||||||
|
{
|
||||||
|
Nz::RenderAPI preferredAPI = Nz::RenderAPI::Unknown;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<RendererImpl> m_rendererImpl;
|
std::unique_ptr<RendererImpl> m_rendererImpl;
|
||||||
DynLib m_rendererLib;
|
DynLib m_rendererLib;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,20 @@
|
||||||
|
|
||||||
namespace Nz
|
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)
|
ModuleBase("Renderer", this)
|
||||||
{
|
{
|
||||||
struct RendererImplementations
|
struct RendererImplementations
|
||||||
|
|
@ -40,8 +53,12 @@ namespace Nz
|
||||||
};
|
};
|
||||||
std::vector<RendererImplementations> implementations;
|
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);
|
fileName.replace_extension(NAZARA_DYNLIB_EXTENSION);
|
||||||
|
|
||||||
int score = ComputeScore();
|
int score = ComputeScore();
|
||||||
|
|
@ -49,12 +66,12 @@ namespace Nz
|
||||||
{
|
{
|
||||||
auto& impl = implementations.emplace_back();
|
auto& impl = implementations.emplace_back();
|
||||||
impl.fileName = std::move(fileName);
|
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(RenderAPI::OpenGL, [] { return 50; });
|
||||||
RegisterImpl(NazaraRendererPrefix "NazaraVulkanRenderer" NazaraRendererDebugSuffix, [] { return 100; });
|
RegisterImpl(RenderAPI::Vulkan, [] { return 100; });
|
||||||
|
|
||||||
std::sort(implementations.begin(), implementations.end(), [](const auto& lhs, const auto& rhs) { return lhs.score > rhs.score; });
|
std::sort(implementations.begin(), implementations.end(), [](const auto& lhs, const auto& rhs) { return lhs.score > rhs.score; });
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue