new MaterialDescriptorSets
This commit is contained in:
@@ -14,6 +14,18 @@
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
using CharPointerList=hgl::List<const char *>;
|
||||
using BindingMapping=Map<uint32_t,int>;
|
||||
|
||||
@@ -78,6 +90,7 @@ class ShaderResource;
|
||||
class ShaderModule;
|
||||
class VertexShaderModule;
|
||||
class ShaderModuleMap;
|
||||
class MaterialDescriptorSets;
|
||||
|
||||
class Material;
|
||||
class MaterialParameters;
|
||||
|
@@ -191,7 +191,7 @@ public: //
|
||||
|
||||
public: //shader & material
|
||||
|
||||
DescriptorSetLayoutCreater *CreateDescriptorSetLayoutCreater();
|
||||
DescriptorSetLayoutCreater *CreateDescriptorSetLayoutCreater(const MaterialDescriptorSets *);
|
||||
|
||||
ShaderModule *CreateShaderModule(ShaderResource *);
|
||||
|
||||
|
@@ -18,8 +18,10 @@ class Material
|
||||
UTF8String mtl_name;
|
||||
|
||||
ShaderModuleMap *shader_maps;
|
||||
MaterialDescriptorSets *mds;
|
||||
|
||||
VertexShaderModule *vertex_sm;
|
||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list;
|
||||
List<VkPipelineShaderStageCreateInfo> shader_stage_list;
|
||||
|
||||
DescriptorSetLayoutCreater *dsl_creater;
|
||||
|
||||
@@ -29,15 +31,15 @@ class Material
|
||||
|
||||
public:
|
||||
|
||||
Material(const UTF8String &name,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc);
|
||||
Material(const UTF8String &name,ShaderModuleMap *smm,MaterialDescriptorSets *_mds,DescriptorSetLayoutCreater *);
|
||||
~Material();
|
||||
|
||||
const UTF8String & GetName ()const{return mtl_name;}
|
||||
|
||||
const VertexShaderModule * GetVertexShaderModule ()const{return vertex_sm;}
|
||||
|
||||
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
||||
const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();}
|
||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list.GetData();}
|
||||
|
||||
const VkPipelineLayout GetPipelineLayout ()const;
|
||||
|
||||
|
82
inc/hgl/graph/VKMaterialDescriptorSets.h
Normal file
82
inc/hgl/graph/VKMaterialDescriptorSets.h
Normal file
@@ -0,0 +1,82 @@
|
||||
#ifndef HGL_GRAPH_VULKAN_MATERIAL_DESCRIPTOR_SETS_INCLUDE
|
||||
#define HGL_GRAPH_VULKAN_MATERIAL_DESCRIPTOR_SETS_INCLUDE
|
||||
|
||||
#include<hgl/graph/VK.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
struct ShaderDescriptor
|
||||
{
|
||||
char name[128];
|
||||
|
||||
VkDescriptorType desc_type;
|
||||
DescriptorSetType set_type;
|
||||
uint32_t set;
|
||||
uint32_t binding;
|
||||
uint32_t stage_flag;
|
||||
};
|
||||
|
||||
using ShaderDescriptorList=List<ShaderDescriptor *>;
|
||||
|
||||
class MaterialDescriptorSets
|
||||
{
|
||||
ShaderDescriptor *sd_list;
|
||||
uint sd_count;
|
||||
|
||||
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||
|
||||
Map<AnsiString,ShaderDescriptor *> sd_by_name;
|
||||
Map<AnsiString,int> binding_map[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||
|
||||
int *binding_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||
|
||||
private:
|
||||
|
||||
struct ShaderDescriptorSet
|
||||
{
|
||||
uint32_t count;
|
||||
VkDescriptorSetLayoutBinding *binding_list;
|
||||
};
|
||||
|
||||
ShaderDescriptorSet sds[size_t(DescriptorSetType::RANGE_SIZE)];
|
||||
|
||||
public:
|
||||
|
||||
MaterialDescriptorSets(ShaderDescriptor *,const uint);
|
||||
~MaterialDescriptorSets();
|
||||
|
||||
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;
|
||||
|
||||
return descriptor_list+desc_type;
|
||||
}
|
||||
|
||||
//ShaderDescriptorList &GetUBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
|
||||
//ShaderDescriptorList &GetSSBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
|
||||
//ShaderDescriptorList &GetUBODynamic (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC];}
|
||||
//ShaderDescriptorList &GetSSBODynamic(){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC];}
|
||||
//ShaderDescriptorList &GetSampler (){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
|
||||
|
||||
|
||||
const int GetBinding(const VkDescriptorType &desc_type,const AnsiString &name)const;
|
||||
|
||||
const int GetUBO(const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,name);}
|
||||
const int GetSSBO(const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,name);}
|
||||
const int GetSampler(const AnsiString &name)const{return GetBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,name);}
|
||||
|
||||
const int *GetBindingList(const VkDescriptorType &desc_type)const
|
||||
{
|
||||
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
||||
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
|
||||
|
||||
return binding_list[(size_t)desc_type];
|
||||
}
|
||||
|
||||
const int GetSetBindingCount(const DescriptorSetType &type)const{return sds[(size_t)type].count;}
|
||||
const VkDescriptorSetLayoutBinding *GetSetBindingList(const DescriptorSetType &type)const{return sds[(size_t)type].binding_list;}
|
||||
};//class MaterialDescriptorSets
|
||||
VK_NAMESPACE_END
|
||||
#endif//HGL_GRAPH_VULKAN_MATERIAL_DESCRIPTOR_SETS_INCLUDE
|
@@ -7,7 +7,7 @@
|
||||
VK_NAMESPACE_BEGIN
|
||||
class MaterialParameters
|
||||
{
|
||||
const ShaderModuleMap *shader_map;
|
||||
const MaterialDescriptorSets *mds;
|
||||
|
||||
DescriptorSetType ds_type;
|
||||
|
||||
@@ -17,7 +17,7 @@ private:
|
||||
|
||||
friend class Material;
|
||||
|
||||
MaterialParameters(const ShaderModuleMap *,const DescriptorSetType &type,DescriptorSets *);
|
||||
MaterialParameters(const MaterialDescriptorSets *,const DescriptorSetType &type,DescriptorSets *);
|
||||
|
||||
public:
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||
|
||||
#include<hgl/graph/shader/ShaderResource.h>
|
||||
#include<hgl/graph/VKShaderResource.h>
|
||||
#include<hgl/type/Sets.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
@@ -45,13 +45,6 @@ public:
|
||||
const bool IsMesh ()const{return stage_create_info->stage==VK_SHADER_STAGE_MESH_BIT_NV;}
|
||||
|
||||
const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;}
|
||||
|
||||
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const
|
||||
{
|
||||
return shader_resource->GetBinding(desc_type,name);
|
||||
}
|
||||
|
||||
const ShaderDescriptorList * GetDescriptorList()const{return shader_resource->GetDescriptorList();}
|
||||
};//class ShaderModule
|
||||
|
||||
class VertexAttributeBinding;
|
||||
|
@@ -17,30 +17,6 @@ public:
|
||||
~ShaderModuleMap()=default;
|
||||
|
||||
bool Add(const ShaderModule *sm);
|
||||
|
||||
public:
|
||||
|
||||
const int GetBinding(VkDescriptorType,const AnsiString &)const;
|
||||
|
||||
#define GET_BO_BINDING(name,vk_name) const int Get##name(const AnsiString &obj_name)const{return GetBinding(VK_DESCRIPTOR_TYPE_##vk_name,obj_name);}
|
||||
// GET_BO_BINDING(Sampler, SAMPLER)
|
||||
|
||||
GET_BO_BINDING(Sampler, COMBINED_IMAGE_SAMPLER)
|
||||
// GET_BO_BINDING(SampledImage, SAMPLED_IMAGE)
|
||||
GET_BO_BINDING(StorageImage, STORAGE_IMAGE)
|
||||
|
||||
GET_BO_BINDING(UTBO, UNIFORM_TEXEL_BUFFER)
|
||||
GET_BO_BINDING(SSTBO, STORAGE_TEXEL_BUFFER)
|
||||
GET_BO_BINDING(UBO, UNIFORM_BUFFER)
|
||||
GET_BO_BINDING(SSBO, STORAGE_BUFFER)
|
||||
|
||||
//shader中并不区分普通UBO和动态UBO,所以Material/ShaderResource中的数据,只有UBO
|
||||
|
||||
// GET_BO_BINDING(UBODynamic, UNIFORM_BUFFER_DYNAMIC)
|
||||
// GET_BO_BINDING(SSBODynamic, STORAGE_BUFFER_DYNAMIC)
|
||||
|
||||
GET_BO_BINDING(InputAttachment, INPUT_ATTACHMENT)
|
||||
#undef GET_BO_BINDING
|
||||
};//class ShaderModuleMap:public Map<VkShaderStageFlagBits,const ShaderModule *>
|
||||
VK_NAMESPACE_END
|
||||
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE
|
||||
|
71
inc/hgl/graph/VKShaderResource.h
Normal file
71
inc/hgl/graph/VKShaderResource.h
Normal file
@@ -0,0 +1,71 @@
|
||||
#ifndef HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
||||
#define HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
||||
|
||||
#include<hgl/type/String.h>
|
||||
#include<hgl/type/List.h>
|
||||
#include<hgl/type/StringList.h>
|
||||
#include<hgl/graph/VK.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
struct ShaderStage
|
||||
{
|
||||
AnsiString name;
|
||||
uint location;
|
||||
|
||||
VertexAttribType type; ///<成份数量(如vec4中的4)
|
||||
VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F)
|
||||
|
||||
uint binding;
|
||||
|
||||
bool global; ///<是否全局数据
|
||||
bool dynamic; ///<是否动态数量
|
||||
};//struct ShaderStage
|
||||
|
||||
using ShaderStageList =ObjectList<ShaderStage>;
|
||||
|
||||
class ShaderResource
|
||||
{
|
||||
VkShaderStageFlagBits stage_flag;
|
||||
|
||||
const void *spv_data;
|
||||
uint32 spv_size;
|
||||
|
||||
ShaderStageList stage_inputs;
|
||||
ShaderStageList stage_outputs;
|
||||
|
||||
public:
|
||||
|
||||
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
||||
virtual ~ShaderResource()=default;
|
||||
|
||||
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
||||
const os_char * GetStageName ()const;
|
||||
|
||||
const uint32_t * GetCode ()const {return (uint32_t *)spv_data;}
|
||||
const uint32_t GetCodeSize ()const {return spv_size;}
|
||||
|
||||
ShaderStageList & GetStageInputs () {return stage_inputs;}
|
||||
ShaderStageList & GetStageOutputs () {return stage_outputs;}
|
||||
|
||||
const uint GetStageInputCount ()const {return stage_inputs.GetCount();}
|
||||
const uint GetStageOutputCount ()const {return stage_outputs.GetCount();}
|
||||
|
||||
const ShaderStage * GetStageInput (const AnsiString &)const;
|
||||
const int GetStageInputBinding(const AnsiString &)const;
|
||||
};//class ShaderResource
|
||||
|
||||
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize);
|
||||
|
||||
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
|
||||
{
|
||||
public:
|
||||
|
||||
ShaderModuleCreateInfo(ShaderResource *sr)
|
||||
{
|
||||
codeSize=sr->GetCodeSize();
|
||||
pCode =sr->GetCode();
|
||||
}
|
||||
};//struct ShaderModuleCreateInfo
|
||||
VK_NAMESPACE_END
|
||||
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
@@ -1,124 +0,0 @@
|
||||
#pragma once
|
||||
#include<hgl/type/String.h>
|
||||
#include<hgl/type/List.h>
|
||||
#include<hgl/type/StringList.h>
|
||||
#include<hgl/graph/VK.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
struct ShaderStage
|
||||
{
|
||||
AnsiString name;
|
||||
uint location;
|
||||
|
||||
VertexAttribType type; ///<成份数量(如vec4中的4)
|
||||
VkFormat format; ///<对应的Vulkan格式(如vec4对应的FMT_RGBA32F)
|
||||
|
||||
uint binding;
|
||||
|
||||
bool global; ///<是否全局数据
|
||||
bool dynamic; ///<是否动态数量
|
||||
};//struct ShaderStage
|
||||
|
||||
using ShaderStageList =ObjectList<ShaderStage>;
|
||||
|
||||
struct ShaderDescriptor
|
||||
{
|
||||
char name[128];
|
||||
|
||||
VkDescriptorType desc_type;
|
||||
DescriptorSetType set_type;
|
||||
uint32_t set;
|
||||
uint32_t binding;
|
||||
uint32_t stage_flag;
|
||||
};
|
||||
|
||||
using ShaderDescriptorList=List<ShaderDescriptor>;
|
||||
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
class MaterialDescriptorSets
|
||||
{
|
||||
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||
|
||||
public:
|
||||
|
||||
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;
|
||||
|
||||
return descriptor_list+desc_type;
|
||||
}
|
||||
|
||||
ShaderDescriptorList &GetUBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
|
||||
ShaderDescriptorList &GetSSBO (){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
|
||||
ShaderDescriptorList &GetUBODynamic (){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC];}
|
||||
ShaderDescriptorList &GetSSBODynamic(){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC];}
|
||||
ShaderDescriptorList &GetSampler (){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
|
||||
|
||||
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const;
|
||||
//const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const
|
||||
//{
|
||||
// if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
||||
// ||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
|
||||
|
||||
// return &(descriptor_list[desc_type].binding_list);
|
||||
//}
|
||||
};//
|
||||
|
||||
class ShaderResource
|
||||
{
|
||||
VkShaderStageFlagBits stage_flag;
|
||||
|
||||
const void *spv_data;
|
||||
uint32 spv_size;
|
||||
|
||||
ShaderStageList stage_inputs;
|
||||
ShaderStageList stage_outputs;
|
||||
|
||||
public:
|
||||
|
||||
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
||||
virtual ~ShaderResource()=default;
|
||||
|
||||
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
||||
const os_char * GetStageName ()const;
|
||||
|
||||
const uint32_t * GetCode ()const {return (uint32_t *)spv_data;}
|
||||
const uint32_t GetCodeSize ()const {return spv_size;}
|
||||
|
||||
ShaderStageList & GetStageInputs () {return stage_inputs;}
|
||||
ShaderStageList & GetStageOutputs () {return stage_outputs;}
|
||||
|
||||
const uint GetStageInputCount ()const {return stage_inputs.GetCount();}
|
||||
const uint GetStageOutputCount ()const {return stage_outputs.GetCount();}
|
||||
|
||||
const ShaderStage * GetStageInput (const AnsiString &)const;
|
||||
const int GetStageInputBinding(const AnsiString &)const;
|
||||
};//class ShaderResource
|
||||
|
||||
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize);
|
||||
|
||||
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
|
||||
{
|
||||
public:
|
||||
|
||||
ShaderModuleCreateInfo(ShaderResource *sr)
|
||||
{
|
||||
codeSize=sr->GetCodeSize();
|
||||
pCode =sr->GetCode();
|
||||
}
|
||||
};
|
||||
VK_NAMESPACE_END
|
Reference in New Issue
Block a user