#pragma once #include "Resources.h" #include "Enums.h" #include "Graphics/Shader.h" namespace Seele { namespace Vulkan { DECLARE_REF(Graphics) DECLARE_REF(DescriptorLayout) class Shader { public: Shader(PGraphics graphics, ShaderType shaderType, VkShaderStageFlags stage); virtual ~Shader(); void create(const ShaderCreateInfo& createInfo); constexpr VkShaderModule getModuleHandle() const { return module; } constexpr const char* getEntryPointName() const { //SLang renames all entry points to main, so we dont need that return "main";//entryPointName.c_str(); } constexpr ShaderType getShaderType() const { return type; } constexpr VkShaderStageFlags getStage() const { return stage; } //Map getDescriptorLayouts(); uint32 getShaderHash() const; private: PGraphics graphics; //Map descriptorSets; VkShaderModule module; ShaderType type; VkShaderStageFlags stage; std::string entryPointName; uint32 hash; }; DEFINE_REF(Shader) template class ShaderBase : public Base, public Shader { public: ShaderBase(PGraphics graphics) : Shader(graphics, shaderType, stageFlags) { } virtual ~ShaderBase() { } }; typedef ShaderBase VertexShader; typedef ShaderBase FragmentShader; typedef ShaderBase ComputeShader; typedef ShaderBase TaskShader; typedef ShaderBase MeshShader; DEFINE_REF(VertexShader) DEFINE_REF(FragmentShader) DEFINE_REF(ComputeShader) DEFINE_REF(TaskShader) DEFINE_REF(MeshShader) } // namespace Vulkan }