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

68 lines
2.3 KiB
C++
Raw Normal View History

2020-05-05 01:51:13 +02:00
#pragma once
2023-10-26 18:37:29 +02:00
#include "Enums.h"
#include "Graphics/Shader.h"
2024-06-09 12:20:04 +02:00
#include "Resources.h"
2020-05-05 01:51:13 +02:00
2024-06-09 12:20:04 +02:00
namespace Seele {
namespace Vulkan {
2021-04-01 16:40:14 +02:00
DECLARE_REF(Graphics)
DECLARE_REF(DescriptorLayout)
2024-06-09 12:20:04 +02:00
class Shader {
public:
2024-04-11 12:38:42 +02:00
Shader(PGraphics graphics, VkShaderStageFlags stage);
2020-05-05 01:51:13 +02:00
virtual ~Shader();
2024-07-10 21:07:10 +02:00
void create(const ShaderCreateInfo& createInfo);
2024-10-19 11:54:04 +02:00
void create(std::string_view binary);
2020-06-02 11:46:18 +02:00
2024-06-09 12:20:04 +02:00
constexpr VkShaderModule getModuleHandle() const { return module; }
constexpr const char* getEntryPointName() const {
// SLang renames all entry points to main, so we dont need that
2024-07-12 13:33:52 +02:00
return "main";// entryPointName.c_str();
2024-01-16 21:11:57 +01:00
}
2024-06-09 12:20:04 +02:00
constexpr VkShaderStageFlags getStage() const { return stage; }
uint32 getShaderHash() const;
2024-06-09 12:20:04 +02:00
private:
2020-06-02 11:46:18 +02:00
PGraphics graphics;
2020-05-05 01:51:13 +02:00
VkShaderModule module;
2021-04-01 16:40:14 +02:00
VkShaderStageFlags stage;
2024-07-12 13:33:52 +02:00
std::string entryPointName;
uint32 hash;
2020-05-05 01:51:13 +02:00
};
2021-04-01 16:40:14 +02:00
DEFINE_REF(Shader)
2020-05-05 01:51:13 +02:00
2024-06-09 12:20:04 +02:00
template <typename Base, VkShaderStageFlags stageFlags> class ShaderBase : public Base, public Shader {
public:
ShaderBase(PGraphics graphics) : Shader(graphics, stageFlags) {}
virtual ~ShaderBase() {}
2020-05-05 01:51:13 +02:00
};
2024-04-11 12:38:42 +02:00
using VertexShader = ShaderBase<Gfx::VertexShader, VK_SHADER_STAGE_VERTEX_BIT>;
using FragmentShader = ShaderBase<Gfx::FragmentShader, VK_SHADER_STAGE_FRAGMENT_BIT>;
using ComputeShader = ShaderBase<Gfx::ComputeShader, VK_SHADER_STAGE_COMPUTE_BIT>;
using TaskShader = ShaderBase<Gfx::TaskShader, VK_SHADER_STAGE_TASK_BIT_EXT>;
using MeshShader = ShaderBase<Gfx::MeshShader, VK_SHADER_STAGE_MESH_BIT_EXT>;
2020-05-05 01:51:13 +02:00
2021-04-01 16:40:14 +02:00
DEFINE_REF(VertexShader)
DEFINE_REF(FragmentShader)
DEFINE_REF(ComputeShader)
2023-10-26 18:37:29 +02:00
DEFINE_REF(TaskShader)
DEFINE_REF(MeshShader)
2024-06-18 09:48:00 +02:00
// Ray Tracing
using RayGenShader = ShaderBase<Gfx::RayGenShader, VK_SHADER_STAGE_RAYGEN_BIT_KHR>;
using AnyHitShader = ShaderBase<Gfx::AnyHitShader, VK_SHADER_STAGE_ANY_HIT_BIT_KHR>;
using ClosestHitShader = ShaderBase<Gfx::ClosestHitShader, VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR>;
using MissShader = ShaderBase<Gfx::MissShader, VK_SHADER_STAGE_MISS_BIT_KHR>;
using IntersectionShader = ShaderBase<Gfx::IntersectionShader, VK_SHADER_STAGE_INTERSECTION_BIT_KHR>;
using CallableShader = ShaderBase<Gfx::CallableShader, VK_SHADER_STAGE_CALLABLE_BIT_KHR>;
DEFINE_REF(RayGenShader)
DEFINE_REF(AnyHitShader)
DEFINE_REF(ClosestHitShader)
DEFINE_REF(MissShader)
DEFINE_REF(IntersectionShader)
DEFINE_REF(CallableShader)
2020-05-05 01:51:13 +02:00
} // namespace Vulkan
2024-06-09 12:20:04 +02:00
} // namespace Seele