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

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

View File

@ -1,12 +1,11 @@
#pragma once #pragma once
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VertexAttribDataAccess.h> #include<hgl/graph/VertexAttribDataAccess.h>
#include<hgl/graph/VKShaderModule.h> #include<hgl/graph/VKShaderModule.h>
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/VKVertexAttribBuffer.h> #include<hgl/graph/VKVertexAttribBuffer.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
/** /**
* *
*/ */
@ -14,37 +13,30 @@ class PrimitiveCreater
{ {
protected: protected:
GPUDevice *device; GPUDevice * device;
const GPUPhysicalDevice *phy_device;
const VIL * vil; const VIL * vil;
protected: AnsiString prim_name;
PrimitiveData * prim_data;
AnsiString prim_name; ///<名称 protected:
PrimitiveData * prim_data; ///<图元数据
VkDeviceSize vertices_number; ///<顶点数量 VkDeviceSize vertices_number; ///<顶点数量
uint vab_proc_count; ///<操作的vab数量
VkDeviceSize index_number; ///<索引数量 VkDeviceSize index_number; ///<索引数量
IBAccess * iba; IndexType index_type; ///<索引类型
IBAccess * iba; ///<索引缓冲区
protected:
void ClearAllData();
public: public:
PrimitiveCreater(GPUDevice *,const VIL *,const AnsiString &name); PrimitiveCreater(GPUDevice *,const VIL *,const AnsiString &name);
PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater();
virtual ~PrimitiveCreater()
{
ClearAllData();
}
virtual bool Init(const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 virtual bool Init(const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量
public: //顶点缓冲区
const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量
VABAccess * AcquirePVB (const AnsiString &name,const VkFormat &format,const void *data=nullptr,const VkDeviceSize bytes=0); ///<请求一个顶点属性数据区 VABAccess * AcquirePVB (const AnsiString &name,const VkFormat &format,const void *data=nullptr,const VkDeviceSize bytes=0); ///<请求一个顶点属性数据区
@ -53,15 +45,21 @@ public:
return AcquirePVB(name,format,data,bytes); return AcquirePVB(name,format,data,bytes);
} }
const IndexType GetIndexType()const{return iba->buffer->GetType();} public: //索引缓冲区
IBAccess * AcquireIBO(){return iba;}
const IndexType GetIndexType()const{return index_type;}
void * MapIBO();
void UnmapIBO();
bool WriteIBO(const void *data,const VkDeviceSize bytes); bool WriteIBO(const void *data,const VkDeviceSize bytes);
template<typename T> template<typename T>
bool WriteIBO(const T *data){return WriteIBO(data,index_number*sizeof(T));} bool WriteIBO(const T *data){return WriteIBO(data,index_number*sizeof(T));}
virtual Primitive * Finish(RenderResource *); ///<结束并创建可渲染对象 public: //创建可渲染对象
virtual Primitive * Create(); ///<创建一个可渲染对象
};//class PrimitiveCreater };//class PrimitiveCreater
/** /**
@ -186,30 +184,28 @@ typedef VABMap<VB4d> VABMap4d;
*/ */
template<typename T> class IBMap template<typename T> class IBMap
{ {
IBAccess *iba; PrimitiveCreater *pc;
T *map_ptr; T *map_ptr;
public: public:
IBMap(IBAccess *a) IBMap(PrimitiveCreater *c)
{ {
iba=a; pc=c;
if(iba) if(pc)
map_ptr=(T *)(iba->buffer->Map(iba->start,iba->count)); map_ptr=(T *)(pc->MapIBO());
else else
map_ptr=nullptr; map_ptr=nullptr;
} }
IBMap(PrimitiveCreater *pc):IBMap(pc->AcquireIBO()){}
~IBMap() ~IBMap()
{ {
if(iba) if(map_ptr&&pc)
iba->buffer->Unmap(); pc->UnmapIBO();
} }
const bool IsValid()const{ return iba; } const bool IsValid()const{ return map_ptr; }
operator T *(){ return map_ptr; } operator T *(){ return map_ptr; }
};//template<typename T> class IBMap };//template<typename T> class IBMap

View File

@ -118,7 +118,7 @@ using VIF=VertexInputFormat;
class VertexInputLayout; class VertexInputLayout;
using VIL=VertexInputLayout; using VIL=VertexInputLayout;
struct PrimitiveData; class PrimitiveData;
class Primitive; class Primitive;
class Renderable; class Renderable;

View File

@ -25,35 +25,26 @@ class Primitive
protected: protected:
AnsiString prim_name; AnsiString prim_name;
PrimitiveData *prim_data;
PrimitiveData * prim_data;
protected: protected:
AABB BoundingBox; AABB BoundingBox;
protected:
Primitive(const AnsiString &pn,PrimitiveData *pd)
{
prim_name=pn;
prim_data=pd;
}
public: public:
virtual ~Primitive()=default; Primitive(const AnsiString &pn,PrimitiveData *pd);
virtual ~Primitive();
public: public:
const AnsiString & GetName ()const{ return prim_name; } const AnsiString & GetName ()const{ return prim_name; }
const VkDeviceSize GetVertexCount ()const; const VkDeviceSize GetVertexCount ()const;
const int GetVACount ()const; const int GetVABCount ()const;
VABAccess * GetVABAccess (const AnsiString &); VABAccess * GetVABAccess (const AnsiString &);
IBAccess * GetIBAccess (); IBAccess * GetIBAccess ();
const AABB & GetBoundingBox ()const{return BoundingBox;} const AABB & GetBoundingBox ()const{return BoundingBox;}
};//class Primitive };//class Primitive
Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *);
Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *);
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -6,6 +6,8 @@
#include<hgl/type/RectScope.h> #include<hgl/type/RectScope.h>
#include<hgl/type/String.h> #include<hgl/type/String.h>
#include<hgl/log/LogInfo.h> #include<hgl/log/LogInfo.h>
#include<hgl/graph/VKFormat.h>
#include<hgl/graph/AABB.h>
namespace hgl namespace hgl
{ {
namespace graph namespace graph

View File

@ -17,6 +17,7 @@ SOURCE_GROUP("VertexDataManager" FILES ${SG_VDM_SOURCE})
SET(SG_PRIMITIVE_SOURCE ${SG_INCLUDE_PATH}/VKPrimitive.h SET(SG_PRIMITIVE_SOURCE ${SG_INCLUDE_PATH}/VKPrimitive.h
Vulkan/VKPrimitive.cpp Vulkan/VKPrimitive.cpp
Vulkan/VKPrimitiveData.cpp Vulkan/VKPrimitiveData.cpp
Vulkan/VKPrimitiveData.h
${SG_INCLUDE_PATH}/VKRenderablePrimitiveCreater.h ${SG_INCLUDE_PATH}/VKRenderablePrimitiveCreater.h
${SG_INCLUDE_PATH}/PrimitiveCreater.h ${SG_INCLUDE_PATH}/PrimitiveCreater.h
PrimitiveCreater.cpp) PrimitiveCreater.cpp)

View File

@ -1,52 +1,36 @@
#include<hgl/graph/PrimitiveCreater.h> #include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKShaderModule.h> #include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/VKVertexAttribBuffer.h> #include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKPrimitive.h> #include<hgl/graph/VKPrimitive.h>
//#include<hgl/graph/VertexDataManager.h> #include"vulkan/VKPrimitiveData.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc);
IBAccess * GetIBAccess( PrimitiveData *pd);
void SetIndexBuffer( PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic);
VABAccess * GetVABAccess( PrimitiveData *pd,const int);
void Destory( PrimitiveData *pd);
PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v,const AnsiString &name) PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v,const AnsiString &name)
{ {
device =dev; device =dev;
phy_device =device->GetPhysicalDevice();
vil =v; vil =v;
prim_name =name; prim_name =name;
prim_data =nullptr; prim_data =nullptr;
vertices_number =0; vertices_number =0;
vab_proc_count =0;
index_number =0; index_number =0;
index_type =IndexType::ERR;
iba =nullptr; iba =nullptr;
} }
//PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm) PrimitiveCreater::~PrimitiveCreater()
//{ {
// device =_vdm->GetDevice(); SAFE_CLEAR(prim_data);
// phy_device =device->GetPhysicalDevice(); }
//
// vdm =_vdm;
// vil =vdm->GetVIL();
//
// vertices_number =0;
// index_number =0;
// ibo =nullptr;
// ibo_map =nullptr;
//}
bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize index_count,IndexType it) bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize index_count,IndexType it)
{ {
if(vertex_count<=0)return(false); if(vertex_count<=0)return(false);
prim_data=CreatePrimitiveData(vil,vertex_count); prim_data=CreatePrimitiveData(device,vil,vertex_count);
if(!prim_data)return(false); if(!prim_data)return(false);
@ -67,15 +51,12 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i
return(false); return(false);
} }
iba=GetIBAccess(prim_data); iba=prim_data->InitIBO(index_count,it);
iba->buffer=device->CreateIBO(it,index_count); if(!iba)
return(false);
if(!iba->buffer)return(false);
iba->start=0;
iba->count=index_count;
index_type=it;
index_number=index_count; index_number=index_count;
#ifdef _DEBUG #ifdef _DEBUG
@ -94,37 +75,16 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i
VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data,const VkDeviceSize bytes) VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data,const VkDeviceSize bytes)
{ {
if(!vil)return(nullptr); if(!prim_data)return(nullptr);
if(name.IsEmpty())return(nullptr); if(name.IsEmpty())return(nullptr);
const int index=vil->GetIndex(name); VABAccess *vab_access=prim_data->InitVAB(name,acquire_format,data,bytes);
if(index<0||index>=vil->GetCount())
return(nullptr);
const VertexInputFormat *vif=vil->GetConfig(index);
if(!vif)
return(nullptr);
if(vif->format!=acquire_format)
return(nullptr);
if(data)
if(vif->stride*vertices_number!=bytes)
return(nullptr);
VABAccess *vab_access=GetVABAccess(prim_data,index);
if(!vab_access) if(!vab_access)
return(nullptr); return(nullptr);
if(!vab_access->vab) if(vab_access->vab)
{ {
vab_access->vab=device->CreateVAB(vif->format,vertices_number,data);
vab_access->start=0;
vab_access->count=vertices_number;
#ifdef _DEBUG #ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils(); DebugUtils *du=device->GetDebugUtils();
@ -134,19 +94,32 @@ VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &a
du->SetDeviceMemory(vab_access->vab->GetVkMemory(), prim_name+":VAB:Memory:"+name); du->SetDeviceMemory(vab_access->vab->GetVkMemory(), prim_name+":VAB:Memory:"+name);
} }
#endif//_DEBUG #endif//_DEBUG
++vab_proc_count;
} }
if(data)
vab_access->vab->Write(data,bytes);
return vab_access; return vab_access;
} }
void *PrimitiveCreater::MapIBO()
{
if(!prim_data)return(nullptr);
if(!iba)return(nullptr);
return iba->buffer->Map(iba->start,iba->count);
}
void PrimitiveCreater::UnmapIBO()
{
if(iba)
iba->buffer->Unmap();
}
bool PrimitiveCreater::WriteIBO(const void *data,const VkDeviceSize bytes) bool PrimitiveCreater::WriteIBO(const void *data,const VkDeviceSize bytes)
{ {
if(!data)return(false); if(!data)return(false);
if(!prim_data)return(false);
IBAccess *iba=prim_data->GetIBAccess();
if(bytes>0) if(bytes>0)
if(iba->buffer->GetStride()*index_number<bytes)return(false); if(iba->buffer->GetStride()*index_number<bytes)return(false);
@ -154,34 +127,18 @@ bool PrimitiveCreater::WriteIBO(const void *data,const VkDeviceSize bytes)
return iba->buffer->Write(data,bytes); return iba->buffer->Write(data,bytes);
} }
void PrimitiveCreater::ClearAllData() Primitive *PrimitiveCreater::Create()
{ {
iba=nullptr; if(!prim_data)
if(prim_data)
{
Destory(prim_data);
prim_data=nullptr;
}
}
Primitive *PrimitiveCreater::Finish(RenderResource *rr)
{
const uint si_count=vil->GetCount(VertexInputGroup::Basic);
if(vab_proc_count!=si_count)
return(nullptr); return(nullptr);
Primitive *primitive=rr->CreatePrimitive(prim_name,prim_data); Primitive *primitive=new Primitive(prim_name,prim_data);
if(!primitive) if(!primitive)
{
ClearAllData();
return(nullptr); return(nullptr);
}
iba=nullptr;
prim_data=nullptr; prim_data=nullptr;
iba=nullptr;
return primitive; return primitive;
} }

View File

@ -3,6 +3,7 @@
#include<hgl/graph/VKShaderModule.h> #include<hgl/graph/VKShaderModule.h>
#include<hgl/graph/VKVertexAttribBuffer.h> #include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h> #include<hgl/graph/VKIndexBuffer.h>
#include"VKPrimitiveData.h"
#ifdef _DEBUG #ifdef _DEBUG
#include<hgl/graph/VKDevice.h> #include<hgl/graph/VKDevice.h>
@ -11,65 +12,6 @@
VK_NAMESPACE_BEGIN 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) //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); // 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); // 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) VABAccess *Primitive::GetVABAccess(const AnsiString &name)
{ {
return VK_NAMESPACE::GetVABAccess(prim_data,name); return prim_data->GetVABAccess(name);
} }
IBAccess *Primitive::GetIBAccess() IBAccess *Primitive::GetIBAccess()
{ {
return VK_NAMESPACE::GetIBAccess(prim_data); return prim_data->GetIBAccess();
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -1,122 +1,55 @@
#include"VKPrimitiveData.h"
#include<hgl/graph/VKVertexInputLayout.h> #include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/graph/VKVertexAttribBuffer.h> #include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h> #include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
struct PrimitiveData
PrimitiveData::PrimitiveData(const VIL *_vil,const VkDeviceSize vc)
{ {
const VIL * vil; vil=_vil;
VkDeviceSize vertex_count; vertex_count=vc;
/* vab_access=hgl_zero_new<VABAccess>(_vil->GetCount());
1.2024.4.27vulkan.gpuinfo.org统计9%maxVertexInputAttributes为1616
9.0%28 - 31
70.7%32
9.6%64
使16使16 hgl_zero(ib_access);
()
2.va_name使用char[][]String以及动态分配内存
memcpy处理
*/
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);
} }
void Free(PrimitiveData *pd) PrimitiveData::~PrimitiveData()
{ {
if(!pd)return; SAFE_CLEAR_ARRAY(vab_access); //注意这里并不释放VAB在派生类中释放
delete pd;
} }
void Destory(PrimitiveData *pd) const int PrimitiveData::GetVABCount()const
{ {
if(!pd)return; return vil->GetCount();
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;
} }
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); 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(index<0||index>=vil->GetCount())return(nullptr);
if(!pd->vil)return(nullptr);
if(index<0||index>=pd->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); if(name.IsEmpty())return(nullptr);
const int index=pd->vil->GetIndex(name); const int index=vil->GetIndex(name);
if(index<0)return(nullptr); 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) //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; // 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.27vulkan.gpuinfo.org统计9%maxVertexInputAttributes为1616
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/VKMaterialInstance.h>
#include<hgl/graph/VKMaterialParameters.h> #include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterial.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 uint32_t input_count=vil->GetCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的
const UTF8String &mtl_name=mi->GetMaterial()->GetName(); 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); LOG_ERROR("[FATAL ERROR] input buffer count of Renderable lesser than Material, Material name: "+mtl_name);