summaryrefslogtreecommitdiffstats
path: root/rsElement.cpp
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-02-17 15:38:10 -0800
committerJason Sams <rjsams@android.com>2010-02-17 15:38:10 -0800
commit8154954868694e1f233d87d4933a474518b1cb81 (patch)
tree589a853c307533891684c168004512ce88724564 /rsElement.cpp
parenta33166c0bf203a25b9a2408c6854d6beb9ffcc77 (diff)
downloadandroid_frameworks_rs-8154954868694e1f233d87d4933a474518b1cb81.tar.gz
android_frameworks_rs-8154954868694e1f233d87d4933a474518b1cb81.tar.bz2
android_frameworks_rs-8154954868694e1f233d87d4933a474518b1cb81.zip
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.
Diffstat (limited to 'rsElement.cpp')
-rw-r--r--rsElement.cpp56
1 files changed, 49 insertions, 7 deletions
diff --git a/rsElement.cpp b/rsElement.cpp
index 207ad15e..6288bc42 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -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;
}