Update platform creation code

This commit is contained in:
2021-02-02 16:14:15 +01:00
parent aede8c9e59
commit 2922e74f07
4 changed files with 79 additions and 14 deletions

View File

@@ -6,6 +6,7 @@
#include "PlatformGLFW.hpp"
#include "WindowGLFW.hpp"
#include "Base/PlatformEnums.hpp"
#include <GLFW/glfw3.h>
namespace openVulkanoCpp::GLFW
@@ -55,4 +56,6 @@ namespace openVulkanoCpp::GLFW
windows.emplace_back(std::move(window));
return windowPtr;
}
PlatformProducerRegistration<PlatformGLFW> platformRegistration(RenderAPI::Vulkan);
}

View File

@@ -5,32 +5,68 @@
*/
#include "PlatformProducer.hpp"
#include "GLFW/PlatformGLFW.hpp"
#include "Base/Logger.hpp"
#include "Vulkan/Renderer.hpp"
#include <stdexcept>
#include <map>
namespace openVulkanoCpp
{
namespace
{
struct PlatformRegistry
{
static PlatformRegistry& GetInstance()
{
static PlatformRegistry instance;
return instance;
}
std::map<RenderAPI, std::function<IPlatform*()>> platformMap;
std::map<RenderAPI, std::function<IRenderer*()>> rendererMap;
void RegisterPlatform(RenderAPI renderApi, std::function<IPlatform*()> createMethod)
{
platformMap[renderApi] = createMethod;
}
void RegisterRenderer(RenderAPI renderApi, std::function<IRenderer*()> createMethod)
{
rendererMap[renderApi] = createMethod;
}
};
}
void PlatformProducer::RegisterPlatformProducer(RenderAPI renderApi, std::function<IPlatform*()> createMethod)
{
PlatformRegistry::GetInstance().RegisterPlatform(renderApi, createMethod);
}
void PlatformProducer::RegisterRendererProducer(RenderAPI renderApi, std::function<IRenderer*()> createMethod)
{
PlatformRegistry::GetInstance().RegisterRenderer(renderApi, createMethod);
}
IRenderer* PlatformProducer::CreateRenderManager(RenderAPI renderApi)
{
switch (renderApi)
auto& rMap = PlatformRegistry::GetInstance().rendererMap;
auto renderProducer = rMap.find(renderApi);
if (renderProducer == rMap.end())
{
case RenderAPI::Vulkan: return new Vulkan::Renderer();
default:
Logger::RENDER->error("Unsupported render api requested! Requested {}", renderApi.ToString());
throw std::runtime_error("Unsupported render api requested!");
Logger::RENDER->error("Unsupported render api requested! Requested {}", renderApi.ToString());
throw std::runtime_error("Unsupported render api requested!");
}
return renderProducer->second();
}
IPlatform* PlatformProducer::CreatePlatform(RenderAPI renderApi)
{
switch (renderApi)
auto& pMap = PlatformRegistry::GetInstance().platformMap;
auto platformProducer = pMap.find(renderApi);
if (platformProducer == pMap.end())
{
case RenderAPI::Vulkan: return new GLFW::PlatformGLFW();
default:
Logger::MANAGER->error("Unsupported render api requested! Requested {}", renderApi.ToString());
throw std::runtime_error("Unsupported render api requested!");
Logger::MANAGER->error("No platform for render api {}!", renderApi.ToString());
return nullptr;
}
return platformProducer->second();
}
}
}

View File

@@ -7,6 +7,7 @@
#pragma once
#include "Base/PlatformEnums.hpp"
#include <functional>
namespace openVulkanoCpp
{
@@ -35,5 +36,27 @@ namespace openVulkanoCpp
* \throws std::runtime_error if the render api is not supported
*/
static IPlatform* CreatePlatform(RenderAPI renderApi);
static void RegisterPlatformProducer(RenderAPI renderApi, std::function<IPlatform*()> createMethod);
static void RegisterRendererProducer(RenderAPI renderApi, std::function<IRenderer*()> createMethod);
};
template<class PLATFORM_CLASS>
struct PlatformProducerRegistration
{
PlatformProducerRegistration(RenderAPI renderApi)
{
PlatformProducer::RegisterPlatformProducer(renderApi, []() -> IPlatform* { new PLATFORM_CLASS(); });
}
};
template<class RENDERER_CLASS>
struct RendererProducerRegistration
{
RendererProducerRegistration(RenderAPI renderApi)
{
PlatformProducer::RegisterRendererProducer(renderApi, []() -> IRenderer* { new RENDERER_CLASS(); });
}
};
}

View File

@@ -8,6 +8,7 @@
#include "Scene/VulkanGeometry.hpp"
#include "Scene/VulkanNode.hpp"
#include "Scene/VulkanShader.hpp"
#include "Host/PlatformProducer.hpp"
#include <stdexcept>
namespace openVulkanoCpp::Vulkan
@@ -170,4 +171,6 @@ namespace openVulkanoCpp::Vulkan
}
cmdHelper->cmdBuffer.end();
}
}
RendererProducerRegistration<Renderer> rendererRegistration(RenderAPI::Vulkan);
}