/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "PlatformProducer.hpp" #include "Base/Logger.hpp" #include #include namespace OpenVulkano { namespace { struct PlatformRegistry { static PlatformRegistry& GetInstance() { static PlatformRegistry instance; return instance; } std::map> platformMap; std::map> rendererMap; void RegisterPlatform(RenderAPI renderApi, std::function createMethod) { platformMap[renderApi] = createMethod; } void RegisterRenderer(RenderAPI renderApi, std::function createMethod) { rendererMap[renderApi] = createMethod; } }; } void PlatformProducer::RegisterPlatformProducer(RenderAPI renderApi, std::function createMethod) { PlatformRegistry::GetInstance().RegisterPlatform(renderApi, createMethod); } void PlatformProducer::RegisterRendererProducer(RenderAPI renderApi, std::function createMethod) { PlatformRegistry::GetInstance().RegisterRenderer(renderApi, createMethod); } IRenderer* PlatformProducer::CreateRenderManager(RenderAPI renderApi) { auto& rMap = PlatformRegistry::GetInstance().rendererMap; auto renderProducer = rMap.find(renderApi); if (renderProducer == rMap.end()) { 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) { auto& pMap = PlatformRegistry::GetInstance().platformMap; auto platformProducer = pMap.find(renderApi); if (platformProducer == pMap.end()) { Logger::MANAGER->error("No platform for render api {}!", renderApi.ToString()); return nullptr; } return platformProducer->second(); } }