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

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

View File

@ -169,11 +169,18 @@ private:
Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p,const Matrix4f &mat=Identity4f)
{
if(!r)
return(nullptr);
if(!mi)
return(nullptr);
if(!p)
return(nullptr);
Renderable *ri=db->CreateRenderable(r,mi,p);
if(!ri)
{
LOG_ERROR(OS_TEXT("Create Renderable failed."));
LOG_ERROR(U8_TEXT("Create Renderable failed! Primitive: ")+r->GetName());
return(nullptr);
}

View File

@ -7,9 +7,6 @@
#include<hgl/graph/VKVertexAttribBuffer.h>
VK_NAMESPACE_BEGIN
class VertexDataManager;
struct PrimitiveData;
/**
*
*/
@ -24,34 +21,38 @@ protected:
protected:
PrimitiveData * prim_data;
void_pointer vab_map_ptr[HGL_MAX_VERTEX_ATTRIB_COUNT];
AnsiString prim_name; ///<名称
PrimitiveData * prim_data; ///<图元数据
VkDeviceSize vertices_number;
IndexBuffer * ibo;
void * ibo_map;
VkDeviceSize vertices_number; ///<顶点数量
uint vab_proc_count; ///<操作的vab数量
VkDeviceSize index_number; ///<索引数量
IndexBuffer * ibo;
void * ibo_map;
protected:
template<typename T> friend class VABRawMap;
template<typename T> friend class VABMap;
VABAccess *AcquirePVB(const AnsiString &,const VkFormat &,const void *data); ///<请求一个顶点属性数据区
void ClearAllData();
public:
PrimitiveCreater(GPUDevice *,const VIL *);
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); ///<初始化,参数为顶点数量
const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量
bool WriteVAB(const AnsiString &name,const void *data,const uint32_t bytes); ///<直接写入顶点属性数据
VABAccess * AcquirePVB (const AnsiString &name,const VkFormat &format,const void *data=nullptr,const VkDeviceSize bytes=0); ///<请求一个顶点属性数据区
bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data,const uint32_t bytes) ///<直接写入顶点属性数据
{
return AcquirePVB(name,format,data,bytes);
}
const IndexType GetIndexType()const{return ibo?ibo->GetType():IndexType::ERR;} ///<取得索引数据类型
@ -61,6 +62,9 @@ public:
if(!ibo)return(nullptr);
if(ibo->GetStride()!=sizeof(T))return(nullptr);
if(!ibo_map)
ibo_map=ibo->Map();
return (T *)ibo_map;
}
@ -69,12 +73,19 @@ public:
if(!ibo)return(false);
if(ibo->GetStride()!=sizeof(T))return(false);
hgl_cpy<T>((T *)ibo_map,data,index_number);
if(ibo_map)
{
hgl_cpy<T>((T *)ibo_map,data,index_number);
ibo->Unmap();
ibo_map=nullptr;
}
else
ibo->Write(data);
return(true);
}
virtual Primitive * Finish(RenderResource *,const AnsiString &); ///<结束并创建可渲染对象
virtual Primitive * Finish(RenderResource *); ///<结束并创建可渲染对象
};//class PrimitiveCreater
/**
@ -87,19 +98,25 @@ template<typename T> class VABRawMap
public:
VABRawMap(PrimitiveCreater *pc,const AnsiString &name)
VABRawMap(PrimitiveCreater *pc,const VkFormat &format,const AnsiString &name)
{
vaba=pc->AcquirePVB(name,T::GetVulkanFormat(),nullptr);
vaba=pc->AcquirePVB(name,format);
map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count));
if(vaba)
map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count));
else
map_ptr=nullptr;
}
~VABRawMap()
{
vaba->vab->Unmap();
if(vaba)
vaba->vab->Unmap();
}
T *operator->(){ return map_ptr; }
const bool IsValid()const{ return vaba; }
operator T *(){ return map_ptr; }
};//template<typename T> class VABRawMap
typedef VABRawMap<int8> VABRawMapi8, VABRawMapByte;
@ -125,23 +142,34 @@ public:
{
vaba=pc->AcquirePVB(name,T::GetVulkanFormat(),nullptr);
void *map_ptr=vaba->vab->Map(vaba->start,vaba->count);
if(vaba)
{
void *map_ptr=vaba->vab->Map(vaba->start,vaba->count);
vb=T::Create(pc->GetVertexCount(),map_ptr);
vb=T::Create(pc->GetVertexCount(),map_ptr);
vb->Begin();
vb->Begin();
}
else
{
vb=nullptr;
}
}
~VABMap()
{
vaba->vab->Unmap();
if(vaba)
vaba->vab->Unmap();
}
void Restart()
{
vb->Begin();
if(vb)
vb->Begin();
}
const bool IsValid()const{ return vb; }
T *operator->(){ return vb; }
};//template<typename T> class VABMap

View File

@ -122,6 +122,7 @@ struct PrimitiveData;
class Primitive;
class Renderable;
class VertexDataManager;
class RenderResource;
enum class SharingMode

View File

@ -3,10 +3,9 @@
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/graph/AABB.h>
#include<hgl/graph/VKPrimitiveData.h>
#include<hgl/graph/VK.h>
VK_NAMESPACE_BEGIN
/**
* 访<br>
*
@ -26,31 +25,35 @@ class Primitive
protected:
AnsiString prim_name;
PrimitiveData *prim_data;
protected:
AABB BoundingBox;
public:
protected:
Primitive(const AnsiString &n)
Primitive(const AnsiString &pn,PrimitiveData *pd)
{
prim_name=n;
prim_name=pn;
prim_data=pd;
}
virtual ~Primitive()=0;
public:
virtual ~Primitive()=default;
public:
virtual const VkDeviceSize GetVertexCount ()const=0;
virtual const int GetVACount ()const=0;
virtual const bool GetVABAccess (const AnsiString &,VABAccess *)=0;
virtual const IBAccess * GetIBAccess ()const=0;
const AnsiString & GetName ()const{ return prim_name; }
const VkDeviceSize GetVertexCount ()const;
const int GetVACount ()const;
VABAccess * GetVABAccess (const AnsiString &);
IBAccess * GetIBAccess ();
const AABB & GetBoundingBox ()const{return BoundingBox;}
const AABB & GetBoundingBox ()const{return BoundingBox;}
};//class Primitive
Primitive *CreatePrimitive(const PrimitiveData *);
Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *);
Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *);
VK_NAMESPACE_END

View File

@ -1,40 +0,0 @@
#pragma once
#include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/AABB.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处理
*/
struct PrimitiveData
{
const VIL * vil;
VkDeviceSize vertex_count;
VABAccess vab_access[HGL_MAX_VERTEX_ATTRIB_COUNT];
IBAccess ib_access;
};//struct PrimitiveData
bool InitPrimitiveData( PrimitiveData *pd,const VIL *_vil,const VkDeviceSize vc);
int GetVABIndex(const PrimitiveData *pd,const AnsiString &name);
VABAccess * GetVAB( PrimitiveData *pd,const int);
VABAccess * SetVAB( PrimitiveData *pd,const int,VAB *vab,VkDeviceSize start,VkDeviceSize count);
void SetIndexBuffer( PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic);
VK_NAMESPACE_END

View File

@ -147,7 +147,8 @@ public: //Material
MaterialInstance * CreateMaterialInstance(const mtl::MaterialCreateInfo *,const VILConfig *vil_cfg=nullptr);
Primitive * CreatePrimitive(const AnsiString &,const uint32_t vertex_count=0);
Primitive * CreatePrimitive( const AnsiString &,PrimitiveData *);
Primitive * CreatePrimitive(VertexDataManager *,const AnsiString &,PrimitiveData *);
Renderable * CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p);

View File

@ -9,8 +9,6 @@ namespace hgl
{
namespace graph
{
class VertexDataManager;
struct IBAccessNode:public IBAccess
{
private:

View File

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

View File

@ -16,19 +16,19 @@ namespace hgl
{
Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Rectangle");
if(!rc.Init(4,0))
return(nullptr);
AutoDelete<VB2f> vertex=rc.AccessVAB<VB2f>(VAN::Position);
VABMap2f vertex(&rc,VAN::Position);
if(!vertex)
if(!vertex.IsValid())
return(nullptr);
vertex->WriteRectFan(rci->scope);
return rc.Finish(db,"Rectangle");
return rc.Finish(db);
}
Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil)
@ -42,14 +42,14 @@ namespace hgl
Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"RoundRectangle");
if(rci->radius==0||rci->round_per<=1) //这是要画矩形
{
if(!rc.Init(4,0))
return(nullptr);
AutoDelete<VB2f> vertex=rc.AccessVAB<VB2f>(VAN::Position);
VABMap2f vertex(&rc,VAN::Position);
vertex->WriteRectFan(rci->scope);
}
@ -63,7 +63,7 @@ namespace hgl
if(!rc.Init(rci->round_per*4,8))
return(nullptr);
AutoDelete<VB2f> vertex=rc.AccessVAB<VB2f>(VAN::Position);
VABMap2f vertex(&rc,VAN::Position);
Vector2f *coord=new Vector2f[rci->round_per];
@ -111,12 +111,12 @@ namespace hgl
delete[] coord;
}
return rc.Finish(db,"RoundRectangle");
return rc.Finish(db);
}
Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Circle");
uint edge;
@ -131,15 +131,15 @@ namespace hgl
if(!rc.Init(cci->field_count,0))return(nullptr);
}
AutoDelete<VB2f> vertex=rc.AccessVAB<VB2f>(VAN::Position);
AutoDelete<VB4f> color=rc.AccessVAB<VB4f>(VAN::Color);
VABMap2f vertex(&rc,VAN::Position);
VABMap4f color(&rc,VAN::Color);
if(!vertex)
if(!vertex.IsValid())
return(nullptr);
if(cci->has_color)
{
if(!color)
if(!color.IsValid())
return(nullptr);
vertex->Write(cci->center);
@ -159,17 +159,17 @@ namespace hgl
color->Write(cci->border_color);
}
return rc.Finish(db,"Circle");
return rc.Finish(db);
}
Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"PlaneGrid");
if(!rc.Init(((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0))
return(nullptr);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
VABMap3f vertex(&rc,VAN::Position);
const float right=float(pgci->grid_size.Width())/2.0f;
const float left =-right;
@ -189,8 +189,9 @@ namespace hgl
Vector3f(left+col,bottom,0));
}
AutoDelete<VB1f> lum=rc.AccessVAB<VB1f>(VAN::Luminance);
if(lum)
VABMap1f lum(&rc,VAN::Luminance);
if(lum.IsValid())
{
for(uint row=0;row<=pgci->grid_size.Height();row++)
{
@ -209,7 +210,7 @@ namespace hgl
}
}
return rc.Finish(db,"PlaneGrid");
return rc.Finish(db);
}
Primitive *CreatePlane(RenderResource *db,const VIL *vil)
@ -219,33 +220,36 @@ namespace hgl
const Vector3f xy_normal(0.0f,0.0f,1.0f);
const Vector3f xy_tangent(1.0f,0.0f,0.0f);
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Plane");
if(!rc.Init(4,8))
return(nullptr);
rc.WriteVAB(VAN::Position,xy_vertices,sizeof(xy_vertices));
if(!rc.WriteVAB(VAN::Position,VF_V3F,xy_vertices,sizeof(xy_vertices)))
return(nullptr);
{
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
VABMap3f normal(&rc,VAN::Normal);
if(normal)normal->RepeatWrite(xy_normal,4);
if(normal.IsValid())
normal->RepeatWrite(xy_normal,4);
}
{
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
VABMap3f tangent(&rc,VAN::Tangent);
if(tangent)tangent->RepeatWrite(xy_tangent,4);
if(tangent.IsValid())
tangent->RepeatWrite(xy_tangent,4);
}
{
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
VABMap2f tex_coord(&rc,VAN::TexCoord);
if(tex_coord)
if(tex_coord.IsValid())
tex_coord->Write(xy_tex_coord,4);
}
return rc.Finish(db,"Plane");
return rc.Finish(db);
}
Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci)
@ -301,29 +305,33 @@ namespace hgl
16, 17, 18, 16, 18, 19,
20, 23, 22, 20, 22, 21};
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Cube");
if(!rc.Init(24,6*2*3,IndexType::U16))
return(nullptr);
rc.WriteVAB(VAN::Position,positions,sizeof(positions));
if(!rc.WriteVAB(VAN::Position,VF_V3F,positions,sizeof(positions)))
return(nullptr);
if(cci->normal)
rc.WriteVAB(VAN::Normal,normals,sizeof(normals));
if(!rc.WriteVAB(VAN::Normal,VF_V3F,normals,sizeof(normals)))
return(nullptr);
if(cci->tangent)
rc.WriteVAB(VAN::Tangent,tangents,sizeof(tangents));
if(!rc.WriteVAB(VAN::Tangent,VF_V3F,tangents,sizeof(tangents)))
return(nullptr);
if(cci->tex_coord)
rc.WriteVAB(VAN::TexCoord,tex_coords,sizeof(tex_coords));
if(!rc.WriteVAB(VAN::TexCoord,VF_V2F,tex_coords,sizeof(tex_coords)))
return(nullptr);
if(cci->color_type!=CubeCreateInfo::ColorType::NoColor)
{
RANGE_CHECK_RETURN_NULLPTR(cci->color_type);
AutoDelete<VB4f> color=rc.AccessVAB<VB4f>(VAN::Color);
VABMap4f color(&rc,VAN::Color);
if(color)
if(color.IsValid())
{
if(cci->color_type==CubeCreateInfo::ColorType::SameColor)
color->RepeatWrite(cci->color[0],24);
@ -343,7 +351,7 @@ namespace hgl
//rc.CreateIBO16(6*2*3,indices);
rc.WriteIBO(indices);
return rc.Finish(db,"Cube");
return rc.Finish(db);
}
template<typename T> void CreateSphereIndices(T *tp,uint numberParallels,const uint numberSlices)
@ -443,7 +451,7 @@ namespace hgl
*/
Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Sphere");
uint numberParallels = (numberSlices+1) / 2;
uint numberVertices = (numberParallels + 1) * (numberSlices + 1);
@ -460,15 +468,18 @@ namespace hgl
if(!rc.Init(numberVertices,numberIndices))
return(nullptr);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position);
VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal);
VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent);
VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord);
float *vp=vertex->Get();
float *np=normal?normal->Get():nullptr;
float *tp=tangent?tangent->Get():nullptr;
float *tcp=tex_coord?tex_coord->Get():nullptr;
float *vp=vertex;
float *np=normal;
float *tp=tangent;
float *tcp=tex_coord;
if(!vp)
return(nullptr);
for (uint i = 0; i < numberParallels + 1; i++)
{
@ -519,12 +530,12 @@ namespace hgl
return(nullptr);
}
return rc.Finish(db,"Sphere");
return rc.Finish(db);
}
Primitive *CreateDome(RenderResource *db,const VIL *vil,const uint numberSlices)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Dome");
uint i, j;
@ -545,16 +556,19 @@ namespace hgl
if(!rc.Init(numberVertices,numberIndices))
return(nullptr);
VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position);
VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal);
VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent);
VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
float *vp=vertex->Get();
float *np=normal?normal->Get():nullptr;
float *tp=tangent?tangent->Get():nullptr;
float *tcp=tex_coord?tex_coord->Get():nullptr;
float *vp=vertex;
float *np=normal;
float *tp=tangent;
float *tcp=tex_coord;
if(!vp)
return(nullptr);
for (i = 0; i < numberParallels + 1; i++)
{
@ -610,7 +624,7 @@ namespace hgl
return(nullptr);
}
return rc.Finish(db,"Dome");
return rc.Finish(db);
}
namespace
@ -650,7 +664,7 @@ namespace hgl
Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Torus");
// s, t = parametric values of the equations, in the range [0,1]
float s = 0;
@ -686,18 +700,21 @@ namespace hgl
tIncr = 1.0f / (float) tci->numberStacks;
if(!rc.Init(numberVertices,numberIndices))
return(nullptr);
VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position);
VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal);
VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent);
VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord);
float *vp=vertex;
float *np=normal;
float *tp=tangent;
float *tcp=tex_coord;
if(!vp)
return(nullptr);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
float *vp=vertex->Get();
float *np=normal?normal->Get():nullptr;
float *tp=tangent?tangent->Get():nullptr;
float *tcp=tex_coord?tex_coord->Get():nullptr;
// generate vertices and its attributes
for (sideCount = 0; sideCount <= tci->numberSlices; ++sideCount, s += sIncr)
{
@ -755,7 +772,7 @@ namespace hgl
if(index_type==IndexType::U8 )CreateTorusIndices<uint8 >(rc.AccessIBO<uint8 >(),tci->numberSlices,tci->numberStacks);else
return(nullptr);
}
return rc.Finish(db,"Torus");
return rc.Finish(db);
}
namespace
@ -815,7 +832,7 @@ namespace hgl
if(numberIndices<=0)
return(nullptr);
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Cylinder");
uint numberVertices = (cci->numberSlices + 2) * 2 + (cci->numberSlices + 1) * 2;
@ -826,16 +843,19 @@ namespace hgl
if (cci->numberSlices < 3 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES)
return nullptr;
VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position);
VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal);
VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent);
VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
float *vp=vertex;
float *np=normal;
float *tp=tangent;
float *tcp=tex_coord;
float *vp=vertex->Get();
float *np=normal?normal->Get():nullptr;
float *tp=tangent?tangent->Get():nullptr;
float *tcp=tex_coord?tex_coord->Get():nullptr;
if(!vp)
return(nullptr);
*vp = 0.0f; ++vp;
*vp = 0.0f; ++vp;
@ -989,7 +1009,7 @@ namespace hgl
return(nullptr);
}
return rc.Finish(db,"Cylinder");
return rc.Finish(db);
}
namespace
@ -1034,7 +1054,7 @@ namespace hgl
Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci)
{
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Cone");
uint i, j;
@ -1052,16 +1072,19 @@ namespace hgl
if (cci->numberSlices < 3 || cci->numberStacks < 1 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES)
return nullptr;
VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position);
VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal);
VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent);
VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB3f> normal=rc.AccessVAB<VB3f>(VAN::Normal);
AutoDelete<VB3f> tangent=rc.AccessVAB<VB3f>(VAN::Tangent);
AutoDelete<VB2f> tex_coord=rc.AccessVAB<VB2f>(VAN::TexCoord);
float *vp=vertex;
float *np=normal;
float *tp=tangent;
float *tcp=tex_coord;
float *vp=vertex->Get();
float *np=normal?normal->Get():nullptr;
float *tp=tangent?tangent->Get():nullptr;
float *tcp=tex_coord?tex_coord->Get():nullptr;
if(!vp)
return(nullptr);
*vp = 0.0f; ++vp;
*vp = 0.0f; ++vp;
@ -1160,22 +1183,22 @@ namespace hgl
return(nullptr);
}
return rc.Finish(db,"Cone");
return rc.Finish(db);
}
Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci)
{
if(!db||!vil||!aci)return(nullptr);
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"Axis");
if(!rc.Init(6,0))
return(nullptr);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
AutoDelete<VB4f> color=rc.AccessVAB<VB4f>(VAN::Color);
VABMap3f vertex(&rc,VAN::Position);
VABMap4f color(&rc,VAN::Color);
if(!vertex||!color)
if(!vertex.IsValid()||!color.IsValid())
return(nullptr);
const float s=aci->size;
@ -1187,7 +1210,7 @@ namespace hgl
vertex->Write(0,0,0);color->Write(aci->color[2]);
vertex->Write(0,0,s);color->Write(aci->color[2]);
return rc.Finish(db,"Axis");
return rc.Finish(db);
}
Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci)
@ -1212,24 +1235,21 @@ namespace hgl
0,4, 1,5, 2,6, 3,7
};
PrimitiveCreater rc(db->GetDevice(),vil);
PrimitiveCreater rc(db->GetDevice(),vil,"BoundingBox");
if(!rc.Init(8,24,IndexType::U16))
return(nullptr);
AutoDelete<VB3f> vertex=rc.AccessVAB<VB3f>(VAN::Position);
if(!vertex)return(nullptr);
rc.WriteVAB(VAN::Position,points,sizeof(points));
if(!rc.WriteVAB(VAN::Position,VF_V3F,points,sizeof(points)))
return(nullptr);
if(cci->color_type!=BoundingBoxCreateInfo::ColorType::NoColor)
{
RANGE_CHECK_RETURN_NULLPTR(cci->color_type);
AutoDelete<VB4f> color=rc.AccessVAB<VB4f>(VAN::Color);
VABMap4f color(&rc,VAN::Color);
if(color)
if(color.IsValid())
{
if(cci->color_type==BoundingBoxCreateInfo::ColorType::SameColor)
color->RepeatWrite(cci->color[0],8);
@ -1241,7 +1261,7 @@ namespace hgl
rc.WriteIBO<uint16>(indices);
return rc.Finish(db,"BoundingBox");
return rc.Finish(db);
}
}//namespace inline_geometry
}//namespace graph

View File

@ -5,16 +5,24 @@
#include<hgl/graph/VertexDataManager.h>
VK_NAMESPACE_BEGIN
PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v)
PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc);
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)
{
device =dev;
phy_device =device->GetPhysicalDevice();
vil =v;
prim_data =hgl_zero_new<PrimitiveData>();
prim_name =name;
prim_data =nullptr;
vertices_number=0;
hgl_zero(vab_ptr);
vertices_number =0;
vab_proc_count =0;
index_number =0;
ibo =nullptr;
ibo_map =nullptr;
@ -34,24 +42,15 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v)
// ibo_map =nullptr;
//}
PrimitiveCreater::~PrimitiveCreater()
{
if(prim_data)
{
if(ibo_map)
ibo->Unmap();
delete prim_data;
}
}
bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize index_count,IndexType it)
{
if(vertex_count<=0)return(false);
vertices_number=vertex_count;
prim_data=CreatePrimitiveData(vil,vertex_count);
InitPrimitiveData(prim_data,vil,vertex_count);
if(!prim_data)return(false);
vertices_number=vertex_count;
if(index_count>0)
{
@ -72,15 +71,25 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i
if(!ibo)return(false);
SetIndexBuffer(prim_data,ibo,index_count);
index_number=index_count;
ibo_map=ibo->Map();
SetIndexBuffer(prim_data,ibo,index_count);
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
{
du->SetBuffer( ibo->GetBuffer(), prim_name+":IndexBuffer:Buffer");
du->SetDeviceMemory(ibo->GetVkMemory(), prim_name+":IndexBuffer:Memory");
}
#endif//_DEBUG
}
return(true);
}
VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data)
VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data,const VkDeviceSize bytes)
{
if(!vil)return(nullptr);
if(name.IsEmpty())return(nullptr);
@ -97,122 +106,82 @@ VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &a
if(vif->format!=acquire_format)
return(nullptr);
if(data)
if(vif->stride*vertices_number!=bytes)
return(nullptr);
VABAccess *vab=GetVAB(prim_data,index);
VABAccess *vab_access=GetVABAccess(prim_data,index);
if(vab)
return vab;
if(!vab_access)
return(nullptr);
vad->vab =device->CreateVAB(vif->format,vertices_number,data);
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
DebugUtils *du=device->GetDebugUtils();
if(!data)
vad->map_ptr=vad->vab->Map();
else
vad->map_ptr=nullptr;
if(du)
{
du->SetBuffer( vab_access->vab->GetBuffer(), prim_name+":VAB:Buffer:"+name);
du->SetDeviceMemory(vab_access->vab->GetVkMemory(), prim_name+":VAB:Memory:"+name);
}
#endif//_DEBUG
vab_map.Add(name,*vad);
++vab_proc_count;
}
return true;
}
if(data)
vab_access->vab->Write(data,bytes);
bool PrimitiveCreater::WriteVAB(const AnsiString &name,const void *data,const uint32_t bytes)
{
if(!vil)return(false);
if(name.IsEmpty())return(false);
if(!data)return(false);
if(!bytes)return(false);
const VertexInputFormat *vif=vil->GetConfig(name);
if(!vif)
return(false);
if(vif->stride*vertices_number!=bytes)
return(false);
VABAccess vad;
return AcquirePVB(&vad,name,data);
return vab_access;
}
void PrimitiveCreater::ClearAllData()
{
if(vab_map.GetCount()>0)
{
const auto *sp=vab_map.GetDataList();
for(int i=0;i<vab_map.GetCount();i++)
{
if((*sp)->value.vab)
{
(*sp)->value.vab->Unmap();
delete (*sp)->value.vab;
}
++sp;
}
}
if(ibo)
if(ibo_map)
{
ibo->Unmap();
delete ibo;
ibo=nullptr;
ibo_map=nullptr;
}
ibo=nullptr;
if(prim_data)
{
Destory(prim_data);
prim_data=nullptr;
}
}
Primitive *PrimitiveCreater::Finish(RenderResource *rr,const AnsiString &prim_name)
Primitive *PrimitiveCreater::Finish(RenderResource *rr)
{
const uint si_count=vil->GetCount(VertexInputGroup::Basic);
if(vab_map.GetCount()!=si_count)
if(vab_proc_count!=si_count)
return(nullptr);
Primitive *primitive=rr->CreatePrimitive(prim_name,vertices_number);
{
const auto *sp=vab_map.GetDataList();
for(uint i=0;i<si_count;i++)
{
if((*sp)->value.vab)
{
if((*sp)->value.map_ptr)
(*sp)->value.vab->Unmap();
primitive->SetVAB((*sp)->key,(*sp)->value.vab);
}
else
{
ClearAllData();
return(nullptr);
}
++sp;
}
}
{
const auto *sp=vab_map.GetDataList();
for(uint i=0;i<si_count;i++)
{
if((*sp)->value.vab)
rr->Add((*sp)->value.vab);
++sp;
}
vab_map.Clear();
}
if(ibo)
if(ibo_map)
{
ibo->Unmap();
primitive->SetIndex(ibo,0,index_number);
rr->Add(ibo);
ibo=nullptr; //避免释构函数删除
ibo_map=nullptr;
}
rr->Add(primitive);
Primitive *primitive=rr->CreatePrimitive(prim_name,prim_data);
if(!primitive)
{
ClearAllData();
return(nullptr);
}
ibo_map=nullptr;
ibo=nullptr;
prim_data=nullptr;
return primitive;
}

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.2024.4.27vulkan.gpuinfo.org统计9%maxVertexInputAttributes为1616
9.0%28 - 31
70.7%32
9.6%64
pd->vil=_vil;
使16使16
()
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(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;
}