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

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

Merge "Implement type collapsing for Elements and Types. Now if a user...

Merge "Implement type collapsing for Elements and Types.  Now if a user creates two or more identical objects we simply reuse the existing object rather than create a new one."
parents 9a686b5c e4c487a7
Loading
Loading
Loading
Loading
+49 −7
Original line number Diff line number Diff line
@@ -34,6 +34,12 @@ Element::Element(Context *rsc) : ObjectBase(rsc)

Element::~Element()
{
    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
        if (mRSC->mStateElement.mElements[ct] == this) {
            mRSC->mStateElement.mElements.removeAt(ct);
            break;
        }
    }
    clear();
}

@@ -78,27 +84,62 @@ void Element::dumpLOGV(const char *prefix) const
}


Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
                            bool isNorm, uint32_t vecSize)
{
    // Look for an existing match.
    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
        const Element *ee = rsc->mStateElement.mElements[ct];
        if (!ee->getFieldCount() &&
            (ee->getComponent().getType() == dt) &&
            (ee->getComponent().getKind() == dk) &&
            (ee->getComponent().getIsNormalized() == isNorm) &&
            (ee->getComponent().getVectorSize() == vecSize)) {
            // Match
            ee->incUserRef();
            return ee;
        }
    }

    Element *e = new Element(rsc);
    e->mComponent.set(dt, dk, isNorm, vecSize);
    e->mBits = e->mComponent.getBits();
    rsc->mStateElement.mElements.push(e);
    return e;
}

Element * Element::create(Context *rsc, size_t count, const Element **ein,
const Element * Element::create(Context *rsc, size_t count, const Element **ein,
                            const char **nin, const size_t * lengths)
{
    // Look for an existing match.
    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
        const Element *ee = rsc->mStateElement.mElements[ct];
        if (ee->getFieldCount() == count) {
            bool match = true;
            for (uint32_t i=0; i < count; i++) {
                if ((ee->mFields[i].e.get() != ein[i]) ||
                    (ee->mFields[i].name.length() != lengths[i]) ||
                    (ee->mFields[i].name != nin[i])) {
                    match = false;
                    break;
                }
            }
            if (match) {
                ee->incUserRef();
                return ee;
            }
        }
    }

    Element *e = new Element(rsc);
    e->mFields = new ElementField_t [count];
    e->mFieldCount = count;

    for (size_t ct=0; ct < count; ct++) {
        e->mFields[ct].e.set(ein[ct]);
        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
    }

    rsc->mStateElement.mElements.push(e);
    return e;
}

@@ -168,6 +209,7 @@ ElementState::ElementState()

ElementState::~ElementState()
{
    rsAssert(!mElements.size());
}


@@ -184,9 +226,9 @@ RsElement rsi_ElementCreate(Context *rsc,
                            uint32_t vecSize)
{
    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
    Element *e = Element::create(rsc, dt, dk, norm, vecSize);
    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
    e->incUserRef();
    return e;
    return (RsElement)e;
}

RsElement rsi_ElementCreate2(Context *rsc,
@@ -196,9 +238,9 @@ RsElement rsi_ElementCreate2(Context *rsc,
                             const size_t * nameLengths)
{
    //LOGE("rsi_ElementCreate2 %i", count);
    Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
    e->incUserRef();
    return e;
    return (RsElement)e;
}


+4 −2
Original line number Diff line number Diff line
@@ -60,9 +60,9 @@ public:

    void dumpLOGV(const char *prefix) const;

    static Element * create(Context *rsc, RsDataType dt, RsDataKind dk,
    static const Element * create(Context *rsc, RsDataType dt, RsDataKind dk,
                            bool isNorm, uint32_t vecSize);
    static Element * create(Context *rsc, size_t count, const Element **,
    static const Element * create(Context *rsc, size_t count, const Element **,
                            const char **, const size_t * lengths);

protected:
@@ -89,6 +89,8 @@ public:
    ElementState();
    ~ElementState();

    // Cache of all existing elements.
    Vector<const Element *> mElements;
};


+1 −0
Original line number Diff line number Diff line
@@ -191,6 +191,7 @@ void ObjectBase::dumpAll(Context *rsc)
    LOGV("Dumping all objects");
    const ObjectBase * o = rsc->mObjHead;
    while (o) {
        LOGV(" Object %p", o);
        o->dumpLOGV("  ");
        o = o->mNext;
    }
+1 −1
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public:
protected:
    const char *mAllocFile;
    uint32_t mAllocLine;
    Context *mRSC;

private:
    void add() const;
@@ -64,7 +65,6 @@ private:
    bool checkDelete() const;

    char * mName;
    Context *mRSC;
    mutable int32_t mSysRefCount;
    mutable int32_t mUserRefCount;

+1 −1
Original line number Diff line number Diff line
@@ -364,7 +364,7 @@ ProgramVertexState::~ProgramVertexState()

void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h)
{
    RsElement e = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1);
    RsElement e = (RsElement) Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1);

    rsi_TypeBegin(rsc, e);
    rsi_TypeAdd(rsc, RS_DIMENSION_X, 48);
Loading