summaryrefslogtreecommitdiff
path: root/rsElement.cpp
diff options
context:
space:
mode:
authorAlex Sakhartchouk <alexst@google.com>2010-11-08 15:10:52 -0800
committerAlex Sakhartchouk <alexst@google.com>2010-11-08 15:10:52 -0800
commit54929cce0bf44090424b1f91b676529a2422378f (patch)
tree7c1c8c96a962513360b435263384c0d50f60abbe /rsElement.cpp
parenta77567380b00740001cc3652417e7b70c4ec9fb2 (diff)
downloadrs-54929cce0bf44090424b1f91b676529a2422378f.tar.gz
Moving attrib creation to Mesh. Adding arrays as shader inputs.
Removing fixed size arrays. Change-Id: I0213e403a2f1283dd43f21bea770aeb059561903
Diffstat (limited to 'rsElement.cpp')
-rw-r--r--rsElement.cpp40
1 files changed, 22 insertions, 18 deletions
diff --git a/rsElement.cpp b/rsElement.cpp
index d207dcf0..2ab37298 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -113,24 +113,15 @@ Element *Element::createFromStream(Context *rsc, IStream *stream)
Element *elem = new Element(rsc);
elem->mComponent.loadFromStream(stream);
- elem->mBits = elem->mComponent.getBits();
- elem->mHasReference = elem->mComponent.isReference();
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);
elem->mFields[ct].arraySize = stream->loadU32();
Element *fieldElem = Element::createFromStream(rsc, stream);
elem->mFields[ct].e.set(fieldElem);
- elem->mFields[ct].offsetBits = offset;
- offset += fieldElem->getSizeBits();
- // Check if our sub-elements have references
- if(fieldElem->mHasReference) {
- elem->mHasReference = true;
- }
}
}
@@ -144,6 +135,7 @@ Element *Element::createFromStream(Context *rsc, IStream *stream)
}
}
+ elem->compute();
rsc->mStateElement.mElements.push(elem);
return elem;
}
@@ -175,6 +167,25 @@ bool Element::isEqual(const Element *other) const {
return false;
}
+void Element::compute() {
+ if(mFieldCount == 0) {
+ mBits = mComponent.getBits();
+ mHasReference = mComponent.isReference();
+ return;
+ }
+
+ size_t bits = 0;
+ for (size_t ct=0; ct < mFieldCount; ct++) {
+ mFields[ct].offsetBits = bits;
+ bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
+
+ if (mFields[ct].e->mHasReference) {
+ mHasReference = true;
+ }
+ }
+
+}
+
const Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
bool isNorm, uint32_t vecSize)
{
@@ -194,8 +205,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();
+ e->compute();
rsc->mStateElement.mElements.push(e);
return e;
}
@@ -227,18 +237,12 @@ 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;
e->mFields[ct].arraySize = asin[ct];
- bits += ein[ct]->getSizeBits();
-
- if (ein[ct]->mHasReference) {
- e->mHasReference = true;
- }
}
+ e->compute();
rsc->mStateElement.mElements.push(e);
return e;