new MaterialInstance

This commit is contained in:
2021-06-16 20:29:25 +08:00
parent cbbc0641ef
commit 53c58a885e
21 changed files with 196 additions and 142 deletions

View File

@@ -101,6 +101,38 @@ bool RenderCmdBuffer::BeginRenderPass()
return(true);
}
bool RenderCmdBuffer::BindDescriptorSets(RenderableInstance *ri)
{
if(!ri)return(false);
{
uint32_t count=0;
MaterialParameters *mp;
VkDescriptorSet ds[(size_t)DescriptorSetsType::RANGE_SIZE];
ENUM_CLASS_FOR(DescriptorSetsType,int,i)
{
mp=ri->GetMP((DescriptorSetsType)i);
if(mp)
{
ds[count]=mp->GetVkDescriptorSet();
++count;
}
}
if(count>0)
{
pipeline_layout=ri->GetPipelineLayout();
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,pipeline_layout,0,count,ds,0,nullptr);
}
}
return(false);
}
bool RenderCmdBuffer::BindVAB(RenderableInstance *ri)
{
if(!ri)

View File

@@ -51,7 +51,7 @@ void DescriptorSetLayoutCreater::Bind(const ShaderDescriptorList *sd_list,VkDesc
&&sd.name[1]=='_')
index_by_binding[(size_t)DescriptorSetsType::Global].Add(sd.binding,fin_count+old_count);
else
index_by_binding[(size_t)DescriptorSetsType::Values].Add(sd.binding,fin_count+old_count);
index_by_binding[(size_t)DescriptorSetsType::Value].Add(sd.binding,fin_count+old_count);
all_index_by_binding.Add(sd.binding,fin_count+old_count);
@@ -100,7 +100,7 @@ bool DescriptorSetLayoutCreater::CreatePipelineLayout()
return(true);
}
DescriptorSets *DescriptorSetLayoutCreater::Create(const DescriptorSetsType &type)
DescriptorSets *DescriptorSetLayoutCreater::Create(const DescriptorSetsType &type)const
{
if(!pipeline_layout||!dsl)
return(nullptr);
@@ -110,12 +110,12 @@ DescriptorSets *DescriptorSetLayoutCreater::Create(const DescriptorSetsType &typ
if(count<=0)
return(nullptr);
BindingMapping *bm=nullptr;
const BindingMapping *bm=nullptr;
if(type==DescriptorSetsType::Material
// ||type==DescriptorSetsType::Texture
||type==DescriptorSetsType::Values) //未来会区分开
bm=&index_by_binding[(size_t)DescriptorSetsType::Values];
||type==DescriptorSetsType::Value) //未来会区分开
bm=&index_by_binding[(size_t)DescriptorSetsType::Value];
else
if(type==DescriptorSetsType::Renderable)
bm=&index_by_binding[(size_t)DescriptorSetsType::Renderable];

View File

@@ -66,6 +66,6 @@ public:
const VkPipelineLayout GetPipelineLayout()const{return pipeline_layout;}
DescriptorSets *Create(const DescriptorSetsType &type);
DescriptorSets *Create(const DescriptorSetsType &type)const;
};//class DescriptorSetLayoutCreater
VK_NAMESPACE_END

View File

@@ -4,9 +4,9 @@
#include<hgl/graph/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN
MaterialParameters::MaterialParameters(Material *m,const DescriptorSetsType &type,DescriptorSets *ds)
MaterialParameters::MaterialParameters(const ShaderModuleMap *smm,const DescriptorSetsType &type,DescriptorSets *ds)
{
material=m;
shader_map=smm;
ds_type=type;
descriptor_sets=ds;
}
@@ -21,7 +21,7 @@ bool MaterialParameters::BindUBO(const AnsiString &name,GPUBuffer *ubo,bool dyna
if(name.IsEmpty()||!ubo)
return(false);
const int index=material->GetUBO(name);
const int index=shader_map->GetUBO(name);
if(index<0)
return(false);
@@ -37,7 +37,7 @@ bool MaterialParameters::BindSSBO(const AnsiString &name,GPUBuffer *ssbo,bool dy
if(name.IsEmpty()||!ssbo)
return(false);
const int index=material->GetSSBO(name);
const int index=shader_map->GetSSBO(name);
if(index<0)
return(false);
@@ -53,7 +53,7 @@ bool MaterialParameters::BindSampler(const AnsiString &name,Texture *tex,Sampler
if(name.IsEmpty()||!tex||!sampler)
return(false);
const int index=material->GetSampler(name);
const int index=shader_map->GetSampler(name);
if(index<0)
return(false);

View File

@@ -50,11 +50,11 @@ IndexBuffer *RenderResource::CreateIBO(IndexType index_type,uint32_t count,const
return(buf);
}
MaterialParameters *RenderResource::CreateMaterialInstance(Material *mtl)
MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl)
{
if(!mtl)return(nullptr);
MaterialParameters *mi=mtl->CreateMP();
MaterialInstance *mi=mtl->CreateInstance();
if(mi)
Add(mi);
@@ -62,7 +62,7 @@ MaterialParameters *RenderResource::CreateMaterialInstance(Material *mtl)
return mi;
}
MaterialParameters *RenderResource::CreateMaterialInstance(const OSString &mtl_filename)
MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_filename)
{
Material *mtl=this->CreateMaterial(mtl_filename);
@@ -96,7 +96,7 @@ TextRenderable *RenderResource::CreateTextRenderable(Material *mtl)
return tr;
}
RenderableInstance *RenderResource::CreateRenderableInstance(Renderable *r,MaterialParameters *mi,Pipeline *p)
RenderableInstance *RenderResource::CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p)
{
if(!p||!mi||!r)
return(nullptr);

View File

@@ -1,11 +1,11 @@
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/VKPipelineData.h>
VK_NAMESPACE_BEGIN
Pipeline *RenderTarget::CreatePipeline(Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
{
if(!mtl)return(nullptr);
@@ -21,14 +21,14 @@ Pipeline *RenderTarget::CreatePipeline(Material *mtl,const InlinePipeline &ip,co
return p;
}
Pipeline *RenderTarget::CreatePipeline(MaterialParameters *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
{
if(!mi)return(nullptr);
return CreatePipeline(mi->GetMaterial(),ip,prim,prim_restart);
}
Pipeline *RenderTarget::CreatePipeline(Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart)
{
pd->Set(prim,prim_restart);
@@ -40,12 +40,12 @@ Pipeline *RenderTarget::CreatePipeline(Material *mtl,PipelineData *pd,const Prim
return(p);
}
Pipeline *RenderTarget::CreatePipeline(MaterialParameters *mi,PipelineData *pd,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart)
{
return CreatePipeline(mi->GetMaterial(),pd,prim,prim_restart);
}
Pipeline *RenderTarget::CreatePipeline(Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart)
{
PipelineData *pd=GetPipelineData(pipeline_filename);
@@ -54,7 +54,7 @@ Pipeline *RenderTarget::CreatePipeline(Material *mtl,const OSString &pipeline_fi
return CreatePipeline(mtl,pd,prim,prim_restart);
}
Pipeline *RenderTarget::CreatePipeline(MaterialParameters *mi,const OSString &filename,const Prim &prim,const bool prim_restart)
Pipeline *RenderTarget::CreatePipeline(const MaterialInstance *mi,const OSString &filename,const Prim &prim,const bool prim_restart)
{
return CreatePipeline(mi->GetMaterial(),filename,prim,prim_restart);
}

View File

@@ -1,4 +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>
@@ -8,13 +9,13 @@ VK_NAMESPACE_BEGIN
using namespace util;
RenderableInstance::RenderableInstance(Renderable *r,MaterialParameters *mi,Pipeline *p,const uint32_t count,VkBuffer *bl,VkDeviceSize *bs)
RenderableInstance::RenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p,const uint32_t count,VkBuffer *bl,VkDeviceSize *bs)
{
render_obj=r;
mat_inst=mi;
pipeline=p;
mat_inst=mi;
descriptor_sets=nullptr;
mp_r=mi->GetMaterial()->CreateMP(DescriptorSetsType::Renderable);
buffer_count=count;
buffer_list=bl;
@@ -28,18 +29,26 @@ RenderableInstance::RenderableInstance(Renderable *r,MaterialParameters *mi,Pipe
RenderableInstance::~RenderableInstance()
{
SAFE_CLEAR(descriptor_sets);
SAFE_CLEAR(mp_r);
//需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码
delete[] buffer_list;
delete[] buffer_size;
}
RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialParameters *mi,Pipeline *p)
MaterialParameters *RenderableInstance::GetMP(const DescriptorSetsType &type)
{
if(type==DescriptorSetsType::Renderable)
return mp_r;
return mat_inst->GetMP(type);
}
RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p)
{
if(!r||!mi||!p)return(nullptr);
Material *mtl=mi->GetMaterial();
const Material *mtl=mi->GetMaterial();
if(!mtl)return(nullptr);