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
|
|
|
|
2024-08-26 21:49:09 +02:00
|
|
|
using RayGenShader = ShaderBase<Gfx::RayGenShader, Gfx::SE_SHADER_STAGE_RAYGEN_BIT_KHR>;
|
|
|
|
|
using ClosestHitShader = ShaderBase<Gfx::ClosestHitShader, Gfx::SE_SHADER_STAGE_CLOSEST_HIT_BIT_KHR>;
|
|
|
|
|
using IntersectionShader = ShaderBase<Gfx::IntersectionShader, Gfx::SE_SHADER_STAGE_INTERSECTION_BIT_KHR>;
|
|
|
|
|
using AnyHitShader = ShaderBase<Gfx::AnyHitShader, Gfx::SE_SHADER_STAGE_ANY_HIT_BIT_KHR>;
|
|
|
|
|
using MissShader = ShaderBase<Gfx::MissShader, Gfx::SE_SHADER_STAGE_MISS_BIT_KHR>;
|
|
|
|
|
using CallableShader = ShaderBase<Gfx::CallableShader, Gfx::SE_SHADER_STAGE_CALLABLE_BIT_KHR>;
|
|
|
|
|
|
2024-04-11 12:38:42 +02:00
|
|
|
DEFINE_REF(VertexShader)
|
|
|
|
|
DEFINE_REF(FragmentShader)
|
|
|
|
|
DEFINE_REF(ComputeShader)
|
|
|
|
|
DEFINE_REF(TaskShader)
|
|
|
|
|
DEFINE_REF(MeshShader)
|
2024-08-26 21:49:09 +02:00
|
|
|
|
|
|
|
|
DEFINE_REF(RayGenShader)
|
|
|
|
|
DEFINE_REF(ClosestHitShader)
|
|
|
|
|
DEFINE_REF(IntersectionShader)
|
|
|
|
|
DEFINE_REF(AnyHitShader)
|
|
|
|
|
DEFINE_REF(MissShader)
|
|
|
|
|
DEFINE_REF(CallableShader)
|
2024-04-11 12:38:42 +02:00
|
|
|
} // namespace Metal
|
|
|
|
|
} // namespace Seele
|