newly PrimitiveData struct and Primitive class. Can't Run!!!

next step is to support PrimitiveVDM.
This commit is contained in:
2024-05-23 02:19:40 +08:00
parent e27442a0b4
commit 40ce978f85
14 changed files with 509 additions and 388 deletions

View File

@@ -10,6 +10,66 @@
#endif//_DEBUG
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);
@@ -28,56 +88,24 @@ VK_NAMESPACE_BEGIN
// return(true);
//}
bool Primitive::SetVAB(const AnsiString &name,VAB *vab,VkDeviceSize start)
const VkDeviceSize Primitive::GetVertexCount()const
{
if(!vab)return(false);
if(vab_access_map.KeyExist(name))return(false);
VABAccess vad;
vad.vab=vab;
vad.start=start;
vab_access_map.Add(name,vad);
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
{
du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name);
du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name);
}
#endif//_DEBUG
return(true);
return VK_NAMESPACE::GetVertexCount(prim_data);
}
const bool Primitive::GetVABAccess(const AnsiString &name,VABAccess *vad)
const int Primitive::GetVACount()const
{
if(name.IsEmpty())return(false);
if(!vad)return(false);
return vab_access_map.Get(name,*vad);
return GetVABCount(prim_data);
}
bool Primitive::SetIndex(IndexBuffer *ib,VkDeviceSize start,const VkDeviceSize index_count)
VABAccess *Primitive::GetVABAccess(const AnsiString &name)
{
if(!ib)return(false);
ib_access.buffer=ib;
ib_access.start=start;
ib_access.count=index_count;
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
{
du->SetBuffer(ib->GetBuffer(),prim_name+":IBO:Buffer");
du->SetDeviceMemory(ib->GetVkMemory(),prim_name+":IBO:Memory");
}
#endif//_DEBUG
return(true);
return VK_NAMESPACE::GetVABAccess(prim_data,name);
}
IBAccess *Primitive::GetIBAccess()
{
return VK_NAMESPACE::GetIBAccess(prim_data);
}
VK_NAMESPACE_END

View File

@@ -1,18 +1,65 @@
#include<hgl/graph/VKPrimitiveData.h>
#include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
VK_NAMESPACE_BEGIN
bool InitPrimitiveData(PrimitiveData *pd,const VIL *_vil,const VkDeviceSize vc)
struct PrimitiveData
{
if(!pd)return(false);
if(!_vil)return(false);
if(vc<=0)return(false);
const VIL * vil;
hgl_zero(*pd);
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
pd->vil=_vil;
<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>Ҫ)
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(true);
return(pd);
}
void Free(PrimitiveData *pd)
{
if(!pd)return;
delete pd;
}
const VkDeviceSize GetVertexCount(PrimitiveData *pd)
{
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)
@@ -24,7 +71,7 @@ int GetVABIndex(const PrimitiveData *pd,const AnsiString &name)
return pd->vil->GetIndex(name);
}
VABAccess *GetVAB(PrimitiveData *pd,const int index)
VABAccess *GetVABAccess(PrimitiveData *pd,const int index)
{
if(!pd)return(nullptr);
if(!pd->vil)return(nullptr);
@@ -33,29 +80,66 @@ VABAccess *GetVAB(PrimitiveData *pd,const int index)
return pd->vab_access+index;
}
VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count)
VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name)
{
if(!pd)return(nullptr);
if(!pd->vil)return(nullptr);
if(index<0||index>=pd->vil->GetCount())return(nullptr);
if(name.IsEmpty())return(nullptr);
VABAccess *vaba=pd->vab_access+index;
const int index=pd->vil->GetIndex(name);
vaba->vab=vab;
vaba->start=start;
vaba->count=count;
if(index<0)return(nullptr);
//#ifdef _DEBUG
// DebugUtils *du=device->GetDebugUtils();
return pd->vab_access+index;
}
// if(du)
// {
// du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name);
// du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name);
// }
//#endif//_DEBUG
//VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count)
//{
// if(!pd)return(nullptr);
// if(!pd->vil)return(nullptr);
// if(index<0||index>=pd->vil->GetCount())return(nullptr);
//
// VABAccess *vaba=pd->vab_access+index;
//
// vaba->vab=vab;
// vaba->start=start;
// vaba->count=count;
//
// //#ifdef _DEBUG
// // DebugUtils *du=device->GetDebugUtils();
//
// // if(du)
// // {
// // du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name);
// // du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name);
// // }
// //#endif//_DEBUG
//
// return vaba;
//}
return vaba;
void Destory(PrimitiveData *pd)
{
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;
}
}
void SetIndexBuffer(PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic)
@@ -67,4 +151,11 @@ void SetIndexBuffer(PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic)
pd->ib_access.count=ic;
}
IBAccess *GetIBAccess(PrimitiveData *pd)
{
if(!pd)return(nullptr);
return &(pd->ib_access);
}
VK_NAMESPACE_END

View File

@@ -80,16 +80,34 @@ MaterialInstance *RenderResource::CreateMaterialInstance(const mtl::MaterialCrea
return CreateMaterialInstance(mtl,vil_cfg);
}
Primitive *RenderResource::CreatePrimitive(const AnsiString &name,const uint32_t vertex_count)
Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *);
Primitive *RenderResource::CreatePrimitive(const AnsiString &name,PrimitiveData *pd)
{
if(!vertex_count)return(nullptr);
if(!pd)return(nullptr);
Primitive *ro=new Primitive(device,name,vertex_count);
Primitive *prim=CreatePrimitivePrivate(name,pd);
if(ro)
Add(ro);
if(prim)
Add(prim);
return ro;
return prim;
}
Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *);
Primitive *RenderResource::CreatePrimitive(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd)
{
if(!vdm)return(nullptr);
if(!pd)return(nullptr);
if(name.IsEmpty())return(nullptr);
Primitive *prim=CreatePrimitivePrivate(vdm,name,pd);
if(prim)
Add(prim);
return prim;
}
Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p)

View File

@@ -58,48 +58,46 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p)
return(nullptr);
}
VAB *vab;
VertexInputData *vid=new VertexInputData(input_count,prim->GetVertexCount(),prim->GetIBAccess());
const VertexInputFormat *vif=vil->GetVIFList(VertexInputGroup::Basic);
VABAccess vad;
VABAccess *vab_access;
for(uint i=0;i<input_count;i++)
{
//注: VIF来自于材质但VAB来自于Primitive。
// 两个并不一定一样排序也不一定一样。所以不能让PRIMTIVE直接提供BUFFER_LIST/OFFSET来搞一次性绑定。
if(!prim->GetVABAccess(vif->name,&vad))
vab_access=prim->GetVABAccess(vif->name);
if(!vab_access||!vab_access->vab)
{
LOG_ERROR("[FATAL ERROR] not found VAB \""+AnsiString(vif->name)+"\" in Material: "+mtl_name);
return(nullptr);
}
vab=vad.vab;
if(vab->GetFormat()!=vif->format)
if(vab_access->vab->GetFormat()!=vif->format)
{
LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+
UTF8String("\" format can't match Renderable, Material(")+mtl_name+
UTF8String(") Format(")+GetVulkanFormatName(vif->format)+
UTF8String("), VAB Format(")+GetVulkanFormatName(vab->GetFormat())+
UTF8String("), VAB Format(")+GetVulkanFormatName(vab_access->vab->GetFormat())+
")");
return(nullptr);
}
if(vab->GetStride()!=vif->stride)
if(vab_access->vab->GetStride()!=vif->stride)
{
LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+
UTF8String("\" stride can't match Renderable, Material(")+mtl_name+
UTF8String(") stride(")+UTF8String::numberOf(vif->stride)+
UTF8String("), VAB stride(")+UTF8String::numberOf(vab->GetStride())+
UTF8String("), VAB stride(")+UTF8String::numberOf(vab_access->vab->GetStride())+
")");
return(nullptr);
}
vid->buffer_offset[i]=vad.start;
vid->buffer_list[i]=vab->GetBuffer();
vid->buffer_offset[i]=vab_access->start;
vid->buffer_list[i]=vab_access->vab->GetBuffer();
++vif;
}