diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index c1a48942..9323b850 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -32,31 +32,9 @@ public: Material(const UTF8String &name,ShaderModuleMap *smm,List *,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 diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index 910cf522..0fb9c8d6 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -3,10 +3,11 @@ #include #include +#include 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 diff --git a/inc/hgl/graph/VKShaderModuleMap.h b/inc/hgl/graph/VKShaderModuleMap.h index fee67547..646f049e 100644 --- a/inc/hgl/graph/VKShaderModuleMap.h +++ b/inc/hgl/graph/VKShaderModuleMap.h @@ -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 @@ -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 VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index 14e0c280..c6e08edd 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -45,42 +45,17 @@ Material::~Material() delete shader_maps; } -const int Material::GetBinding(VkDescriptorType desc_type,const AnsiString &name)const -{ - if(desc_typeVK_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;iright; - 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 diff --git a/src/SceneGraph/Vulkan/VKShaderModuleMap.cpp b/src/SceneGraph/Vulkan/VKShaderModuleMap.cpp index 605eaa06..8938ae25 100644 --- a/src/SceneGraph/Vulkan/VKShaderModuleMap.cpp +++ b/src/SceneGraph/Vulkan/VKShaderModuleMap.cpp @@ -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_typeVK_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;iright; + binding=sm->GetBinding(desc_type,name); + if(binding!=-1) + return binding; + + ++itp; + } + + return(-1); +} VK_NAMESPACE_END \ No newline at end of file