#ifndef __URDE_TSHADER_HPP__ #define __URDE_TSHADER_HPP__ #include "Graphics/CGraphics.hpp" #include "boo/graphicsdev/GL.hpp" #include "boo/graphicsdev/D3D.hpp" #include "boo/graphicsdev/Metal.hpp" #include "boo/graphicsdev/Vulkan.hpp" namespace urde { template class TShader { public: struct IDataBindingFactory { virtual boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, ShaderImp& filter)=0; virtual ~IDataBindingFactory() = default; }; static std::unique_ptr m_bindFactory; static void Initialize() { if (!CGraphics::g_BooFactory) return; CGraphics::CommitResources( [&](boo::IGraphicsDataFactory::Context& ctx) -> bool { switch (ctx.platform()) { #if BOO_HAS_GL case boo::IGraphicsDataFactory::Platform::OpenGL: m_bindFactory.reset(ShaderImp::Initialize(static_cast(ctx))); break; #endif #if _WIN32 case boo::IGraphicsDataFactory::Platform::D3D11: case boo::IGraphicsDataFactory::Platform::D3D12: m_bindFactory.reset(ShaderImp::Initialize(static_cast(ctx))); break; #endif #if BOO_HAS_METAL case boo::IGraphicsDataFactory::Platform::Metal: m_bindFactory.reset(ShaderImp::Initialize(static_cast(ctx))); break; #endif #if BOO_HAS_VULKAN case boo::IGraphicsDataFactory::Platform::Vulkan: m_bindFactory.reset(ShaderImp::Initialize(static_cast(ctx))); break; #endif default: break; } return true; }); } static void Shutdown() { switch (CGraphics::g_BooFactory->platform()) { #if BOO_HAS_GL case boo::IGraphicsDataFactory::Platform::OpenGL: ShaderImp::template Shutdown(); break; #endif #if _WIN32 case boo::IGraphicsDataFactory::Platform::D3D11: case boo::IGraphicsDataFactory::Platform::D3D12: ShaderImp::template Shutdown(); break; #endif #if BOO_HAS_METAL case boo::IGraphicsDataFactory::Platform::Metal: ShaderImp::template Shutdown(); break; #endif #if BOO_HAS_VULKAN case boo::IGraphicsDataFactory::Platform::Vulkan: ShaderImp::template Shutdown(); break; #endif default: break; } } static boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, ShaderImp& filter) { return m_bindFactory->BuildShaderDataBinding(ctx, filter); } }; #define URDE_DECL_SPECIALIZE_SHADER(cls) \ template <> std::unique_ptr::IDataBindingFactory> \ TShader::m_bindFactory; #define URDE_SPECIALIZE_SHADER(cls) \ template <> std::unique_ptr::IDataBindingFactory> \ TShader::m_bindFactory = {}; \ \ template class TShader; } #endif // __URDE_TSHADER_HPP__