ULRE/example/Vulkan/VKShader.h

58 lines
1.8 KiB
C
Raw Normal View History

2019-04-15 08:25:30 +08:00
#pragma once
#include"VK.h"
VK_NAMESPACE_BEGIN
class VertexInputState;
/**
* Shader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class Shader
2019-04-15 08:25:30 +08:00
{
VkDevice device;
List<VkPipelineShaderStageCreateInfo> shader_stage_list;
VertexInputState *vertex_input_state=nullptr;
private:
bool CreateVIS(const void *,const uint32_t);
2019-04-15 08:25:30 +08:00
public:
Shader(VkDevice);
~Shader();
bool Add(const VkShaderStageFlagBits shader_stage_bit,const void *spv_data,const uint32_t spv_size);
#define ADD_SHADER_FUNC(sn,vk_name) bool Add##sn##Shader(const void *spv_data,const uint32_t spv_size){return Add(VK_SHADER_STAGE_##vk_name##_BIT,spv_data,spv_size);}
ADD_SHADER_FUNC(Vertex, VERTEX)
ADD_SHADER_FUNC(Fragment, FRAGMENT)
ADD_SHADER_FUNC(Geometry, GEOMETRY)
ADD_SHADER_FUNC(TessCtrl, TESSELLATION_CONTROL)
ADD_SHADER_FUNC(TessEval, TESSELLATION_EVALUATION)
ADD_SHADER_FUNC(Compute, COMPUTE)
#undef ADD_SHADER_FUNC
#define ADD_NV_SHADER_FUNC(sn,vk_name) bool Add##sn##Shader(const void *spv_data,const uint32_t spv_size) { return Add(VK_SHADER_STAGE_##vk_name##_BIT_NV,spv_data,spv_size); }
ADD_NV_SHADER_FUNC(Raygen, RAYGEN);
ADD_NV_SHADER_FUNC(AnyHit, ANY_HIT);
ADD_NV_SHADER_FUNC(ClosestHit, CLOSEST_HIT);
ADD_NV_SHADER_FUNC(MissBit, MISS);
ADD_NV_SHADER_FUNC(Intersection,INTERSECTION);
ADD_NV_SHADER_FUNC(Callable, CALLABLE);
ADD_NV_SHADER_FUNC(Task, TASK);
ADD_NV_SHADER_FUNC(Mesh, MESH);
#undef ADD_NV_SHADER_FUNC
2019-04-15 08:25:30 +08:00
void Clear();
2019-04-15 22:19:09 +08:00
2019-04-18 16:38:58 +08:00
const uint32_t GetCount ()const{return shader_stage_list.GetCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list.GetData();}
VertexInputState *GetVIS(){return vertex_input_state;}
};//class ShaderCreater
2019-04-15 08:25:30 +08:00
VK_NAMESPACE_END