Moved vab_map_list and ibo_map from PrimitiveCreater to PrimitiveData
This commit is contained in:
parent
0a025f0464
commit
7b0a185a45
@ -25,17 +25,13 @@ protected:
|
|||||||
|
|
||||||
uint32_t vertices_number; ///<顶点数量
|
uint32_t vertices_number; ///<顶点数量
|
||||||
|
|
||||||
VABMap * vab_map_list;
|
|
||||||
|
|
||||||
uint32_t index_number; ///<索引数量
|
uint32_t index_number; ///<索引数量
|
||||||
IndexType index_type; ///<索引类型
|
IndexType index_type; ///<索引类型
|
||||||
IndexBuffer * ibo; ///<索引缓冲区
|
IndexBuffer * ibo; ///<索引缓冲区
|
||||||
|
|
||||||
IBMap ibo_map;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
const int GetVABIndex (const AnsiString &name); ///<取得顶点属性索引
|
const int InitVAB(const AnsiString &name,const VkFormat format,const void *data); ///<取得顶点属性索引
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -60,9 +56,9 @@ public: //顶点缓冲区
|
|||||||
|
|
||||||
const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量
|
const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量
|
||||||
|
|
||||||
VABMap * MapVAB (const AnsiString &name);
|
VABMap * MapVAB (const AnsiString &name,const VkFormat format=VK_FORMAT_UNDEFINED);
|
||||||
|
|
||||||
bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data); ///<直接写入顶点属性数据
|
bool WriteVAB (const AnsiString &name,const VkFormat format,const void *data); ///<直接写入顶点属性数据
|
||||||
|
|
||||||
public: //索引缓冲区
|
public: //索引缓冲区
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
|
|
||||||
const IndexType GetType()const{return buffer->GetType();}
|
const IndexType GetType()const{return buffer->GetType();}
|
||||||
|
|
||||||
void Set(IndexBuffer *ib,const int32_t index_offset,const uint32_t count)
|
void SetIBO(IndexBuffer *ib,const int32_t index_offset,const uint32_t count)
|
||||||
{
|
{
|
||||||
VKBufferMap<IndexBuffer>::Set(ib,index_offset,ib->GetStride(),count);
|
VKBufferMap<IndexBuffer>::Set(ib,index_offset,ib->GetStride(),count);
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
|
|
||||||
const VkFormat GetFormat()const { return buffer->GetFormat(); }
|
const VkFormat GetFormat()const { return buffer->GetFormat(); }
|
||||||
|
|
||||||
void Set(VAB *vab,const VkDeviceSize off,const uint32_t count)
|
void SetVAB(VAB *vab,const VkDeviceSize off,const uint32_t count)
|
||||||
{
|
{
|
||||||
VKBufferMap<VAB>::Set(vab,off,vab->GetStride(),count);
|
VKBufferMap<VAB>::Set(vab,off,vab->GetStride(),count);
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,6 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v)
|
|||||||
|
|
||||||
prim_data =nullptr;
|
prim_data =nullptr;
|
||||||
|
|
||||||
vab_map_list =new VABMap[v->GetVertexAttribCount()];
|
|
||||||
|
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,7 +28,6 @@ PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm)
|
|||||||
|
|
||||||
PrimitiveCreater::~PrimitiveCreater()
|
PrimitiveCreater::~PrimitiveCreater()
|
||||||
{
|
{
|
||||||
delete[] vab_map_list;
|
|
||||||
SAFE_CLEAR(prim_data);
|
SAFE_CLEAR(prim_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,8 +91,6 @@ bool PrimitiveCreater::Init(const AnsiString &pname,const uint32_t vertex_count,
|
|||||||
delete prim_data;
|
delete prim_data;
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ibo_map.Set(ibo,prim_data->GetFirstIndex(),index_number);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if(!vdm)
|
if(!vdm)
|
||||||
@ -116,75 +111,72 @@ bool PrimitiveCreater::Init(const AnsiString &pname,const uint32_t vertex_count,
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int PrimitiveCreater::GetVABIndex(const AnsiString &name)
|
const int PrimitiveCreater::InitVAB(const AnsiString &name,const VkFormat format,const void *data)
|
||||||
{
|
{
|
||||||
if(!prim_data)return(-1);
|
if(!prim_data)return(-1);
|
||||||
|
|
||||||
const int vab_index=prim_data->GetVABIndex(name);
|
const int vab_index=prim_data->GetVABIndex(name);
|
||||||
|
|
||||||
if(vab_index<0)
|
if(vab_index<0||vab_index>=vil->GetVertexAttribCount())
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
|
if(format!=VK_FORMAT_UNDEFINED)
|
||||||
|
{
|
||||||
|
const VIF *vif=vil->GetConfig(vab_index);
|
||||||
|
|
||||||
|
if(vif->format!=format)
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
|
||||||
VAB *vab=prim_data->GetVAB(vab_index);
|
VAB *vab=prim_data->GetVAB(vab_index);
|
||||||
|
|
||||||
if(!vab)
|
if(!vab)
|
||||||
{
|
{
|
||||||
vab=prim_data->InitVAB(vab_index,nullptr);
|
vab=prim_data->InitVAB(vab_index,data);
|
||||||
|
|
||||||
if(vab)
|
if(!vab)
|
||||||
vab_map_list[vab_index].Set(vab,
|
return(-1);
|
||||||
prim_data->GetVertexOffset(),
|
|
||||||
vertices_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!vab)
|
#ifdef _DEBUG
|
||||||
return(-1);
|
if (!vdm)
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
if (!vdm)
|
|
||||||
{
|
|
||||||
DebugUtils *du=device->GetDebugUtils();
|
|
||||||
|
|
||||||
if (du)
|
|
||||||
{
|
{
|
||||||
du->SetBuffer(vab->GetBuffer(), prim_name+":VAB:Buffer:"+name);
|
DebugUtils *du=device->GetDebugUtils();
|
||||||
du->SetDeviceMemory(vab->GetVkMemory(), prim_name+":VAB:Memory:"+name);
|
|
||||||
|
if (du)
|
||||||
|
{
|
||||||
|
du->SetBuffer(vab->GetBuffer(), prim_name+":VAB:Buffer:"+name);
|
||||||
|
du->SetDeviceMemory(vab->GetVkMemory(), prim_name+":VAB:Memory:"+name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif//_DEBUG
|
||||||
}
|
}
|
||||||
#endif//_DEBUG
|
|
||||||
|
|
||||||
return(vab_index);
|
return(vab_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
VABMap *PrimitiveCreater::MapVAB(const AnsiString &name)
|
VABMap *PrimitiveCreater::MapVAB(const AnsiString &name,const VkFormat format)
|
||||||
{
|
{
|
||||||
const int vab_index=GetVABIndex(name);
|
const int vab_index=InitVAB(name,format,nullptr);
|
||||||
|
|
||||||
if(vab_index<0)return nullptr;
|
if(vab_index<0)return nullptr;
|
||||||
|
|
||||||
return vab_map_list+vab_index;
|
return prim_data->GetVABMap(vab_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat &format, const void *data)
|
bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat format,const void *data)
|
||||||
{
|
{
|
||||||
if(!prim_data)return(false);
|
if(!prim_data)return(false);
|
||||||
|
if(!data)return(false);
|
||||||
|
|
||||||
const int vab_index=GetVABIndex(name);
|
return InitVAB(name,format,data)>0;
|
||||||
|
|
||||||
VAB *vab=prim_data->GetVAB(vab_index);
|
|
||||||
|
|
||||||
if(!vab)
|
|
||||||
return(false);
|
|
||||||
|
|
||||||
return vab->Write(data,prim_data->GetVertexOffset(),vertices_number);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IBMap *PrimitiveCreater::MapIBO()
|
IBMap *PrimitiveCreater::MapIBO()
|
||||||
{
|
{
|
||||||
if(!ibo)
|
if(!prim_data)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
return &ibo_map;
|
return prim_data->MapIBO();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrimitiveCreater::WriteIBO(const void *data,const uint32_t count)
|
bool PrimitiveCreater::WriteIBO(const void *data,const uint32_t count)
|
||||||
@ -205,10 +197,7 @@ Primitive *PrimitiveCreater::Create()
|
|||||||
if(!prim_data)
|
if(!prim_data)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
for(uint32_t i=0;i<vil->GetVertexAttribCount();i++)
|
prim_data->UnmapAll();
|
||||||
vab_map_list[i].Clear();
|
|
||||||
|
|
||||||
ibo_map.Clear();
|
|
||||||
|
|
||||||
Primitive *primitive=new Primitive(prim_name,prim_data);
|
Primitive *primitive=new Primitive(prim_name,prim_data);
|
||||||
|
|
||||||
|
@ -14,12 +14,14 @@ PrimitiveData::PrimitiveData(const VIL *_vil,const uint32_t vc)
|
|||||||
vertex_count=vc;
|
vertex_count=vc;
|
||||||
|
|
||||||
vab_list=hgl_zero_new<VAB *>(_vil->GetVertexAttribCount());
|
vab_list=hgl_zero_new<VAB *>(_vil->GetVertexAttribCount());
|
||||||
|
vab_map_list=new VABMap[_vil->GetVertexAttribCount()];
|
||||||
|
|
||||||
ibo=nullptr;
|
ibo=nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrimitiveData::~PrimitiveData()
|
PrimitiveData::~PrimitiveData()
|
||||||
{
|
{
|
||||||
|
delete[] vab_map_list;
|
||||||
delete[] vab_list; //注意:这里并不释放VAB,在派生类中释放
|
delete[] vab_list; //注意:这里并不释放VAB,在派生类中释放
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,6 +44,73 @@ VAB *PrimitiveData::GetVAB(const int index)
|
|||||||
return vab_list[index];
|
return vab_list[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VAB *PrimitiveData::InitVAB(const int vab_index,const void *data)
|
||||||
|
{
|
||||||
|
if(!vil)return(nullptr);
|
||||||
|
|
||||||
|
if(vab_index<0||vab_index>=vil->GetVertexAttribCount())
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const VertexInputFormat *vif=vil->GetConfig(vab_index);
|
||||||
|
|
||||||
|
if(!vif)return(nullptr);
|
||||||
|
|
||||||
|
if(!vab_list[vab_index])
|
||||||
|
{
|
||||||
|
vab_list[vab_index]=CreateVAB(vab_index,vif->format,data);
|
||||||
|
|
||||||
|
if(!vab_list[vab_index])
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vab_map_list[vab_index].Write(data,vertex_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
return vab_list[vab_index];
|
||||||
|
}
|
||||||
|
|
||||||
|
VABMap *PrimitiveData::GetVABMap(const int vab_index)
|
||||||
|
{
|
||||||
|
if(vab_index<0||vab_index>=vil->GetVertexAttribCount())return nullptr;
|
||||||
|
|
||||||
|
VABMap *vab_map=vab_map_list+vab_index;
|
||||||
|
|
||||||
|
if(!vab_map->IsValid())
|
||||||
|
{
|
||||||
|
if(!vab_list[vab_index])
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
vab_map->SetVAB(vab_list[vab_index],GetVertexOffset(),vertex_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
return vab_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexBuffer *PrimitiveData::InitIBO(const uint32_t ic,IndexType it)
|
||||||
|
{
|
||||||
|
if(ibo)delete ibo;
|
||||||
|
|
||||||
|
ibo=CreateIBO(ic,it);
|
||||||
|
|
||||||
|
if(!ibo)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
index_count=ic;
|
||||||
|
|
||||||
|
ibo_map.SetIBO(ibo,GetFirstIndex(),index_count);
|
||||||
|
|
||||||
|
return(ibo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrimitiveData::UnmapAll()
|
||||||
|
{
|
||||||
|
for(int i=0;i<vil->GetVertexAttribCount();i++)
|
||||||
|
vab_map_list[i].Unmap();
|
||||||
|
|
||||||
|
ibo_map.Unmap();
|
||||||
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -81,48 +150,18 @@ namespace
|
|||||||
delete ibo;
|
delete ibo;
|
||||||
}
|
}
|
||||||
|
|
||||||
IndexBuffer *InitIBO(const uint32_t ic,IndexType it) override
|
IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it) override
|
||||||
{
|
{
|
||||||
if(!device)return(nullptr);
|
if(!device)return(nullptr);
|
||||||
|
|
||||||
if(ibo)delete ibo;
|
return device->CreateIBO(it,ic);
|
||||||
|
|
||||||
ibo=device->CreateIBO(it,ic);
|
|
||||||
|
|
||||||
if(!ibo)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
index_count=ic;
|
|
||||||
|
|
||||||
return(ibo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VAB *InitVAB(const int vab_index,const void *data)
|
VAB *CreateVAB(const int vab_index,const VkFormat format,const void *data) override
|
||||||
{
|
{
|
||||||
if(!device)return(nullptr);
|
if(!device)return(nullptr);
|
||||||
if(!vil)return(nullptr);
|
|
||||||
|
|
||||||
if(vab_index<0||vab_index>=vil->GetVertexAttribCount())
|
return device->CreateVAB(format,vertex_count,data);
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const VertexInputFormat *vif=vil->GetConfig(vab_index);
|
|
||||||
|
|
||||||
if(!vif)return(nullptr);
|
|
||||||
|
|
||||||
if(!vab_list[vab_index])
|
|
||||||
{
|
|
||||||
vab_list[vab_index]=device->CreateVAB(vif->format,vertex_count,data);
|
|
||||||
|
|
||||||
if(!vab_list[vab_index])
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vab_list[vab_index]&&data)
|
|
||||||
{
|
|
||||||
vab_list[vab_index]->Write(data,vertex_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
return vab_list[vab_index];
|
|
||||||
}
|
}
|
||||||
};//class PrimitiveDataPrivateBuffer:public PrimitiveData
|
};//class PrimitiveDataPrivateBuffer:public PrimitiveData
|
||||||
|
|
||||||
@ -161,10 +200,10 @@ namespace
|
|||||||
vdm->ReleaseVAB(vab_node);
|
vdm->ReleaseVAB(vab_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
IndexBuffer *InitIBO(const uint32_t ic,IndexType it) override
|
IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it) override
|
||||||
{
|
{
|
||||||
if(ic<=0)return(nullptr);
|
if(!vdm)
|
||||||
if(!vdm)return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
if(!ib_node)
|
if(!ib_node)
|
||||||
{
|
{
|
||||||
@ -172,39 +211,21 @@ namespace
|
|||||||
|
|
||||||
if(!ib_node)
|
if(!ib_node)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
ibo=vdm->GetIBO();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
index_count=ic;
|
return vdm->GetIBO();
|
||||||
|
|
||||||
return ibo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VAB *InitVAB(const int vab_index,const void *data)
|
VAB *CreateVAB(const int vab_index,const VkFormat format,const void *data) override
|
||||||
{
|
{
|
||||||
if(!vdm)return(nullptr);
|
VAB *vab=vdm->GetVAB(vab_index);
|
||||||
if(!vil)return(nullptr);
|
|
||||||
|
|
||||||
if (vab_index<0||vab_index>=vil->GetVertexAttribCount())
|
if(!vab)return(nullptr);
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const VertexInputFormat *vif=vil->GetConfig(vab_index);
|
if(data)
|
||||||
|
vab->Write(data,vab_node->GetStart(),vertex_count);
|
||||||
|
|
||||||
if(!vif)return(nullptr);
|
return vab;
|
||||||
|
|
||||||
if (!vab_list[vab_index])
|
|
||||||
{
|
|
||||||
vab_list[vab_index]=vdm->GetVAB(vab_index);
|
|
||||||
|
|
||||||
if(!vab_list[vab_index])
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vab_list[vab_index]&&data)
|
|
||||||
vab_list[vab_index]->Write(data,vab_node->GetStart(),vertex_count);
|
|
||||||
|
|
||||||
return vab_list[vab_index];
|
|
||||||
}
|
}
|
||||||
};//class PrimitiveDataVDM:public PrimitiveData
|
};//class PrimitiveDataVDM:public PrimitiveData
|
||||||
}//namespace
|
}//namespace
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
#include<hgl/graph/VK.h>
|
#pragma once
|
||||||
|
|
||||||
|
#include<hgl/graph/VKIndexBuffer.h>
|
||||||
|
#include<hgl/graph/VKVertexAttribBuffer.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
/*
|
/*
|
||||||
@ -25,7 +28,16 @@ protected:
|
|||||||
uint32_t index_count;
|
uint32_t index_count;
|
||||||
|
|
||||||
VAB ** vab_list;
|
VAB ** vab_list;
|
||||||
IndexBuffer * ibo;
|
VABMap * vab_map_list;
|
||||||
|
|
||||||
|
virtual VAB * CreateVAB(const int vab_index,const VkFormat format,const void *data)=0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
IndexBuffer * ibo;
|
||||||
|
IBMap ibo_map;
|
||||||
|
|
||||||
|
virtual IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it)=0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -37,21 +49,23 @@ public:
|
|||||||
const uint32_t GetVertexCount ()const{return vertex_count;}
|
const uint32_t GetVertexCount ()const{return vertex_count;}
|
||||||
const int GetVABCount ()const;
|
const int GetVABCount ()const;
|
||||||
const int GetVABIndex (const AnsiString &name)const;
|
const int GetVABIndex (const AnsiString &name)const;
|
||||||
VAB * GetVAB (const int index);
|
|
||||||
VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));}
|
|
||||||
|
|
||||||
|
VAB * GetVAB (const int index);
|
||||||
|
VAB * InitVAB (const int vab_index,const void *data);
|
||||||
|
VABMap * GetVABMap (const int vab_index);
|
||||||
|
|
||||||
|
IndexBuffer * InitIBO(const uint32_t index_count,IndexType it);
|
||||||
IndexBuffer * GetIBO (){return ibo;}
|
IndexBuffer * GetIBO (){return ibo;}
|
||||||
|
IBMap * MapIBO (){return &ibo_map;}
|
||||||
uint32_t GetIndexCount ()const{return index_count;}
|
uint32_t GetIndexCount ()const{return index_count;}
|
||||||
|
|
||||||
virtual int32_t GetVertexOffset ()const=0; ///<取得顶点偏移(注意是顶点不是字节)
|
virtual int32_t GetVertexOffset ()const=0; ///<取得顶点偏移(注意是顶点不是字节)
|
||||||
virtual uint32_t GetFirstIndex ()const=0; ///<取得第一个索引
|
virtual uint32_t GetFirstIndex ()const=0; ///<取得第一个索引
|
||||||
|
|
||||||
virtual VertexDataManager * GetVDM()const=0; ///<取得顶点数据管理器
|
virtual VertexDataManager * GetVDM()const=0; ///<取得顶点数据管理器
|
||||||
|
|
||||||
public:
|
void UnmapAll();
|
||||||
|
|
||||||
virtual IndexBuffer * InitIBO(const uint32_t index_count,IndexType it)=0;
|
|
||||||
virtual VAB * InitVAB(const int vab_index,const void *data)=0;
|
|
||||||
};//class PrimitiveData
|
};//class PrimitiveData
|
||||||
|
|
||||||
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const uint32_t vc);
|
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const uint32_t vc);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user