used ActiveMemoryBlockManager to manage data of material instances in Material class.
This commit is contained in:
parent
164498446a
commit
902dc20340
2
CMCore
2
CMCore
@ -1 +1 @@
|
|||||||
Subproject commit 6a21b387f52699840fc6245291bcc93a3a797a6a
|
Subproject commit 21e59f0337a3637e646529611f84fa646cb1d9e0
|
@ -1 +1 @@
|
|||||||
Subproject commit 2ad618e1ffd27bfe8df2b966e1cb8049fa9d114b
|
Subproject commit 5e8b83cce4529e6401de59ec010e2ef68b634150
|
2
CMUtil
2
CMUtil
@ -1 +1 @@
|
|||||||
Subproject commit ff819d8a60753269343a3f87777ee03ae5071cb4
|
Subproject commit c0990c52ebbc2a19b661a3d6fd64891d05e59305
|
@ -57,15 +57,15 @@ private:
|
|||||||
|
|
||||||
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
|
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
|
||||||
|
|
||||||
/* for(uint i=0;i<6;i++)
|
for(uint i=0;i<6;i++)
|
||||||
{
|
{
|
||||||
material_instance[i]=db->CreateMaterialInstance(mci);
|
material_instance[i]=db->CreateMaterialInstance(mci);
|
||||||
|
|
||||||
if(!material_instance[i])
|
if(!material_instance[i])
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
material_instance[i]->SetFloat4(0,color_data[i]);
|
material_instance[i]->WriteMIData(color_data[i],sizeof(float)*4); //设置MaterialInstance的数据
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
|
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
|
||||||
|
@ -6,6 +6,11 @@
|
|||||||
#include<hgl/type/String.h>
|
#include<hgl/type/String.h>
|
||||||
#include<hgl/graph/VKShaderModuleMap.h>
|
#include<hgl/graph/VKShaderModuleMap.h>
|
||||||
#include<hgl/graph/VKDescriptorSetType.h>
|
#include<hgl/graph/VKDescriptorSetType.h>
|
||||||
|
|
||||||
|
namespace hgl
|
||||||
|
{
|
||||||
|
class ActiveMemoryBlockManager;
|
||||||
|
}
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
|
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
|
||||||
|
|
||||||
@ -30,15 +35,17 @@ class Material
|
|||||||
MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
|
MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT];
|
||||||
|
|
||||||
uint32_t mi_data_bytes; ///<实例数据大小
|
uint32_t mi_data_bytes; ///<实例数据大小
|
||||||
uint32_t mi_max_count; ///<最大实例数量(注:代表一次drawcall大小,而不是整个的大小)
|
|
||||||
|
ActiveMemoryBlockManager *mi_data_manager;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
friend class RenderResource;
|
friend class RenderResource;
|
||||||
|
|
||||||
|
Material(const AnsiString &);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Material(const AnsiString &);
|
|
||||||
virtual ~Material();
|
virtual ~Material();
|
||||||
|
|
||||||
const UTF8String & GetName ()const{return name;}
|
const UTF8String & GetName ()const{return name;}
|
||||||
@ -69,7 +76,9 @@ public:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
const uint32_t GetMIDataBytes ()const{return mi_data_bytes;}
|
const uint32_t GetMIDataBytes ()const{return mi_data_bytes;}
|
||||||
const uint32_t GetMIMaxCount ()const{return mi_max_count;}
|
|
||||||
|
void ReleaseMI(int); ///<释放材质实例
|
||||||
|
void *GetMIData(int); ///<取得指定ID号的材质实例数据访问指针
|
||||||
|
|
||||||
MaterialInstance *CreateMI(const VILConfig *vil_cfg=nullptr);
|
MaterialInstance *CreateMI(const VILConfig *vil_cfg=nullptr);
|
||||||
};//class Material
|
};//class Material
|
||||||
|
@ -50,6 +50,8 @@ protected:
|
|||||||
|
|
||||||
VIL *vil;
|
VIL *vil;
|
||||||
|
|
||||||
|
int mi_id;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Material * GetMaterial () {return material;}
|
Material * GetMaterial () {return material;}
|
||||||
@ -60,11 +62,17 @@ private:
|
|||||||
|
|
||||||
friend class Material;
|
friend class Material;
|
||||||
|
|
||||||
MaterialInstance(Material *,VIL *);
|
MaterialInstance(Material *,VIL *,const int);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~MaterialInstance()=default;
|
virtual ~MaterialInstance()
|
||||||
|
{
|
||||||
|
material->ReleaseMI(mi_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *GetMIData(){return material->GetMIData(mi_id);}
|
||||||
|
void WriteMIData(const void *data,const int size);
|
||||||
|
|
||||||
bool BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
bool BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
||||||
bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#include<hgl/graph/VKMaterialDescriptorManager.h>
|
#include<hgl/graph/VKMaterialDescriptorManager.h>
|
||||||
#include<hgl/graph/VKVertexInput.h>
|
#include<hgl/graph/VKVertexInput.h>
|
||||||
#include"VKPipelineLayoutData.h"
|
#include"VKPipelineLayoutData.h"
|
||||||
|
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
Material::Material(const AnsiString &n)
|
Material::Material(const AnsiString &n)
|
||||||
{
|
{
|
||||||
@ -16,11 +18,13 @@ Material::Material(const AnsiString &n)
|
|||||||
hgl_zero(mp_array);
|
hgl_zero(mp_array);
|
||||||
|
|
||||||
mi_data_bytes=0;
|
mi_data_bytes=0;
|
||||||
mi_max_count=0;
|
mi_data_manager=nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Material::~Material()
|
Material::~Material()
|
||||||
{
|
{
|
||||||
|
SAFE_CLEAR(mi_data_manager);
|
||||||
|
|
||||||
SAFE_CLEAR(vertex_input);
|
SAFE_CLEAR(vertex_input);
|
||||||
delete shader_maps; //不用SAFE_CLEAR是因为这个一定会有
|
delete shader_maps; //不用SAFE_CLEAR是因为这个一定会有
|
||||||
SAFE_CLEAR(desc_manager);
|
SAFE_CLEAR(desc_manager);
|
||||||
@ -28,9 +32,6 @@ Material::~Material()
|
|||||||
|
|
||||||
for(int i=0;i<DESCRIPTOR_SET_TYPE_COUNT;i++)
|
for(int i=0;i<DESCRIPTOR_SET_TYPE_COUNT;i++)
|
||||||
SAFE_CLEAR(mp_array[i]);
|
SAFE_CLEAR(mp_array[i]);
|
||||||
|
|
||||||
mi_data_bytes=0;
|
|
||||||
mi_max_count=0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const VkPipelineLayout Material::GetPipelineLayout()const
|
const VkPipelineLayout Material::GetPipelineLayout()const
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include<hgl/graph/VKMaterialInstance.h>
|
#include<hgl/graph/VKMaterialInstance.h>
|
||||||
#include<hgl/graph/VKMaterialParameters.h>
|
#include<hgl/graph/VKMaterialParameters.h>
|
||||||
#include<hgl/graph/VKShaderModule.h>
|
#include<hgl/graph/VKShaderModule.h>
|
||||||
|
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg)
|
MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg)
|
||||||
@ -10,14 +11,48 @@ MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg)
|
|||||||
|
|
||||||
if(!vil)return(nullptr);
|
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;
|
material=mtl;
|
||||||
|
|
||||||
vil=v;
|
vil=v;
|
||||||
|
|
||||||
|
mi_id=id;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic)
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include<hgl/io/ConstBufferReader.h>
|
#include<hgl/io/ConstBufferReader.h>
|
||||||
#include<hgl/shadergen/MaterialCreateInfo.h>
|
#include<hgl/shadergen/MaterialCreateInfo.h>
|
||||||
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
||||||
|
#include<hgl/type/ActiveMemoryBlockManager.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@ -145,7 +146,12 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mtl->mi_data_bytes =mci->GetMIDataBytes();
|
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);
|
Add(mtl);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user