2019-05-07 12:46:25 +08:00
|
|
|
|
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_MANAGE_INCLUDE
|
2019-04-27 21:23:57 +08:00
|
|
|
|
#define HGL_GRAPH_VULKAN_SHADER_MODULE_MANAGE_INCLUDE
|
|
|
|
|
|
2019-05-07 12:46:25 +08:00
|
|
|
|
#include<hgl/graph/vulkan/VK.h>
|
2019-04-27 21:23:57 +08:00
|
|
|
|
#include<hgl/type/Map.h>
|
2019-04-28 16:06:53 +08:00
|
|
|
|
#include<hgl/type/BaseString.h>
|
2019-04-27 21:23:57 +08:00
|
|
|
|
VK_NAMESPACE_BEGIN
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
|
|
|
|
class ShaderResource;
|
|
|
|
|
|
2019-04-27 21:23:57 +08:00
|
|
|
|
/**
|
2019-05-07 12:46:25 +08:00
|
|
|
|
* Shader模块管理器<br>
|
|
|
|
|
* 所有的shader模块均由它创建和释放
|
|
|
|
|
* 该管理器在一个设备下仅有一个,它负责管理所有的shader(仅vs/fs/gs等单个,非组合体)
|
2019-04-27 21:23:57 +08:00
|
|
|
|
*/
|
|
|
|
|
class ShaderModuleManage
|
|
|
|
|
{
|
2019-04-28 16:06:53 +08:00
|
|
|
|
Device *device;
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
|
|
|
|
int shader_count;
|
|
|
|
|
Map<int,ShaderModule *> shader_list;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
ShaderModuleManage(Device *dev)
|
2019-04-27 21:23:57 +08:00
|
|
|
|
{
|
|
|
|
|
device=dev;
|
|
|
|
|
shader_count=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~ShaderModuleManage();
|
|
|
|
|
|
2020-06-09 19:40:08 +08:00
|
|
|
|
const ShaderModule *CreateShader(ShaderResource *);
|
2019-04-30 16:42:59 +08:00
|
|
|
|
const ShaderModule *CreateShader(const VkShaderStageFlagBits shader_stage_bit,const OSString &filename);
|
2020-06-09 19:40:08 +08:00
|
|
|
|
/*
|
2019-04-27 21:41:58 +08:00
|
|
|
|
#define ADD_SHADER_FUNC(sn,vk_name) const ShaderModule *Create##sn##Shader(const void *spv_data,const uint32_t spv_size){return CreateShader(VK_SHADER_STAGE_##vk_name##_BIT,spv_data,spv_size);}
|
2019-04-27 21:23:57 +08:00
|
|
|
|
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
|
|
|
|
|
|
2019-04-27 21:41:58 +08:00
|
|
|
|
#define ADD_NV_SHADER_FUNC(sn,vk_name) const ShaderModule *Create##sn##Shader(const void *spv_data,const uint32_t spv_size){return CreateShader(VK_SHADER_STAGE_##vk_name##_BIT_NV,spv_data,spv_size);}
|
2019-04-27 21:23:57 +08:00
|
|
|
|
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
|
2020-06-09 19:40:08 +08:00
|
|
|
|
*/
|
2019-04-27 21:23:57 +08:00
|
|
|
|
const ShaderModule *GetShader (int);
|
|
|
|
|
bool ReleaseShader (const ShaderModule *);
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2019-04-28 18:17:13 +08:00
|
|
|
|
Material * CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)const;
|
2020-06-24 01:51:10 +08:00
|
|
|
|
Material * CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)const;
|
|
|
|
|
|
2019-04-30 16:42:59 +08:00
|
|
|
|
Material * CreateMaterial(const OSString &vertex_shader_filename,const OSString &fragment_shader_filename)
|
2019-04-28 16:06:53 +08:00
|
|
|
|
{
|
|
|
|
|
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
|
|
|
|
|
|
|
|
|
if(!vs)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
|
|
|
|
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
|
|
|
|
|
|
|
|
|
if(!fs)
|
|
|
|
|
{
|
|
|
|
|
ReleaseShader(vs);
|
|
|
|
|
return(nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(CreateMaterial((VertexShaderModule *)vs,fs));
|
|
|
|
|
}
|
2020-06-24 01:51:10 +08:00
|
|
|
|
|
|
|
|
|
Material * CreateMaterial(const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename)
|
|
|
|
|
{
|
|
|
|
|
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
|
|
|
|
|
|
|
|
|
if(!vs)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
|
|
|
|
const ShaderModule *gs=CreateShader(VK_SHADER_STAGE_GEOMETRY_BIT,geometry_shader_filename);
|
|
|
|
|
|
|
|
|
|
if(!gs)
|
|
|
|
|
{
|
|
|
|
|
ReleaseShader(vs);
|
|
|
|
|
return(nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
|
|
|
|
|
|
|
|
|
if(!fs)
|
|
|
|
|
{
|
|
|
|
|
ReleaseShader(gs);
|
|
|
|
|
ReleaseShader(vs);
|
|
|
|
|
return(nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(CreateMaterial((VertexShaderModule *)vs,gs,fs));
|
|
|
|
|
}
|
2019-04-27 21:23:57 +08:00
|
|
|
|
};//class ShaderModuleManage
|
|
|
|
|
VK_NAMESPACE_END
|
|
|
|
|
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MANAGE_INCLUDE
|