Add arrays to elements.
Change-Id: I624b03bfc1fd26136afd9305a96026b91b1fad3c
diff --git a/rs.spec b/rs.spec
index ad162bb..c7fb2af 100644
--- a/rs.spec
+++ b/rs.spec
@@ -80,6 +80,7 @@
param const RsElement * elements
param const char ** names
param const size_t * nameLengths
+ param const uint32_t * arraySize
ret RsElement
}
diff --git a/rsElement.cpp b/rsElement.cpp
index 2602dd4..0b7bb27 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -65,7 +65,7 @@
size_t total = 0;
for (size_t ct=0; ct < mFieldCount; ct++) {
- total += mFields[ct].e->mBits;
+ total += mFields[ct].e->mBits * mFields[ct].arraySize;;
}
return total;
}
@@ -95,6 +95,7 @@
stream->addU32(mFieldCount);
for(uint32_t ct = 0; ct < mFieldCount; ct++) {
stream->addString(&mFields[ct].name);
+ stream->addU32(mFields[ct].arraySize);
mFields[ct].e->serialize(stream);
}
}
@@ -122,6 +123,7 @@
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;
@@ -155,7 +157,8 @@
for (uint32_t i=0; i < elem->mFieldCount; i++) {
if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) ||
(ee->mFields[i].name.length() != elem->mFields[i].name.length()) ||
- (ee->mFields[i].name != elem->mFields[i].name)) {
+ (ee->mFields[i].name != elem->mFields[i].name) ||
+ (ee->mFields[i].arraySize != elem->mFields[i].arraySize)) {
match = false;
break;
}
@@ -200,7 +203,7 @@
}
const Element * Element::create(Context *rsc, size_t count, const Element **ein,
- const char **nin, const size_t * lengths)
+ const char **nin, const size_t * lengths, const uint32_t *asin)
{
// Look for an existing match.
for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
@@ -210,7 +213,8 @@
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])) {
+ (ee->mFields[i].name != nin[i]) ||
+ (ee->mFields[i].arraySize != asin[i])) {
match = false;
break;
}
@@ -230,6 +234,7 @@
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) {
@@ -274,7 +279,11 @@
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]);
+ p = &p[mFields[i].offsetBits >> 3];
+ for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
+ mFields[i].e->incRefs(p);
+ p += mFields[i].e->getSizeBytes();
+ }
}
}
}
@@ -293,7 +302,11 @@
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]);
+ p = &p[mFields[i].offsetBits >> 3];
+ for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
+ mFields[i].e->decRefs(p);
+ p += mFields[i].e->getSizeBytes();
+ }
}
}
}
@@ -331,10 +344,11 @@
size_t count,
const RsElement * ein,
const char ** names,
- const size_t * nameLengths)
+ const size_t * nameLengths,
+ const uint32_t * arraySizes)
{
//LOGE("rsi_ElementCreate2 %i", count);
- const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
+ const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes);
e->incUserRef();
return (RsElement)e;
}
diff --git a/rsElement.h b/rsElement.h
index b5dad7a..42eef4a 100644
--- a/rsElement.h
+++ b/rsElement.h
@@ -66,7 +66,7 @@
static const Element * create(Context *rsc, RsDataType dt, RsDataKind dk,
bool isNorm, uint32_t vecSize);
static const Element * create(Context *rsc, size_t count, const Element **,
- const char **, const size_t * lengths);
+ const char **, const size_t * lengths, const uint32_t *asin);
void incRefs(const void *) const;
void decRefs(const void *) const;
@@ -80,6 +80,7 @@
String8 name;
ObjectBaseRef<const Element> e;
uint32_t offsetBits;
+ uint32_t arraySize;
} ElementField_t;
ElementField_t *mFields;
size_t mFieldCount;
diff --git a/rsFont.cpp b/rsFont.cpp
index 7661d49..5889bfb 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -488,8 +488,9 @@
size_t lengths[2];
lengths[0] = posName.size();
lengths[1] = texName.size();
+ uint32_t arraySizes[2] = {1, 1};
- const Element *vertexDataElem = Element::create(mRSC, 2, elemArray, nameArray, lengths);
+ const Element *vertexDataElem = Element::create(mRSC, 2, elemArray, nameArray, lengths, arraySizes);
Type *vertexDataType = new Type(mRSC);
vertexDataType->setDimX(mMaxNumberOfQuads * 4);