refactor and renamed MaterialInstance to MaterialParameters.
This commit is contained in:
@@ -35,8 +35,7 @@ void DescriptorSetLayoutCreater::Bind(const ShaderDescriptorList *sd_list,VkDesc
|
||||
{
|
||||
//重复的绑定点是有可能存在的,比如CameraInfo在vs/fs中同时存在
|
||||
|
||||
if((!index_by_binding.KeyExist(sd.binding))
|
||||
&&(!index_by_binding_ri.KeyExist(sd.binding)))
|
||||
if(!all_index_by_binding.KeyExist(sd.binding))
|
||||
{
|
||||
p->binding = sd.binding;
|
||||
p->descriptorType = desc_type;
|
||||
@@ -45,15 +44,16 @@ void DescriptorSetLayoutCreater::Bind(const ShaderDescriptorList *sd_list,VkDesc
|
||||
p->pImmutableSamplers = nullptr;
|
||||
|
||||
if(sd.name[0]=='r'
|
||||
&&sd.name[1]=='i'
|
||||
&&sd.name[2]=='_')
|
||||
index_by_binding_ri.Add(sd.binding,fin_count+old_count);
|
||||
&&sd.name[1]=='_')
|
||||
index_by_binding[(size_t)DescriptorSetsType::Renderable].Add(sd.binding,fin_count+old_count);
|
||||
else
|
||||
if(sd.name[0]=='g'
|
||||
&&sd.name[1]=='_')
|
||||
index_by_binding_global.Add(sd.binding,fin_count+old_count);
|
||||
index_by_binding[(size_t)DescriptorSetsType::Global].Add(sd.binding,fin_count+old_count);
|
||||
else
|
||||
index_by_binding.Add(sd.binding,fin_count+old_count);
|
||||
index_by_binding[(size_t)DescriptorSetsType::Values].Add(sd.binding,fin_count+old_count);
|
||||
|
||||
all_index_by_binding.Add(sd.binding,fin_count+old_count);
|
||||
|
||||
++p;
|
||||
++fin_count;
|
||||
@@ -113,14 +113,15 @@ DescriptorSets *DescriptorSetLayoutCreater::Create(const DescriptorSetsType &typ
|
||||
BindingMapping *bm=nullptr;
|
||||
|
||||
if(type==DescriptorSetsType::Material
|
||||
||type==DescriptorSetsType::MaterialInstance) //未开会区分开
|
||||
bm=&index_by_binding;
|
||||
// ||type==DescriptorSetsType::Texture
|
||||
||type==DescriptorSetsType::Values) //未来会区分开
|
||||
bm=&index_by_binding[(size_t)DescriptorSetsType::Values];
|
||||
else
|
||||
if(type==DescriptorSetsType::RenderableInstance)
|
||||
bm=&index_by_binding_ri;
|
||||
if(type==DescriptorSetsType::Renderable)
|
||||
bm=&index_by_binding[(size_t)DescriptorSetsType::Renderable];
|
||||
else
|
||||
if(type==DescriptorSetsType::Global)
|
||||
bm=&index_by_binding_global;
|
||||
bm=&index_by_binding[(size_t)DescriptorSetsType::Global];
|
||||
else
|
||||
return(nullptr);
|
||||
|
||||
|
@@ -17,9 +17,8 @@ class DescriptorSetLayoutCreater
|
||||
List<VkDescriptorSetLayoutBinding> layout_binding_list;
|
||||
VkDescriptorSetLayout dsl=VK_NULL_HANDLE;
|
||||
|
||||
BindingMapping index_by_binding;
|
||||
BindingMapping index_by_binding_ri;
|
||||
BindingMapping index_by_binding_global;
|
||||
BindingMapping all_index_by_binding;
|
||||
BindingMapping index_by_binding[size_t(DescriptorSetsType::RANGE_SIZE)];
|
||||
|
||||
VkPipelineLayout pipeline_layout=VK_NULL_HANDLE;
|
||||
|
||||
|
83
src/SceneGraph/Vulkan/VKDeviceMaterial.cpp
Normal file
83
src/SceneGraph/Vulkan/VKDeviceMaterial.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include"VKDescriptorSetLayoutCreater.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps)
|
||||
{
|
||||
const int shader_count=shader_maps->GetCount();
|
||||
|
||||
if(shader_count<2)
|
||||
return(nullptr);
|
||||
|
||||
const ShaderModule *sm;
|
||||
|
||||
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
||||
return(nullptr);
|
||||
|
||||
DescriptorSetLayoutCreater *dsl_creater=CreateDescriptorSetLayoutCreater();
|
||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
||||
|
||||
shader_stage_list->SetCount(shader_count);
|
||||
|
||||
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
||||
|
||||
auto **itp=shader_maps->GetDataList();
|
||||
for(int i=0;i<shader_count;i++)
|
||||
{
|
||||
sm=(*itp)->right;
|
||||
hgl_cpy(p,sm->GetCreateInfo());
|
||||
|
||||
dsl_creater->Bind(sm->GetDescriptorList(),sm->GetStage());
|
||||
|
||||
++p;
|
||||
++itp;
|
||||
}
|
||||
|
||||
if(!dsl_creater->CreatePipelineLayout())
|
||||
{
|
||||
delete shader_stage_list;
|
||||
delete dsl_creater;
|
||||
delete shader_maps;
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater));
|
||||
}
|
||||
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)
|
||||
{
|
||||
if(!vertex_shader_module||!fragment_shader_module)
|
||||
return(nullptr);
|
||||
|
||||
if(!vertex_shader_module->IsVertex())return(nullptr);
|
||||
if(!fragment_shader_module->IsFragment())return(nullptr);
|
||||
|
||||
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||
|
||||
smm->Add(vertex_shader_module);
|
||||
smm->Add(fragment_shader_module);
|
||||
|
||||
return CreateMaterial(mtl_name,smm);
|
||||
}
|
||||
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)
|
||||
{
|
||||
if(!vertex_shader_module
|
||||
||!geometry_shader_module
|
||||
||!fragment_shader_module)
|
||||
return(nullptr);
|
||||
|
||||
if(!vertex_shader_module->IsVertex())return(nullptr);
|
||||
if(!geometry_shader_module->IsGeometry())return(nullptr);
|
||||
if(!fragment_shader_module->IsFragment())return(nullptr);
|
||||
|
||||
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||
|
||||
smm->Add(vertex_shader_module);
|
||||
smm->Add(geometry_shader_module);
|
||||
smm->Add(fragment_shader_module);
|
||||
|
||||
return CreateMaterial(mtl_name,smm);
|
||||
}
|
||||
VK_NAMESPACE_END
|
@@ -1,90 +1,7 @@
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKDescriptorSets.h>
|
||||
#include<hgl/graph/VKShaderModule.h>
|
||||
#include<hgl/graph/VKShaderModuleMap.h>
|
||||
#include<hgl/graph/VKVertexAttributeBinding.h>
|
||||
#include<hgl/graph/VKBuffer.h>
|
||||
#include<hgl/graph/VKMaterialParameters.h>
|
||||
#include"VKDescriptorSetLayoutCreater.h"
|
||||
VK_NAMESPACE_BEGIN
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps)
|
||||
{
|
||||
const int shader_count=shader_maps->GetCount();
|
||||
|
||||
if(shader_count<2)
|
||||
return(nullptr);
|
||||
|
||||
const ShaderModule *sm;
|
||||
|
||||
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
||||
return(nullptr);
|
||||
|
||||
DescriptorSetLayoutCreater *dsl_creater=CreateDescriptorSetLayoutCreater();
|
||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
||||
|
||||
shader_stage_list->SetCount(shader_count);
|
||||
|
||||
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
||||
|
||||
auto **itp=shader_maps->GetDataList();
|
||||
for(int i=0;i<shader_count;i++)
|
||||
{
|
||||
sm=(*itp)->right;
|
||||
hgl_cpy(p,sm->GetCreateInfo());
|
||||
|
||||
dsl_creater->Bind(sm->GetDescriptorList(),sm->GetStage());
|
||||
|
||||
++p;
|
||||
++itp;
|
||||
}
|
||||
|
||||
if(!dsl_creater->CreatePipelineLayout())
|
||||
{
|
||||
delete shader_stage_list;
|
||||
delete dsl_creater;
|
||||
delete shader_maps;
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater));
|
||||
}
|
||||
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)
|
||||
{
|
||||
if(!vertex_shader_module||!fragment_shader_module)
|
||||
return(nullptr);
|
||||
|
||||
if(!vertex_shader_module->IsVertex())return(nullptr);
|
||||
if(!fragment_shader_module->IsFragment())return(nullptr);
|
||||
|
||||
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||
|
||||
smm->Add(vertex_shader_module);
|
||||
smm->Add(fragment_shader_module);
|
||||
|
||||
return CreateMaterial(mtl_name,smm);
|
||||
}
|
||||
|
||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)
|
||||
{
|
||||
if(!vertex_shader_module
|
||||
||!geometry_shader_module
|
||||
||!fragment_shader_module)
|
||||
return(nullptr);
|
||||
|
||||
if(!vertex_shader_module->IsVertex())return(nullptr);
|
||||
if(!geometry_shader_module->IsGeometry())return(nullptr);
|
||||
if(!fragment_shader_module->IsFragment())return(nullptr);
|
||||
|
||||
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||
|
||||
smm->Add(vertex_shader_module);
|
||||
smm->Add(geometry_shader_module);
|
||||
smm->Add(fragment_shader_module);
|
||||
|
||||
return CreateMaterial(mtl_name,smm);
|
||||
}
|
||||
|
||||
Material::Material(const UTF8String &name,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc)
|
||||
{
|
||||
mtl_name=name;
|
||||
@@ -105,12 +22,17 @@ Material::Material(const UTF8String &name,ShaderModuleMap *smm,List<VkPipelineSh
|
||||
vab=nullptr;
|
||||
}
|
||||
|
||||
ri_desc_sets=dsl_creater->Create(DescriptorSetsType::RenderableInstance);
|
||||
mp_m=CreateMP(DescriptorSetsType::Material);
|
||||
mp_r=CreateMP(DescriptorSetsType::Renderable);
|
||||
mp_g=CreateMP(DescriptorSetsType::Global);
|
||||
}
|
||||
|
||||
Material::~Material()
|
||||
{
|
||||
SAFE_CLEAR(ri_desc_sets);
|
||||
SAFE_CLEAR(mp_m);
|
||||
SAFE_CLEAR(mp_r);
|
||||
SAFE_CLEAR(mp_g);
|
||||
|
||||
delete dsl_creater;
|
||||
|
||||
if(vab)
|
||||
@@ -153,8 +75,12 @@ const VkPipelineLayout Material::GetPipelineLayout()const
|
||||
return dsl_creater->GetPipelineLayout();
|
||||
}
|
||||
|
||||
DescriptorSets *Material::CreateMIDescriptorSets()const
|
||||
MaterialParameters *Material::CreateMP(const DescriptorSetsType &type)
|
||||
{
|
||||
return dsl_creater->Create(DescriptorSetsType::MaterialInstance);
|
||||
DescriptorSets *ds=dsl_creater->Create(type);
|
||||
|
||||
if(!ds)return(nullptr);
|
||||
|
||||
return(new MaterialParameters(this,type,ds));
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@@ -1,12 +1,13 @@
|
||||
#include<hgl/graph/VKMaterialInstance.h>
|
||||
#include<hgl/graph/VKMaterialParameters.h>
|
||||
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include<hgl/graph/VKDescriptorSets.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
MaterialParameters::MaterialParameters(Material *m,DescriptorSets *ds)
|
||||
MaterialParameters::MaterialParameters(Material *m,const DescriptorSetsType &type,DescriptorSets *ds)
|
||||
{
|
||||
material=m;
|
||||
ds_type=type;
|
||||
descriptor_sets=ds;
|
||||
}
|
||||
|
||||
@@ -67,13 +68,4 @@ void MaterialParameters::Update()
|
||||
{
|
||||
descriptor_sets->Update();
|
||||
}
|
||||
|
||||
MaterialParameters *Material::CreateInstance()
|
||||
{
|
||||
DescriptorSets *ds=CreateMIDescriptorSets();
|
||||
|
||||
if(!ds)return(nullptr);
|
||||
|
||||
return(new MaterialParameters(this,ds));
|
||||
}
|
||||
VK_NAMESPACE_END
|
@@ -54,7 +54,7 @@ MaterialParameters *RenderResource::CreateMaterialInstance(Material *mtl)
|
||||
{
|
||||
if(!mtl)return(nullptr);
|
||||
|
||||
MaterialParameters *mi=mtl->CreateInstance();
|
||||
MaterialParameters *mi=mtl->CreateMP();
|
||||
|
||||
if(mi)
|
||||
Add(mi);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#include<hgl/graph/VKRenderTarget.h>
|
||||
#include<hgl/graph/VKMaterialInstance.h>
|
||||
#include<hgl/graph/VKMaterialParameters.h>
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKInlinePipeline.h>
|
||||
#include<hgl/graph/VKPipelineData.h>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#include<hgl/graph/VKRenderableInstance.h>
|
||||
#include<hgl/graph/VKMaterialInstance.h>
|
||||
#include<hgl/graph/VKMaterialParameters.h>
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include<hgl/graph/VKVertexAttribBuffer.h>
|
||||
#include<hgl/util/hash/Hash.h>
|
||||
|
Reference in New Issue
Block a user