#pragma once #include "Graphics/Enums.h" #include "Graphics/Shader.h" #include "Resources.h" namespace Seele { namespace Metal { class Shader { public: Shader(PGraphics graphics, Gfx::SeShaderStageFlags stage); virtual ~Shader(); void create(const ShaderCreateInfo& createInfo); constexpr MTL::Function* getFunction() const { return function; } constexpr const char* getEntryPointName() const { // SLang renames all entry points to main, so we dont need that return "main"; // entryPointName.c_str(); } uint32 getShaderHash() const; private: Gfx::SeShaderStageFlags stage; PGraphics graphics; MTL::Library* library; MTL::Function* function; uint32 hash; }; DEFINE_REF(Shader) template class ShaderBase : public Base, public Shader { public: ShaderBase(PGraphics graphics) : Shader(graphics, flags) {} virtual ~ShaderBase() {} }; using VertexShader = ShaderBase; using FragmentShader = ShaderBase; using ComputeShader = ShaderBase; using TaskShader = ShaderBase; using MeshShader = ShaderBase; using RayGenShader = ShaderBase; using ClosestHitShader = ShaderBase; using IntersectionShader = ShaderBase; using AnyHitShader = ShaderBase; using MissShader = ShaderBase; using CallableShader = ShaderBase; DEFINE_REF(VertexShader) DEFINE_REF(FragmentShader) DEFINE_REF(ComputeShader) DEFINE_REF(TaskShader) DEFINE_REF(MeshShader) DEFINE_REF(RayGenShader) DEFINE_REF(ClosestHitShader) DEFINE_REF(IntersectionShader) DEFINE_REF(AnyHitShader) DEFINE_REF(MissShader) DEFINE_REF(CallableShader) } // namespace Metal } // namespace Seele