diff options
Diffstat (limited to 'libs/rs/rsElement.cpp')
-rw-r--r-- | libs/rs/rsElement.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp index dff9585..fb2892c 100644 --- a/libs/rs/rsElement.cpp +++ b/libs/rs/rsElement.cpp @@ -27,6 +27,7 @@ Element::Element(Context *rsc) : ObjectBase(rsc) { mFields = NULL; mFieldCount = 0; mHasReference = false; + memset(&mHal, 0, sizeof(mHal)); } Element::~Element() { @@ -47,6 +48,12 @@ void Element::clear() { mFields = NULL; mFieldCount = 0; mHasReference = false; + + delete [] mHal.state.fields; + delete [] mHal.state.fieldArraySizes; + delete [] mHal.state.fieldNames; + delete [] mHal.state.fieldNameLengths; + delete [] mHal.state.fieldOffsetBytes; } size_t Element::getSizeBits() const { @@ -157,16 +164,36 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) { } void Element::compute() { + mHal.state.dataType = mComponent.getType(); + mHal.state.dataKind = mComponent.getKind(); + mHal.state.vectorSize = mComponent.getVectorSize(); + if (mFieldCount == 0) { mBits = mComponent.getBits(); mBitsUnpadded = mComponent.getBitsUnpadded(); mHasReference = mComponent.isReference(); + + mHal.state.elementSizeBytes = getSizeBytes(); return; } + uint32_t noPaddingFieldCount = 0; + for (uint32_t ct = 0; ct < mFieldCount; ct ++) { + if (mFields[ct].name.string()[0] != '#') { + noPaddingFieldCount ++; + } + } + + mHal.state.fields = new const Element*[noPaddingFieldCount]; + mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount]; + mHal.state.fieldNames = new const char*[noPaddingFieldCount]; + mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount]; + mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount]; + mHal.state.fieldsCount = noPaddingFieldCount; + size_t bits = 0; size_t bitsUnpadded = 0; - for (size_t ct=0; ct < mFieldCount; ct++) { + for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) { mFields[ct].offsetBits = bits; mFields[ct].offsetBitsUnpadded = bitsUnpadded; bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize; @@ -175,8 +202,21 @@ void Element::compute() { if (mFields[ct].e->mHasReference) { mHasReference = true; } + + if (mFields[ct].name.string()[0] == '#') { + continue; + } + + mHal.state.fields[ctNoPadding] = mFields[ct].e.get(); + mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize; + mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string(); + mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0 + mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3; + + ctNoPadding ++; } + mHal.state.elementSizeBytes = getSizeBytes(); } ObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk, |