bool GPUMemory::allocate(BaseObject& bo) { GPUMemory::BaseObjectInfo* boInfo = _find(&bo); BaseObject::State state = bo.getState(); if ( boInfo ) { if ( state == BaseObject::ReAlloc ) { // reallocate _dealloc(&bo, boInfo); _alloc(&bo); } else if ( state == BaseObject::NotSync ) { _update(&bo, boInfo); } else // { ( state == BaseObject::Sync ) -> already synchronized } || // { ( state == BaseObject::Blit ) -> updated data is already and exclusively in memory } { return false; } } else { if ( state != BaseObject::ReAlloc ) panic("GPUMemory", "allocate", "Should not happen." "GPUMemory internal info not found for an allocated BaseObject"); _alloc(&bo); } return true; }
void GPUMemory::dump() const { cout << "------ GPUMemory allocated objects ------\n\n"; map<BaseObject*,BaseObjectInfo>::const_iterator it = maps.begin(); for ( ; it != maps.end(); it++ ) { BaseObject* bo = it->first; BaseObjectInfo boi = it->second; cout << "State: "; BaseObject::State state = bo->getState(); switch(state) { case BaseObject::ReAlloc: cout << "ReAlloc"; break; case BaseObject::NotSync: cout << "NotSync"; break; case BaseObject::Sync: cout << "Sync"; break; case BaseObject::Blit: cout << "Blit"; break; default: panic("GPUMemory","dump","Unknown state"); } cout << endl; //cout << "ID_STRING: " << bo->toString().c_str() << " :\n"; cout << " md's: "; for (u32bit i = 0; i < boi.md.size(); i++ ) { cout << boi.md[i] << endl; driver->dumpMD(boi.md[i]); if ( i < boi.md.size() - 1 ) cout << ", "; } cout << "\n size's: "; for (u32bit i = 0; i < boi.size.size(); i++ ) { cout << boi.size[i]; if ( i < boi.size.size() - 1 ) cout << ", "; } cout << "\n Number of portions: " << bo->getNumberOfPortions() << endl << endl; } //driver->dumpMemoryAllocation(); cout << "\n-----------------------------------------" << endl; }
bool GPUMemory::deallocate(BaseObject& bo) { BaseObjectInfo* boInfo = _find(&bo); BaseObject::State state = bo.getState(); if ( boInfo ) _dealloc(&bo, boInfo); else { panic("GPUMemory", "deallocate", "Trying to deallocate a not allocated object"); return false; } return true; }