void CalDevice::freeResource(CALresource* res) { std::list<CALresource>::iterator it = mResources.begin(); while (it!=mResources.end()) { if (&(*it)==res) { calResFree(*it); mResources.erase(it); return; } it++; } }
/* Try to unmap resource and free it on failure */ CALresult unmapMWMemRes(MWMemRes* mr) { CALresult err; err = calResUnmap(mr->res); if (err != CAL_RESULT_OK) { cal_warn("Failed to unmap resource", err); if (calResFree(mr->res) != CAL_RESULT_OK) warn("Failed to release CAL resource\n"); else mr->res = 0; } return err; }
/* Try to map the resource and free it on failure */ CALresult mapMWMemRes(MWMemRes* mr, CALvoid** pPtr, CALuint* pitch) { CALresult err; err = calResMap(pPtr, pitch, mr->res, 0); if (err != CAL_RESULT_OK) { cal_warn("Failed to map resource", err); if (calResFree(mr->res) != CAL_RESULT_OK) warn("Failed to release CAL resource\n"); else mr->res = 0; } return err; }
/* Try to get memory handle and cleanup resource if that fails */ static CALresult getMemoryHandle(MWMemRes* mr, MWCALInfo* ci) { CALresult err = CAL_RESULT_OK; err = calCtxGetMem(&mr->mem, ci->calctx, mr->res); if (err != CAL_RESULT_OK) { cal_warn("Failed to get memory handle", err); if (calResFree(mr->res) != CAL_RESULT_OK) warn("Failed to release CAL resource\n"); else mr->res = 0; } return err; }
static CALresult releaseMWMemRes(CALcontext ctx, MWMemRes* mr) { CALresult err = CAL_RESULT_OK; if (mr->mem) { err = calCtxReleaseMem(ctx, mr->mem); if (err != CAL_RESULT_OK) cal_warn("Failed to release CALmem", err); mr->mem = 0; } if (mr->res) { err = calResFree(mr->res); if (err != CAL_RESULT_OK) cal_warn("Failed to release CAL resource", err); mr->res = 0; } return err; }