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

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

Implement type collapsing for Elements and Types. Now if a user creates two...

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.
parent 5bc54073
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