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

Commit 7d73206a authored by Jason Sams's avatar Jason Sams Committed by Android (Google) Code Review
Browse files

Merge "Refcounting in allocations."

parents cc6e6c9f b28ca96f
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