coded PrimitiveDataVDM, next step is test.

This commit is contained in:
2024-05-25 02:48:37 +08:00
parent 6de3cf789a
commit 9a4e495027
9 changed files with 140 additions and 134 deletions

View File

@@ -3,6 +3,7 @@
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VertexDataManager.h>
VK_NAMESPACE_BEGIN
@@ -195,8 +196,93 @@ namespace
*/
class PrimitiveDataVDM:public PrimitiveData
{
VertexDataManager *vdm;
};
DataChain::UserNode *ib_node;
DataChain::UserNode *vab_node;
public:
PrimitiveDataVDM(VertexDataManager *_vdm,const VIL *_vil,const VkDeviceSize vc):PrimitiveData(_vil,vc)
{
vdm=_vdm;
ib_node=nullptr;
vab_node=vdm->AcquireVAB(vc);
}
~PrimitiveDataVDM()
{
if(ib_node)
vdm->ReleaseIB(ib_node);
if(vab_node)
vdm->ReleaseVAB(vab_node);
}
IBAccess *InitIBO(const VkDeviceSize index_count,IndexType it) override
{
if(index_count<=0)return(nullptr);
if(!vdm)return(nullptr);
if(!ib_node)
{
ib_node=vdm->AcquireIB(index_count);
if(!ib_node)
return(nullptr);
ib_access.buffer=vdm->GetIBO();
ib_access.start =ib_node->GetStart();
ib_access.count =ib_node->GetCount();
}
return &ib_access;
}
VABAccess *InitVAB(const AnsiString &name,const VkFormat &format,const void *data,const VkDeviceSize bytes)
{
if(!vdm)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=vdm->GetVAB(index);
if(!vaba->vab)
return(nullptr);
vaba->start=vab_node->GetStart();
vaba->count=vab_node->GetCount();
}
if(vaba->vab)
vaba->vab->Write(data,vaba->start,vaba->count);
return vaba;
}
};//class PrimitiveDataVDM:public PrimitiveData
}//namespace
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc)
@@ -207,4 +293,13 @@ PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDevice
return(new PrimitiveDataPrivateBuffer(dev,_vil,vc));
}
PrimitiveData *CreatePrimitiveData(VertexDataManager *vdm,const VIL *_vil,const VkDeviceSize vc)
{
if(!vdm)return(nullptr);
if(!_vil)return(nullptr);
if(vc<=0)return(nullptr);
return(new PrimitiveDataVDM(vdm,_vil,vc));
}
VK_NAMESPACE_END

View File

@@ -47,4 +47,5 @@ public:
};//class PrimitiveData
PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const VkDeviceSize vc);
PrimitiveData *CreatePrimitiveData(VertexDataManager *vdm,const VIL *_vil,const VkDeviceSize vc);
VK_NAMESPACE_END