Esempio n. 1
0
/* Resource managment */
CALresource* CalDevice::resAllocLocal1D(int width, CALformat format,
                                        CALuint flags)
{
    CALresource newRes;
    if(calResAllocLocal1D(&newRes, mDevice, width, format, flags)
            != CAL_RESULT_OK) {
        fprintf(stderr, "ERROR: Could allocate 1D resource.\n");
        return NULL;
    }

    /* TODO: threadsafe */
    mResources.push_front(newRes);
    CALresource* pRes = &*(mResources.begin());
    mRefs[pRes] = 1;
    mOwners[pRes] = this;
    return pRes;
}
CALresult createConstantBuffer1D(MWMemRes* mr,
                                 MWCALInfo* ci,
                                 const CALvoid* src,
                                 CALformat format,
                                 CALuint width)
{
    CALresult err;
    CALvoid* bufPtr;
    CALuint pitch;

    /* Create buffer */
    err = calResAllocLocal1D(&mr->res, ci->dev, width, format, 0);
    if (err != CAL_RESULT_OK)
    {
        cal_warn("Failed to create constant 1D resource", err);
        releaseMWMemRes(ci->calctx, mr);
        return err;
    }

    /* Map and write to the buffer */
    err = mapMWMemRes(mr, &bufPtr, &pitch);
    if (err != CAL_RESULT_OK)
        return err;

    memcpy(bufPtr, src, formatToSize(format) * width);

    err = unmapMWMemRes(mr);
    if (err != CAL_RESULT_OK)
        return err;

    err = getMemoryHandle(mr, ci);
    if (err != CAL_RESULT_OK)
        return err;

    return CAL_RESULT_OK;
}