2020-05-05 01:51:13 +02:00
|
|
|
#pragma once
|
2023-10-26 18:37:29 +02:00
|
|
|
#include "Resources.h"
|
|
|
|
|
#include "Enums.h"
|
|
|
|
|
#include "Graphics/Shader.h"
|
2020-05-05 01:51:13 +02:00
|
|
|
|
|
|
|
|
namespace Seele
|
|
|
|
|
{
|
|
|
|
|
namespace Vulkan
|
|
|
|
|
{
|
2021-04-01 16:40:14 +02:00
|
|
|
DECLARE_REF(Graphics)
|
|
|
|
|
DECLARE_REF(DescriptorLayout)
|
2020-05-05 01:51:13 +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();
|
|
|
|
|
|
2020-06-02 11:46:18 +02:00
|
|
|
void create(const ShaderCreateInfo& createInfo);
|
|
|
|
|
|
2024-01-16 21:11:57 +01:00
|
|
|
constexpr VkShaderModule getModuleHandle() const
|
2020-05-05 01:51:13 +02:00
|
|
|
{
|
|
|
|
|
return module;
|
|
|
|
|
}
|
2024-01-16 21:11:57 +01:00
|
|
|
constexpr const char* getEntryPointName() const
|
2020-05-05 01:51:13 +02:00
|
|
|
{
|
2020-10-03 11:00:10 +02:00
|
|
|
//SLang renames all entry points to main, so we dont need that
|
|
|
|
|
return "main";//entryPointName.c_str();
|
2020-05-05 01:51:13 +02:00
|
|
|
}
|
2024-01-16 21:11:57 +01:00
|
|
|
constexpr VkShaderStageFlags getStage() const
|
|
|
|
|
{
|
|
|
|
|
return stage;
|
|
|
|
|
}
|
2020-10-30 18:45:35 +01:00
|
|
|
uint32 getShaderHash() const;
|
2020-05-05 01:51:13 +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;
|
2020-10-30 18:45:35 +01:00
|
|
|
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-04-11 12:38:42 +02:00
|
|
|
template <typename Base, VkShaderStageFlags stageFlags>
|
2020-05-05 01:51:13 +02:00
|
|
|
class ShaderBase : public Base, public Shader
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
ShaderBase(PGraphics graphics)
|
2024-04-11 12:38:42 +02:00
|
|
|
: Shader(graphics, stageFlags)
|
2020-05-05 01:51:13 +02:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
virtual ~ShaderBase()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
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)
|
2020-05-05 01:51:13 +02:00
|
|
|
} // namespace Vulkan
|
|
|
|
|
}
|