2020-07-29 01:00:25 +08:00
|
|
|
|
#pragma once
|
2020-09-05 17:54:21 +08:00
|
|
|
|
#include<hgl/type/String.h>
|
2020-06-08 19:12:29 +08:00
|
|
|
|
#include<hgl/type/List.h>
|
2020-06-09 19:40:08 +08:00
|
|
|
|
#include<hgl/type/StringList.h>
|
2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VKFormat.h>
|
|
|
|
|
#include<hgl/graph/VKStruct.h>
|
2020-06-06 19:45:38 +08:00
|
|
|
|
|
2020-06-09 19:40:08 +08:00
|
|
|
|
VK_NAMESPACE_BEGIN
|
2020-12-18 16:52:21 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
struct ShaderStage
|
|
|
|
|
{
|
|
|
|
|
AnsiString name;
|
|
|
|
|
uint location;
|
|
|
|
|
|
|
|
|
|
VertexAttribType type; ///<成份数量(如vec4中的4)
|
|
|
|
|
VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F)
|
|
|
|
|
|
|
|
|
|
uint binding;
|
2020-12-18 16:52:21 +08:00
|
|
|
|
|
|
|
|
|
bool global; ///<是否全局数据
|
|
|
|
|
bool dynamic; ///<是否动态数量
|
2020-09-17 21:49:23 +08:00
|
|
|
|
};//struct ShaderStage
|
|
|
|
|
|
|
|
|
|
using ShaderStageList =ObjectList<ShaderStage>;
|
|
|
|
|
|
2021-06-15 17:43:06 +08:00
|
|
|
|
struct ShaderDescriptor
|
2020-09-17 21:49:23 +08:00
|
|
|
|
{
|
2021-06-15 17:43:06 +08:00
|
|
|
|
char name[128];
|
|
|
|
|
uint32_t set;
|
|
|
|
|
uint32_t binding;
|
2020-09-17 21:49:23 +08:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 17:43:06 +08:00
|
|
|
|
using ShaderDescriptorList=List<ShaderDescriptor>;
|
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
#ifndef VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
|
|
|
|
constexpr size_t VK_DESCRIPTOR_TYPE_BEGIN_RANGE=VK_DESCRIPTOR_TYPE_SAMPLER;
|
|
|
|
|
#endif//VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
|
|
|
|
|
|
|
|
|
#ifndef VK_DESCRIPTOR_TYPE_END_RANGE
|
|
|
|
|
constexpr size_t VK_DESCRIPTOR_TYPE_END_RANGE=VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
|
|
|
|
|
#endif//VK_DESCRIPTOR_TYPE_END_RANGE
|
2020-06-11 18:25:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
#ifndef VK_DESCRIPTOR_TYPE_RANGE_SIZE
|
|
|
|
|
constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1;
|
|
|
|
|
#endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
class ShaderResource
|
|
|
|
|
{
|
|
|
|
|
VkShaderStageFlagBits stage_flag;
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const void *spv_data;
|
|
|
|
|
uint32 spv_size;
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderStageList stage_inputs;
|
|
|
|
|
ShaderStageList stage_outputs;
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
public:
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
|
|
|
|
virtual ~ShaderResource()=default;
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
2020-09-19 23:49:32 +08:00
|
|
|
|
const os_char * GetStageName ()const;
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const uint32_t * GetCode ()const {return (uint32_t *)spv_data;}
|
|
|
|
|
const uint32_t GetCodeSize ()const {return spv_size;}
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderStageList & GetStageInputs () {return stage_inputs;}
|
|
|
|
|
ShaderStageList & GetStageOutputs () {return stage_outputs;}
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const uint GetStageInputCount ()const {return stage_inputs.GetCount();}
|
|
|
|
|
const uint GetStageOutputCount ()const {return stage_outputs.GetCount();}
|
2020-07-11 16:49:17 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const ShaderStage * GetStageInput (const AnsiString &)const;
|
|
|
|
|
const int GetStageInputBinding(const AnsiString &)const;
|
2020-06-09 19:40:08 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const ShaderDescriptorList * GetDescriptorList ()const {return descriptor_list;}
|
|
|
|
|
ShaderDescriptorList * GetDescriptorList (VkDescriptorType desc_type)
|
|
|
|
|
{
|
|
|
|
|
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
|
|
|
|
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
return descriptor_list+desc_type;
|
|
|
|
|
}
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderDescriptorList &GetUBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
|
|
|
|
|
ShaderDescriptorList &GetSSBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
|
|
|
|
|
ShaderDescriptorList &GetSampler(){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const;
|
2021-06-15 17:43:06 +08:00
|
|
|
|
//const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const
|
|
|
|
|
//{
|
|
|
|
|
// if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
|
|
|
|
// ||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
|
2020-06-08 19:12:29 +08:00
|
|
|
|
|
2021-06-15 17:43:06 +08:00
|
|
|
|
// return &(descriptor_list[desc_type].binding_list);
|
|
|
|
|
//}
|
2020-09-17 21:49:23 +08:00
|
|
|
|
};//class ShaderResource
|
2020-06-06 19:45:38 +08:00
|
|
|
|
|
2020-09-17 21:49:23 +08:00
|
|
|
|
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header);
|
|
|
|
|
ShaderResource *LoadShaderResoruce(const OSString &filename);
|
2020-10-19 22:23:03 +08:00
|
|
|
|
|
|
|
|
|
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
ShaderModuleCreateInfo(ShaderResource *sr)
|
|
|
|
|
{
|
|
|
|
|
codeSize=sr->GetCodeSize();
|
|
|
|
|
pCode =sr->GetCode();
|
|
|
|
|
}
|
|
|
|
|
};
|
2020-06-09 19:40:08 +08:00
|
|
|
|
VK_NAMESPACE_END
|