Пример #1
0
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;
}