newly Primitive/PrimitiveData/PrimitiveCreater, and test OK! can RUN!

This commit is contained in:
2024-05-25 01:46:19 +08:00
parent 78b1982849
commit 299d3bd019
10 changed files with 286 additions and 289 deletions

View File

@@ -3,6 +3,7 @@
#include<hgl/graph/VKShaderModule.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
#include"VKPrimitiveData.h"
#ifdef _DEBUG
#include<hgl/graph/VKDevice.h>
@@ -11,65 +12,6 @@
VK_NAMESPACE_BEGIN
const VkDeviceSize GetVertexCount( PrimitiveData *pd);
const int GetVABCount( PrimitiveData *pd);
VABAccess * GetVABAccess( PrimitiveData *pd,const AnsiString &name);
IBAccess * GetIBAccess( PrimitiveData *pd);
void Destory( PrimitiveData *pd);
void Free( PrimitiveData *pd);
class PrimitivePrivateBuffer:public Primitive
{
public:
using Primitive::Primitive;
~PrimitivePrivateBuffer() override
{
Destory(prim_data);
}
friend Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *);
};//class PrimitivePrivateBuffer
class PrimitiveVDM:public Primitive
{
VertexDataManager *vdm;
public:
PrimitiveVDM(VertexDataManager *_vdm,const AnsiString &pn,PrimitiveData *pd):Primitive(pn,pd)
{
vdm=_vdm;
}
~PrimitiveVDM() override
{
Free(prim_data);
}
friend Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *);
};//class PrimitiveVDM;
Primitive *CreatePrimitivePrivate(const AnsiString &name,PrimitiveData *pd)
{
if(!pd)return(nullptr);
if(name.IsEmpty())return(nullptr);
return(new PrimitivePrivateBuffer(name,pd));
}
Primitive *CreatePrimitivePrivate(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd)
{
if(!vdm)return(nullptr);
if(!pd)return(nullptr);
if(name.IsEmpty())return(nullptr);
return(new PrimitiveVDM(vdm,name,pd));
}
//bool Renderable::Set(const int stage_input_binding,VIL *vil,VkDeviceSize offset)
//{
// if(stage_input_binding<0||stage_input_binding>=buf_count||!vil)return(false);
@@ -88,24 +30,35 @@ Primitive *CreatePrimitivePrivate(VertexDataManager *vdm,const AnsiString &name,
// return(true);
//}
const VkDeviceSize Primitive::GetVertexCount()const
Primitive::Primitive(const AnsiString &pn,PrimitiveData *pd)
{
return VK_NAMESPACE::GetVertexCount(prim_data);
prim_name=pn;
prim_data=pd;
}
const int Primitive::GetVACount()const
Primitive::~Primitive()
{
return GetVABCount(prim_data);
SAFE_CLEAR(prim_data);
}
const VkDeviceSize Primitive::GetVertexCount()const
{
return prim_data->GetVertexCount();
}
const int Primitive::GetVABCount()const
{
return prim_data->GetVABCount();
}
VABAccess *Primitive::GetVABAccess(const AnsiString &name)
{
return VK_NAMESPACE::GetVABAccess(prim_data,name);
return prim_data->GetVABAccess(name);
}
IBAccess *Primitive::GetIBAccess()
{
return VK_NAMESPACE::GetIBAccess(prim_data);
return prim_data->GetIBAccess();
}
VK_NAMESPACE_END

View File

@@ -1,122 +1,55 @@
#include"VKPrimitiveData.h"
#include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
struct PrimitiveData
PrimitiveData::PrimitiveData(const VIL *_vil,const VkDeviceSize vc)
{
const VIL * vil;
vil=_vil;
VkDeviceSize vertex_count;
/*
1.<2E><>ֹ2024.4.27<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vulkan.gpuinfo.orgͳ<67>ƣ<EFBFBD>ֻ<EFBFBD><D6BB>9%<25><><EFBFBD>豸maxVertexInputAttributesΪ16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>16<31><36><EFBFBD><EFBFBD><E8B1B8>
9.0%<25><><EFBFBD>豸Ϊ28 - 31
70.7%<25><><EFBFBD>豸Ϊ32
9.6%<25><><EFBFBD>豸Ϊ64
vertex_count=vc;
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱû<CAB1>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<D2AA><CAB9>16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʹ<EFBFBD><CAB9>16<31><36>
(<28><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ٴβ<D9B4>ѯ<EFBFBD><D1AF>ֵ<EFBFBD>Ƿ<EFBFBD><C7B7>ɸijɸ<C4B3><C9B8>ߵ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>Լ<EFBFBD><D4BC>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ)
vab_access=hgl_zero_new<VABAccess>(_vil->GetCount());
2.Ϊ<><CEAA>va_nameʹ<65><CAB9>char[][]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>String<6E>Լ<EFBFBD><D4BC><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ڴ棿
<20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>˱رܶ<D8B1>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>memcpy<70><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ˴<D4B4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
VABAccess vab_access[HGL_MAX_VERTEX_ATTRIB_COUNT];
IBAccess ib_access;
};//struct PrimitiveData
PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc)
{
if(!_vil)return(nullptr);
if(vc<=0)return(nullptr);
PrimitiveData *pd=hgl_zero_new<PrimitiveData>();
pd->vil =_vil;
pd->vertex_count=vc;
return(pd);
hgl_zero(ib_access);
}
void Free(PrimitiveData *pd)
PrimitiveData::~PrimitiveData()
{
if(!pd)return;
delete pd;
SAFE_CLEAR_ARRAY(vab_access); //注意这里并不释放VAB在派生类中释放
}
void Destory(PrimitiveData *pd)
const int PrimitiveData::GetVABCount()const
{
if(!pd)return;
VABAccess *vab=pd->vab_access;
for(uint32_t i=0;i<pd->vil->GetCount();i++)
{
if(vab->vab)
{
delete vab->vab;
vab->vab=nullptr;
}
++vab;
}
if(pd->ib_access.buffer)
{
delete pd->ib_access.buffer;
pd->ib_access.buffer=nullptr;
}
delete pd;
return vil->GetCount();
}
const VkDeviceSize GetVertexCount(PrimitiveData *pd)
const int PrimitiveData::GetVABIndex(const AnsiString &name) const
{
if(!pd)return(0);
return pd->vertex_count;
}
const int GetVABCount(PrimitiveData *pd)
{
if(!pd)return(-1);
if(!pd->vil)return(-2);
return pd->vil->GetCount();
}
int GetVABIndex(const PrimitiveData *pd,const AnsiString &name)
{
if(!pd)return(-1);
if(!pd->vil)return(-1);
if(name.IsEmpty())return(-1);
return pd->vil->GetIndex(name);
return vil->GetIndex(name);
}
VABAccess *GetVABAccess(PrimitiveData *pd,const int index)
VABAccess *PrimitiveData::GetVABAccess(const int index)
{
if(!pd)return(nullptr);
if(!pd->vil)return(nullptr);
if(index<0||index>=pd->vil->GetCount())return(nullptr);
if(index<0||index>=vil->GetCount())return(nullptr);
return pd->vab_access+index;
return vab_access+index;
}
VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name)
VABAccess *PrimitiveData::GetVABAccess(const AnsiString &name)
{
if(!pd)return(nullptr);
if(!pd->vil)return(nullptr);
if(name.IsEmpty())return(nullptr);
const int index=pd->vil->GetIndex(name);
const int index=vil->GetIndex(name);
if(index<0)return(nullptr);
return pd->vab_access+index;
return vab_access+index;
}
//VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count)
@@ -153,11 +86,125 @@ VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name)
// pd->ib_access.count=ic;
//}
IBAccess *GetIBAccess(PrimitiveData *pd)
namespace
{
if(!pd)return(nullptr);
/**
* 直接使用GPUDevice创建VAB/IBO,并在释构时释放
*/
class PrimitiveDataPrivateBuffer:public PrimitiveData
{
GPUDevice *device;
return &(pd->ib_access);
public:
PrimitiveDataPrivateBuffer(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc):PrimitiveData(_vil,vc)
{
device=dev;
}
~PrimitiveDataPrivateBuffer()
{
VABAccess *vab=vab_access;
for(uint i=0;i<vil->GetCount();i++)
{
if(vab->vab)
{
delete vab->vab;
vab->vab=nullptr;
}
++vab;
}
if(ib_access.buffer)
{
delete ib_access.buffer;
ib_access.buffer=nullptr;
}
}
IBAccess *InitIBO(const VkDeviceSize index_count,IndexType it) override
{
if(!device)return(nullptr);
if(ib_access.buffer)
{
delete ib_access.buffer;
ib_access.buffer=nullptr;
}
ib_access.buffer=device->CreateIBO(it,index_count);
if(!ib_access.buffer)
return(nullptr);
ib_access.start=0;
ib_access.count=index_count;
return(&ib_access);
}
VABAccess *InitVAB(const AnsiString &name,const VkFormat &format,const void *data,const VkDeviceSize bytes)
{
if(!device)return(nullptr);
if(!vil)return(nullptr);
if(name.IsEmpty())return(nullptr);
const int index=vil->GetIndex(name);
if(index<0||index>=vil->GetCount())
return(nullptr);
const VertexInputFormat *vif=vil->GetConfig(index);
if(!vif)return(nullptr);
if(vif->format!=format)
return(nullptr);
if(data)
{
if(vif->stride*vertex_count!=bytes)
return(nullptr);
}
VABAccess *vaba=vab_access+index;
if(!vaba->vab)
{
vaba->vab=device->CreateVAB(format,vertex_count,data);
if(!vaba->vab)
return(nullptr);
vaba->start=0;
vaba->count=vertex_count;
}
else
{
vaba->vab->Write(data,vertex_count);
}
return vaba;
}
};//class PrimitiveDataPrivateBuffer:public PrimitiveData
/**
* 使用VertexDataBuffer分配VAB/IBO在本类析构时归还数据
*/
class PrimitiveDataVDM:public PrimitiveData
{
};
}//namespace
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc)
{
if(!dev)return(nullptr);
if(!_vil)return(nullptr);
if(vc<=0)return(nullptr);
return(new PrimitiveDataPrivateBuffer(dev,_vil,vc));
}
VK_NAMESPACE_END
VK_NAMESPACE_END

View File

@@ -0,0 +1,50 @@
#include<hgl/graph/VK.h>
VK_NAMESPACE_BEGIN
/*
1.截止2024.4.27根据vulkan.gpuinfo.org统计只有9%的设备maxVertexInputAttributes为16不存在低于16的设备。
9.0%的设备为28 - 31
70.7%的设备为32
9.6%的设备为64
由于我们暂时没有发现需要使用16个以上属性的情况所以这里暂定使用16。
(如果时间过去久远,可再次查询此值是否可改成更高的值,以及是否需要)
2.为何va_name使用char[][]而不是String以及动态分配内存
就是为了必避动态分配内存以及可以直接memcpy处理所以此处这样定义。
*/
class PrimitiveData
{
protected:
const VIL * vil;
VkDeviceSize vertex_count;
VABAccess *vab_access;
IBAccess ib_access;
public:
PrimitiveData(const VIL *_vil,const VkDeviceSize vc);
virtual ~PrimitiveData();
public:
const VkDeviceSize GetVertexCount ()const{return vertex_count;}
const int GetVABCount ()const;
const int GetVABIndex (const AnsiString &name)const;
VABAccess * GetVABAccess (const int index);
VABAccess * GetVABAccess (const AnsiString &name);
IBAccess * GetIBAccess (){return &ib_access;}
public:
virtual IBAccess * InitIBO(const VkDeviceSize index_count,IndexType it)=0;
virtual VABAccess *InitVAB(const AnsiString &name,const VkFormat &format,const void *data,const VkDeviceSize bytes)=0;
};//class PrimitiveData
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc);
VK_NAMESPACE_END

View File

@@ -1,4 +1,4 @@
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterial.h>
@@ -51,7 +51,7 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p)
const uint32_t input_count=vil->GetCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的
const UTF8String &mtl_name=mi->GetMaterial()->GetName();
if(prim->GetVACount()<input_count) //小于材质要求的数量?那自然是不行的
if(prim->GetVABCount()<input_count) //小于材质要求的数量?那自然是不行的
{
LOG_ERROR("[FATAL ERROR] input buffer count of Renderable lesser than Material, Material name: "+mtl_name);