Files
Seele/src/Engine/Graphics/Metal/Shader.h
T

49 lines
1.5 KiB
C++
Raw Normal View History

2024-04-11 12:38:42 +02:00
#pragma once
2024-04-11 18:51:47 +02:00
#include "Graphics/Enums.h"
2024-04-11 12:38:42 +02:00
#include "Graphics/Shader.h"
#include "Resources.h"
namespace Seele {
namespace Metal {
2024-04-11 18:51:47 +02:00
2024-04-11 12:38:42 +02:00
class Shader {
2024-06-09 12:20:04 +02:00
public:
Shader(PGraphics graphics, Gfx::SeShaderStageFlags stage);
virtual ~Shader();
2024-04-11 12:38:42 +02:00
2024-06-09 12:20:04 +02:00
void create(const ShaderCreateInfo& createInfo);
2024-04-11 12:38:42 +02:00
2024-06-09 12:20:04 +02:00
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;
2024-04-11 12:38:42 +02:00
2024-06-09 12:20:04 +02:00
private:
Gfx::SeShaderStageFlags stage;
PGraphics graphics;
MTL::Library* library;
MTL::Function* function;
uint32 hash;
2024-04-11 12:38:42 +02:00
};
DEFINE_REF(Shader)
2024-04-11 18:51:47 +02:00
template <typename Base, Gfx::SeShaderStageFlags flags> class ShaderBase : public Base, public Shader {
2024-06-09 12:20:04 +02:00
public:
ShaderBase(PGraphics graphics) : Shader(graphics, flags) {}
virtual ~ShaderBase() {}
2024-04-11 12:38:42 +02:00
};
2024-04-11 18:51:47 +02:00
using VertexShader = ShaderBase<Gfx::VertexShader, Gfx::SE_SHADER_STAGE_VERTEX_BIT>;
using FragmentShader = ShaderBase<Gfx::FragmentShader, Gfx::SE_SHADER_STAGE_FRAGMENT_BIT>;
using ComputeShader = ShaderBase<Gfx::ComputeShader, Gfx::SE_SHADER_STAGE_COMPUTE_BIT>;
2024-04-17 14:33:06 +02:00
using TaskShader = ShaderBase<Gfx::TaskShader, Gfx::SE_SHADER_STAGE_TASK_BIT_EXT>;
using MeshShader = ShaderBase<Gfx::MeshShader, Gfx::SE_SHADER_STAGE_MESH_BIT_EXT>;
2024-04-11 12:38:42 +02:00
DEFINE_REF(VertexShader)
DEFINE_REF(FragmentShader)
DEFINE_REF(ComputeShader)
DEFINE_REF(TaskShader)
DEFINE_REF(MeshShader)
} // namespace Metal
} // namespace Seele