Update platform creation code
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(); });
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user