used ActiveMemoryBlockManager to manage data of material instances in Material class.
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
#include<hgl/graph/VKMaterialDescriptorManager.h>
|
||||
#include<hgl/graph/VKVertexInput.h>
|
||||
#include"VKPipelineLayoutData.h"
|
||||
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
Material::Material(const AnsiString &n)
|
||||
{
|
||||
@@ -16,11 +18,13 @@ Material::Material(const AnsiString &n)
|
||||
hgl_zero(mp_array);
|
||||
|
||||
mi_data_bytes=0;
|
||||
mi_max_count=0;
|
||||
mi_data_manager=nullptr;
|
||||
}
|
||||
|
||||
Material::~Material()
|
||||
{
|
||||
SAFE_CLEAR(mi_data_manager);
|
||||
|
||||
SAFE_CLEAR(vertex_input);
|
||||
delete shader_maps; //不用SAFE_CLEAR是因为这个一定会有
|
||||
SAFE_CLEAR(desc_manager);
|
||||
@@ -28,9 +32,6 @@ Material::~Material()
|
||||
|
||||
for(int i=0;i<DESCRIPTOR_SET_TYPE_COUNT;i++)
|
||||
SAFE_CLEAR(mp_array[i]);
|
||||
|
||||
mi_data_bytes=0;
|
||||
mi_max_count=0;
|
||||
}
|
||||
|
||||
const VkPipelineLayout Material::GetPipelineLayout()const
|
||||
|
@@ -2,6 +2,7 @@
|
||||
#include<hgl/graph/VKMaterialInstance.h>
|
||||
#include<hgl/graph/VKMaterialParameters.h>
|
||||
#include<hgl/graph/VKShaderModule.h>
|
||||
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg)
|
||||
@@ -10,14 +11,48 @@ MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg)
|
||||
|
||||
if(!vil)return(nullptr);
|
||||
|
||||
return(new MaterialInstance(this,vil));
|
||||
int mi_id=-1;
|
||||
|
||||
if(mi_data_manager)
|
||||
mi_data_manager->GetOrCreate(&mi_id,1);
|
||||
else
|
||||
mi_id=-1;
|
||||
|
||||
return(new MaterialInstance(this,vil,mi_id));
|
||||
}
|
||||
|
||||
MaterialInstance::MaterialInstance(Material *mtl,VIL *v)
|
||||
void Material::ReleaseMI(int mi_id)
|
||||
{
|
||||
if(mi_id<0||!mi_data_manager)return;
|
||||
|
||||
mi_data_manager->Release(&mi_id,1);
|
||||
}
|
||||
|
||||
void *Material::GetMIData(int id)
|
||||
{
|
||||
if(!mi_data_manager)
|
||||
return(nullptr);
|
||||
|
||||
return mi_data_manager->GetData(id);
|
||||
}
|
||||
|
||||
void MaterialInstance::WriteMIData(const void *data,const int size)
|
||||
{
|
||||
if(!data||size<=0||size>material->GetMIDataBytes())return;
|
||||
|
||||
void *tp=GetMIData();
|
||||
|
||||
if(tp)
|
||||
memcpy(tp,data,size);
|
||||
}
|
||||
|
||||
MaterialInstance::MaterialInstance(Material *mtl,VIL *v,const int id)
|
||||
{
|
||||
material=mtl;
|
||||
|
||||
vil=v;
|
||||
|
||||
mi_id=id;
|
||||
}
|
||||
|
||||
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#include<hgl/io/ConstBufferReader.h>
|
||||
#include<hgl/shadergen/MaterialCreateInfo.h>
|
||||
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
||||
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
@@ -145,7 +146,12 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
|
||||
}
|
||||
|
||||
mtl->mi_data_bytes =mci->GetMIDataBytes();
|
||||
mtl->mi_max_count =mci->GetMIMaxCount();
|
||||
//mtl->mi_max_count =mci->GetMIMaxCount();
|
||||
|
||||
if(mtl->mi_data_bytes>0)
|
||||
{
|
||||
mtl->mi_data_manager=new ActiveMemoryBlockManager(mtl->mi_data_bytes);
|
||||
}
|
||||
|
||||
Add(mtl);
|
||||
|
||||
|
Reference in New Issue
Block a user