#include #include #include #include #include namespace hgl { namespace graph { VertexDataManager::VertexDataManager(GPUDevice *dev,const VIL *_vil) { device=dev; vil=_vil; vi_count=_vil->GetVertexAttribCount(); vif_list=_vil->GetVIFList(); //来自于Material,不会被释放,所以指针有效 vab_max_size=0; vab_cur_size=0; vab=hgl_zero_new(vi_count); ibo_cur_size=0; ibo=nullptr; } VertexDataManager::~VertexDataManager() { SAFE_CLEAR_OBJECT_ARRAY_OBJECT(vab,vi_count); SAFE_CLEAR(ibo); } /** * 初始化顶点数据管理器 * @param vbo_size VAB大小 * @param ibo_size IBO大小 * @param index_type 索引类型 */ bool VertexDataManager::Init(const VkDeviceSize vbo_size,const VkDeviceSize ibo_size,const IndexType index_type) { if(vab[0]||ibo) //已经初始化过了 return(false); if(vbo_size<=0) return(false); vab_max_size=vbo_size; ibo_cur_size=ibo_size; vab_cur_size=0; ibo_cur_size=0; for(uint i=0;iCreateVAB(vif_list[i].format,vab_max_size); if(!vab[i]) return(false); } vbo_data_chain.Init(vab_max_size); if(ibo_size>0) { ibo=device->CreateIBO(index_type,ibo_size); if(!ibo) return(false); ibo_data_chain.Init(ibo_size); } return(true); } DataChain::UserNode *VertexDataManager::AcquireIB(const VkDeviceSize count) { if(count<=0)return(nullptr); DataChain::UserNode *un=ibo_data_chain.Acquire(hgl_align(count,4)); if(!un)return(nullptr); ibo_cur_size+=un->GetCount(); return(un); } bool VertexDataManager::ReleaseIB(DataChain::UserNode *un) { if(!un)return(false); const auto count=un->GetCount(); if(!ibo_data_chain.Release(un)) return(false); ibo_cur_size-=count; return(true); } DataChain::UserNode *VertexDataManager::AcquireVAB(const VkDeviceSize count) { if(count<=0)return(nullptr); DataChain::UserNode *un=vbo_data_chain.Acquire(hgl_align(count,4)); if(!un)return(nullptr); vab_cur_size+=un->GetCount(); return(un); } bool VertexDataManager::ReleaseVAB(DataChain::UserNode *un) { if(!un)return(false); const auto count=un->GetCount(); if(!vbo_data_chain.Release(un)) return(false); vab_cur_size-=count; return(true); } }//namespace graph }//namespace hgl