moved GetBinding functions to ShaderModuleMap from Material.

This commit is contained in:
hyzboy 2021-06-16 20:27:10 +08:00
parent 3658171954
commit cbbc0641ef
5 changed files with 64 additions and 59 deletions

View File

@ -36,28 +36,6 @@ public:
const VertexShaderModule * GetVertexShaderModule ()const{return vertex_sm;} const VertexShaderModule * GetVertexShaderModule ()const{return vertex_sm;}
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
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();} const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();} const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
@ -70,7 +48,7 @@ public:
public: public:
MaterialParameters * CreateMP (const DescriptorSetsType &type=DescriptorSetsType::Values); MaterialParameters * CreateMP (const DescriptorSetsType &type)const;
MaterialParameters * GetMP (const DescriptorSetsType &type) MaterialParameters * GetMP (const DescriptorSetsType &type)
{ {
if(type==DescriptorSetsType::Material )return mp_m;else if(type==DescriptorSetsType::Material )return mp_m;else
@ -78,6 +56,8 @@ public:
if(type==DescriptorSetsType::Global )return mp_g;else if(type==DescriptorSetsType::Global )return mp_g;else
return(nullptr); return(nullptr);
} }
MaterialInstance * CreateInstance();
};//class Material };//class Material
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

@ -3,10 +3,11 @@
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/type/String.h> #include<hgl/type/String.h>
#include<hgl/graph/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
class MaterialParameters class MaterialParameters
{ {
Material *material; const ShaderModuleMap *shader_map;
DescriptorSetsType ds_type; DescriptorSetsType ds_type;
@ -16,20 +17,20 @@ private:
friend class Material; friend class Material;
MaterialParameters(Material *,const DescriptorSetsType &type,DescriptorSets *); MaterialParameters(const ShaderModuleMap *,const DescriptorSetsType &type,DescriptorSets *);
public: public:
Material * GetMaterial (){return material;}
const DescriptorSetsType GetType (){return ds_type;} const DescriptorSetsType GetType (){return ds_type;}
DescriptorSets * GetDescriptorSets(){return descriptor_sets;} DescriptorSets * GetDescriptorSet (){return descriptor_sets;}
const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_sets->GetDescriptorSet();}
public: public:
#define MP_TYPE_IS(name) const bool is##name()const{return ds_type==DescriptorSetsType::name;} #define MP_TYPE_IS(name) const bool is##name()const{return ds_type==DescriptorSetsType::name;}
MP_TYPE_IS(Material) MP_TYPE_IS(Material)
// MP_TYPE_IS(Texture) // MP_TYPE_IS(Texture)
MP_TYPE_IS(Values) MP_TYPE_IS(Value)
MP_TYPE_IS(Renderable) MP_TYPE_IS(Renderable)
MP_TYPE_IS(Global) MP_TYPE_IS(Global)
#undef MP_TYPE_IS #undef MP_TYPE_IS

View File

@ -1,4 +1,4 @@
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE #ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE
#define HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE #define HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE
#include<hgl/type/Map.h> #include<hgl/type/Map.h>
@ -17,6 +17,30 @@ public:
~ShaderModuleMap()=default; ~ShaderModuleMap()=default;
bool Add(const ShaderModule *sm); 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 *> };//class ShaderModuleMap:public Map<VkShaderStageFlagBits,const ShaderModule *>
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE #endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE

View File

@ -45,42 +45,17 @@ Material::~Material()
delete shader_maps; delete shader_maps;
} }
const int Material::GetBinding(VkDescriptorType desc_type,const AnsiString &name)const
{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE
||name.IsEmpty())
return(-1);
int binding;
const int shader_count=shader_maps->GetCount();
const ShaderModule *sm;
auto **itp=shader_maps->GetDataList();
for(int i=0;i<shader_count;i++)
{
sm=(*itp)->right;
binding=sm->GetBinding(desc_type,name);
if(binding!=-1)
return binding;
++itp;
}
return(-1);
}
const VkPipelineLayout Material::GetPipelineLayout()const const VkPipelineLayout Material::GetPipelineLayout()const
{ {
return dsl_creater->GetPipelineLayout(); return dsl_creater->GetPipelineLayout();
} }
MaterialParameters *Material::CreateMP(const DescriptorSetsType &type) MaterialParameters *Material::CreateMP(const DescriptorSetsType &type)const
{ {
DescriptorSets *ds=dsl_creater->Create(type); DescriptorSets *ds=dsl_creater->Create(type);
if(!ds)return(nullptr); if(!ds)return(nullptr);
return(new MaterialParameters(this,type,ds)); return(new MaterialParameters(shader_maps,type,ds));
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -12,4 +12,29 @@ bool ShaderModuleMap::Add(const ShaderModule *sm)
return this->Map::Add(stage,sm); return this->Map::Add(stage,sm);
} }
const int ShaderModuleMap::GetBinding(VkDescriptorType desc_type,const AnsiString &name)const
{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE
||name.IsEmpty())
return(-1);
int binding;
const int shader_count=GetCount();
const ShaderModule *sm;
auto **itp=GetDataList();
for(int i=0;i<shader_count;i++)
{
sm=(*itp)->right;
binding=sm->GetBinding(desc_type,name);
if(binding!=-1)
return binding;
++itp;
}
return(-1);
}
VK_NAMESPACE_END VK_NAMESPACE_END