1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContext.h"
19565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement::Element(Context *rsc) : ObjectBase(rsc) {
254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mBits = 0;
262d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    mBitsUnpadded = 0;
274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
29e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
30b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    memset(&mHal, 0, sizeof(mHal));
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
33afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement::~Element() {
34c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    clear();
35c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
36c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
37c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::preDestroy() const {
388154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
398154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateElement.mElements[ct] == this) {
408154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateElement.mElements.removeAt(ct);
418154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
428154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
438154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
46afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::clear() {
4748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    if (mFields) {
4848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        for (size_t i = 0; i < mFieldCount; i++) {
4948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams            delete[] mFields[i].name;
5048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        }
5148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        delete [] mFields;
5248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    }
534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
55e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
56253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
57253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fields;
58253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldArraySizes;
59253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNames;
60253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNameLengths;
61253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldOffsetBytes;
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Element::getSizeBits() const {
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
664815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
7139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        total += mFields[ct].e->mBits * mFields[ct].arraySize;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouksize_t Element::getSizeBitsUnpadded() const {
772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (!mFieldCount) {
782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        return mBitsUnpadded;
792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
812d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t total = 0;
822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    for (size_t ct=0; ct < mFieldCount; ct++) {
832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
852d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    return total;
862d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::dumpLOGV(const char *prefix) const {
89e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
906598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%s Element: fieldCount: %zu,  size bytes: %zu", prefix, mFieldCount, getSizeBytes());
91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mComponent.dumpLOGV(prefix);
924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
936598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s Element field index: %u ------------------", prefix, ct);
946598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
9548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams             prefix, mFields[ct].name, mFields[ct].offsetBits, mFields[ct].arraySize);
96963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        mFields[ct].e->dumpLOGV(prefix);
97e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
98e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
99e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
100e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Element::serialize(Context *rsc, OStream *stream) const {
101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
10348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    stream->addString(getName());
104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mComponent.serialize(stream);
106fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now serialize all the fields
108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mFieldCount);
109afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
11048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        stream->addString(mFields[ct].name);
11146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        stream->addU32(mFields[ct].arraySize);
112e3150cfb3edb028407669e4a65e087eae77e718cJason Sams        mFields[ct].e->serialize(rsc, stream);
113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
116afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) {
117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
118b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
119afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ELEMENT) {
120af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("element loading skipped due to invalid class id\n");
121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
12448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    const char *name = stream->loadString();
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Component component;
127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    component.loadFromStream(stream);
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t fieldCount = stream->loadU32();
130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    if (!fieldCount) {
131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        return (Element *)Element::create(rsc,
132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getType(),
133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getKind(),
134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getIsNormalized(),
135807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                          component.getVectorSize());
136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element **subElems = new const Element *[fieldCount];
139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const char **subElemNames = new const char *[fieldCount];
140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    size_t *subElemNamesLengths = new size_t[fieldCount];
141c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t *arraySizes = new uint32_t[fieldCount];
142c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
143c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
14448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        subElemNames[ct] = stream->loadString();
14548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        subElemNamesLengths[ct] = strlen(subElemNames[ct]);
146c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        arraySizes[ct] = stream->loadU32();
147c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct] = Element::createFromStream(rsc, stream);
148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
149c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
150c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
151c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          subElemNamesLengths, arraySizes);
152c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        delete [] subElemNames[ct];
154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct]->decUserRef();
155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
15648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    delete[] name;
157c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElems;
158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNames;
159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNamesLengths;
160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] arraySizes;
161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (Element *)elem;
163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
164d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() {
166253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataType = mComponent.getType();
167253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataKind = mComponent.getKind();
168253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.vectorSize = mComponent.getVectorSize();
169253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
170afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mFieldCount == 0) {
17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mBits = mComponent.getBits();
1722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mBitsUnpadded = mComponent.getBitsUnpadded();
17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mHasReference = mComponent.isReference();
174253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
175253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk        mHal.state.elementSizeBytes = getSizeBytes();
17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        return;
17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
179b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    uint32_t noPaddingFieldCount = 0;
180b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
18148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        if (mFields[ct].name[0] != '#') {
182b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            noPaddingFieldCount ++;
183b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
184b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    }
185b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
186b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fields = new const Element*[noPaddingFieldCount];
187b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
188b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNames = new const char*[noPaddingFieldCount];
189b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
190b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
191b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldsCount = noPaddingFieldCount;
192253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
19354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    size_t bits = 0;
1942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t bitsUnpadded = 0;
195b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mFields[ct].offsetBits = bits;
1972d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mFields[ct].offsetBitsUnpadded = bitsUnpadded;
19854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
1992d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
20054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
20154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        if (mFields[ct].e->mHasReference) {
20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk            mHasReference = true;
20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        }
204253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
20548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        if (mFields[ct].name[0] == '#') {
206b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            continue;
207b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
208b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
209b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
210b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
21148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        mHal.state.fieldNames[ctNoPadding] = mFields[ct].name;
21248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        mHal.state.fieldNameLengths[ctNoPadding] = strlen(mFields[ct].name) + 1; // to include 0
213b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
214b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
215b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        ctNoPadding ++;
21654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
21754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
218253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.elementSizeBytes = getSizeBytes();
21954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
22054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
221c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
222afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                bool isNorm, uint32_t vecSize) {
223c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2248154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
225c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2268154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2278154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2288154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
2298154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
2308154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
2318154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
2328154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
2338154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
234c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            returnRef.set(ee);
235c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            ObjectBase::asyncUnlock();
2368154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
2378154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2388154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
239c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2408154954868694e1f233d87d4933a474518b1cb81Jason Sams
2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
242c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
243d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
24454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
245c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
246c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2478154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
248c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
249c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
250c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
2514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
253c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
254afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            const char **nin, const size_t * lengths, const uint32_t *asin) {
255c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
256c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2578154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
258c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2598154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2608154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2618154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2628154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2638154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
264f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                size_t len;
265f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                uint32_t asize = 1;
266f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (lengths) {
267f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = lengths[i];
268f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                } else {
269f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = strlen(nin[i]);
270f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
271f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (asin) {
272f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    asize = asin[i];
273f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
274f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
2758154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
27648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    (strlen(ee->mFields[i].name) != len) ||
27748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    strcmp(ee->mFields[i].name, nin[i]) ||
278f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    (ee->mFields[i].arraySize != asize)) {
2798154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2808154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2818154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2828154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2838154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
284c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                returnRef.set(ee);
285c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                ObjectBase::asyncUnlock();
286c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                return returnRef;
2878154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2888154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2898154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
290c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2918154954868694e1f233d87d4933a474518b1cb81Jason Sams
2924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
293c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
2944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
2964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
297f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        size_t len;
298f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        uint32_t asize = 1;
299f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (lengths) {
300f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = lengths[ct];
301f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        } else {
302f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = strlen(nin[ct]);
303f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
304f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (asin) {
305f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            asize = asin[ct];
306f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
307f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
3084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
30948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        e->mFields[ct].name = rsuCopyString(nin[ct], len);
310f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        e->mFields[ct].arraySize = asize;
3114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
31254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
3134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
314c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
3158154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
316c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
317b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
318c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
319b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
320d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
321afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const {
322e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
323e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
324e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
325e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
32610e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
327e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
328e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
329e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
330e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
331e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
332e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
333e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
33449464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
33546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
33649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->incRefs(p2);
33749464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
33846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
339e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
340e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
341e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
342e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
343afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const {
344e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
345e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
346e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
347e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
34810e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
349e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
350e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
351e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
352e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
353e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
354e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
355e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
35649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
35746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
35849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->decRefs(p2);
35949464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
36046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
361e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
362e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
363e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
364d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
365afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() {
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() {
3698154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
373e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
378d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
379d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
380d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
381d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
382afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            uint32_t vecSize) {
383c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
384d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3854815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
3862008747941749ad27fe80663d23036ac320e998fJason Sams
387d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
388d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
38970b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t ein_length,
3902008747941749ad27fe80663d23036ac320e998fJason Sams
391d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
39270b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t nameLengths_length,
3932008747941749ad27fe80663d23036ac320e998fJason Sams                             const size_t * nameLengths,
3942008747941749ad27fe80663d23036ac320e998fJason Sams
39570b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             const uint32_t * arraySizes,
39670b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t arraySizes_length) {
397c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
398c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                      names, nameLengths, arraySizes);
399326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
400326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
401dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
402dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
403dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
404c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
405c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                             uint32_t *elemData, uint32_t elemDataSize) {
406417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
407417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
408417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
409417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
410417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
411417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
412417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
413417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
414417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
415417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
416417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
417c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
418099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                              const char **names, size_t *arraySizes, uint32_t dataSize) {
419417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
420417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
421417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
422afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t i = 0; i < dataSize; i ++) {
423f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        e->getField(i)->incUserRef();
424099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray        ids[i] = (uintptr_t)e->getField(i);
425417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
42631aca7dfb577503e789a0ec4e47e8c51d447bfcfAlex Sakhartchouk        arraySizes[i] = e->getFieldArraySize(i);
427417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
428417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
429