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

@ -32,31 +32,9 @@ public:
Material(const UTF8String &name,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc);
~Material();
const UTF8String & GetName()const{return mtl_name;}
const UTF8String & GetName ()const{return mtl_name;}
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 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();}
@ -70,7 +48,7 @@ public:
public:
MaterialParameters * CreateMP (const DescriptorSetsType &type=DescriptorSetsType::Values);
MaterialParameters * CreateMP (const DescriptorSetsType &type)const;
MaterialParameters * GetMP (const DescriptorSetsType &type)
{
if(type==DescriptorSetsType::Material )return mp_m;else
@ -78,6 +56,8 @@ public:
if(type==DescriptorSetsType::Global )return mp_g;else
return(nullptr);
}
MaterialInstance * CreateInstance();
};//class Material
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

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

View File

@ -45,42 +45,17 @@ Material::~Material()
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
{
return dsl_creater->GetPipelineLayout();
}
MaterialParameters *Material::CreateMP(const DescriptorSetsType &type)
MaterialParameters *Material::CreateMP(const DescriptorSetsType &type)const
{
DescriptorSets *ds=dsl_creater->Create(type);
if(!ds)return(nullptr);
return(new MaterialParameters(this,type,ds));
return(new MaterialParameters(shader_maps,type,ds));
}
VK_NAMESPACE_END

View File

@ -12,4 +12,29 @@ bool ShaderModuleMap::Add(const ShaderModule *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