Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b28ca96f authored by Jason Sams's avatar Jason Sams
Browse files

Refcounting in allocations.

Change-Id: Ida2dfb404b2cd832e622d981d73a938d5bc5b821
parent 05716aa0
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -234,6 +234,12 @@ void Allocation::data(const void *data, uint32_t sizeBytes)
        LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes);
        return;
    }

    if (mType->getElement()->getHasReferences()) {
        incRefs(data, sizeBytes / mType->getElement()->getSizeBytes());
        decRefs(mPtr, sizeBytes / mType->getElement()->getSizeBytes());
    }

    memcpy(mPtr, data, size);
    sendDirty();
    mUploadDefered = true;
@@ -256,6 +262,12 @@ void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32
        mType->dumpLOGV("type info");
        return;
    }

    if (mType->getElement()->getHasReferences()) {
        incRefs(data, count);
        decRefs(ptr, count);
    }

    memcpy(ptr, data, size);
    sendDirty();
    mUploadDefered = true;
@@ -279,6 +291,10 @@ void Allocation::subData(uint32_t xoff, uint32_t yoff,

    for (uint32_t line=yoff; line < (yoff+h); line++) {
        uint8_t * ptr = static_cast<uint8_t *>(mPtr);
        if (mType->getElement()->getHasReferences()) {
            incRefs(src, w);
            decRefs(dst, w);
        }
        memcpy(dst, src, lineSize);
        src += lineSize;
        dst += destW * eSize;
@@ -387,6 +403,32 @@ void Allocation::sendDirty() const
    }
}

void Allocation::incRefs(const void *ptr, size_t ct) const
{
    const uint8_t *p = static_cast<const uint8_t *>(ptr);
    const Element *e = mType->getElement();
    uint32_t stride = e->getSizeBytes();

    while (ct > 0) {
        e->incRefs(p);
        ct --;
        p += stride;
    }
}

void Allocation::decRefs(const void *ptr, size_t ct) const
{
    const uint8_t *p = static_cast<const uint8_t *>(ptr);
    const Element *e = mType->getElement();
    uint32_t stride = e->getSizeBytes();

    while (ct > 0) {
        e->decRefs(p);
        ct --;
        p += stride;
    }
}

/////////////////
//

+3 −0
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ public:
    bool getIsTexture() const {return mIsTexture;}
    bool getIsBufferObject() const {return mIsVertexBuffer;}

    void incRefs(const void *ptr, size_t ct) const;
    void decRefs(const void *ptr, size_t ct) const;

protected:
    void sendDirty() const;

+4 −0
Original line number Diff line number Diff line
@@ -161,6 +161,10 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize)
    mBits = mTypeBits * mVectorSize;
}

bool Component::isReference() const
{
    return (mType >= RS_TYPE_ELEMENT);
}



+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ public:
    void serialize(OStream *stream) const;
    void loadFromStream(IStream *stream);

    bool isReference() const;

protected:
    RsDataType mType;
    RsDataKind mKind;
+50 −9
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ Element::Element(Context *rsc) : ObjectBase(rsc)
    mAllocLine = __LINE__;
    mFields = NULL;
    mFieldCount = 0;
    mHasReference = false;
}


@@ -53,6 +54,7 @@ void Element::clear()
    delete [] mFields;
    mFields = NULL;
    mFieldCount = 0;
    mHasReference = false;
}

size_t Element::getSizeBits() const
@@ -68,15 +70,6 @@ size_t Element::getSizeBits() const
    return total;
}

size_t Element::getFieldOffsetBits(uint32_t componentNumber) const
{
    size_t offset = 0;
    for (uint32_t ct = 0; ct < componentNumber; ct++) {
        offset += mFields[ct].e->mBits;
    }
    return offset;
}

void Element::dumpLOGV(const char *prefix) const
{
    ObjectBase::dumpLOGV(prefix);
@@ -124,11 +117,14 @@ Element *Element::createFromStream(Context *rsc, IStream *stream)

    elem->mFieldCount = stream->loadU32();
    if(elem->mFieldCount) {
        uint32_t offset = 0;
        elem->mFields = new ElementField_t [elem->mFieldCount];
        for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) {
            stream->loadString(&elem->mFields[ct].name);
            Element *fieldElem = Element::createFromStream(rsc, stream);
            elem->mFields[ct].e.set(fieldElem);
            elem->mFields[ct].offsetBits = offset;
            offset += fieldElem->getSizeBits();
        }
    }

@@ -193,6 +189,7 @@ const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
    Element *e = new Element(rsc);
    e->mComponent.set(dt, dk, isNorm, vecSize);
    e->mBits = e->mComponent.getBits();
    e->mHasReference = e->mComponent.isReference();
    rsc->mStateElement.mElements.push(e);
    return e;
}
@@ -223,9 +220,16 @@ const Element * Element::create(Context *rsc, size_t count, const Element **ein,
    Element *e = new Element(rsc);
    e->mFields = new ElementField_t [count];
    e->mFieldCount = count;
    size_t bits = 0;
    for (size_t ct=0; ct < count; ct++) {
        e->mFields[ct].e.set(ein[ct]);
        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
        e->mFields[ct].offsetBits = bits;
        bits += ein[ct]->getSizeBits();

        if (ein[ct]->mHasReference) {
            e->mHasReference = true;
        }
    }

    rsc->mStateElement.mElements.push(e);
@@ -251,6 +255,43 @@ String8 Element::getGLSLType(uint32_t indent) const
    return s;
}

void Element::incRefs(const void *ptr) const
{
    if (!mFieldCount) {
        if (mComponent.isReference()) {
            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
            ObjectBase *ob = obp[0];
            ob->incSysRef();
        }
        return;
    }

    const uint8_t *p = static_cast<const uint8_t *>(ptr);
    for (uint32_t i=0; i < mFieldCount; i++) {
        if (mFields[i].e->mHasReference) {
            mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]);
        }
    }
}

void Element::decRefs(const void *ptr) const
{
    if (!mFieldCount) {
        if (mComponent.isReference()) {
            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
            ObjectBase *ob = obp[0];
            ob->decSysRef();
        }
        return;
    }

    const uint8_t *p = static_cast<const uint8_t *>(ptr);
    for (uint32_t i=0; i < mFieldCount; i++) {
        if (mFields[i].e->mHasReference) {
            mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]);
        }
    }
}


ElementState::ElementState()
Loading