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() {
474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    delete [] mFields;
484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
50e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
51253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
52253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fields;
53253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldArraySizes;
54253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNames;
55253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNameLengths;
56253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldOffsetBytes;
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Element::getSizeBits() const {
604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
6639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        total += mFields[ct].e->mBits * mFields[ct].arraySize;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
712d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouksize_t Element::getSizeBitsUnpadded() const {
722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (!mFieldCount) {
732d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        return mBitsUnpadded;
742d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t total = 0;
772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    for (size_t ct=0; ct < mFieldCount; ct++) {
782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    return total;
812d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::dumpLOGV(const char *prefix) const {
84e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
856598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%s Element: fieldCount: %zu,  size bytes: %zu", prefix, mFieldCount, getSizeBytes());
86c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mComponent.dumpLOGV(prefix);
874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
886598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s Element field index: %u ------------------", prefix, ct);
896598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
90963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk             prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize);
91963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        mFields[ct].e->dumpLOGV(prefix);
92e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
93e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
94e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
95e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Element::serialize(Context *rsc, OStream *stream) const {
96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mComponent.serialize(stream);
103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now serialize all the fields
105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mFieldCount);
106afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        stream->addString(&mFields[ct].name);
10846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        stream->addU32(mFields[ct].arraySize);
109e3150cfb3edb028407669e4a65e087eae77e718cJason Sams        mFields[ct].e->serialize(rsc, stream);
110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
113afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) {
114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
116afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ELEMENT) {
117af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("element loading skipped due to invalid class id\n");
118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Component component;
125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    component.loadFromStream(stream);
126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t fieldCount = stream->loadU32();
128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    if (!fieldCount) {
129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        return (Element *)Element::create(rsc,
130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getType(),
131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getKind(),
132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getIsNormalized(),
133807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                          component.getVectorSize());
134fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
136c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element **subElems = new const Element *[fieldCount];
137c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const char **subElemNames = new const char *[fieldCount];
138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    size_t *subElemNamesLengths = new size_t[fieldCount];
139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t *arraySizes = new uint32_t[fieldCount];
140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
141c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    String8 elemName;
142c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
143c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        stream->loadString(&elemName);
144c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElemNamesLengths[ct] = elemName.length();
145c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        char *tmpName = new char[subElemNamesLengths[ct]];
146c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]);
147c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElemNames[ct] = tmpName;
148c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        arraySizes[ct] = stream->loadU32();
149c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct] = Element::createFromStream(rsc, stream);
150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
151c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
152c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          subElemNamesLengths, arraySizes);
154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
155c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        delete [] subElemNames[ct];
156c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct]->decUserRef();
157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElems;
159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNames;
160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNamesLengths;
161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] arraySizes;
162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
163c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (Element *)elem;
164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() {
167253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataType = mComponent.getType();
168253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataKind = mComponent.getKind();
169253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.vectorSize = mComponent.getVectorSize();
170253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
171afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mFieldCount == 0) {
17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mBits = mComponent.getBits();
1732d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mBitsUnpadded = mComponent.getBitsUnpadded();
17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mHasReference = mComponent.isReference();
175253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
176253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk        mHal.state.elementSizeBytes = getSizeBytes();
17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        return;
17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
180b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    uint32_t noPaddingFieldCount = 0;
181b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
182b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        if (mFields[ct].name.string()[0] != '#') {
183b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            noPaddingFieldCount ++;
184b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
185b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    }
186b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
187b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fields = new const Element*[noPaddingFieldCount];
188b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
189b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNames = new const char*[noPaddingFieldCount];
190b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
191b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
192b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldsCount = noPaddingFieldCount;
193253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
19454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    size_t bits = 0;
1952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t bitsUnpadded = 0;
196b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
19754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mFields[ct].offsetBits = bits;
1982d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mFields[ct].offsetBitsUnpadded = bitsUnpadded;
19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
2002d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
20154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        if (mFields[ct].e->mHasReference) {
20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk            mHasReference = true;
20454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        }
205253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
206b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        if (mFields[ct].name.string()[0] == '#') {
207b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            continue;
208b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
209b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
210b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
211b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
212b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string();
213b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0
214b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
215b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
216b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        ctNoPadding ++;
21754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
21854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
219253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.elementSizeBytes = getSizeBytes();
22054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
22154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
222c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                bool isNorm, uint32_t vecSize) {
224c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2258154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
226c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2278154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2288154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2298154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
2308154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
2318154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
2328154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
2338154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
2348154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
235c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            returnRef.set(ee);
236c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            ObjectBase::asyncUnlock();
2378154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
2388154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2398154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
240c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2418154954868694e1f233d87d4933a474518b1cb81Jason Sams
2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
243c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
244d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
24554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
246c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
247c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2488154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
249c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
250c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
251c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
2524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
254c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
255afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            const char **nin, const size_t * lengths, const uint32_t *asin) {
256c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
257c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2588154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
259c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2608154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2618154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2628154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2638154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2648154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
2658154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
2668154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
26746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].name != nin[i]) ||
26846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].arraySize != asin[i])) {
2698154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2708154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2718154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2728154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2738154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
274c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                returnRef.set(ee);
275c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                ObjectBase::asyncUnlock();
276c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                return returnRef;
2778154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2788154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2798154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
280c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2818154954868694e1f233d87d4933a474518b1cb81Jason Sams
2824815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
283c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
2844815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2854815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
2864815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2884815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
28946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        e->mFields[ct].arraySize = asin[ct];
2904815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
29154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
2924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
293c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2948154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
295c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
296b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
297c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
298b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
299d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const {
301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
304e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
30510e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
306e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
307e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
308e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
309e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
31349464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
31446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
31549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->incRefs(p2);
31649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
31746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
318e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
319e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
320e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
321e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
322afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const {
323e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
324e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
325e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
326e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
32710e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
328e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
329e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
330e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
331e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
332e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
333e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
334e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
33549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
33646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
33749464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->decRefs(p2);
33849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
33946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
340e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
341e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
342e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
343d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
34498cc35525b2563bf5c7bf05d856693e16ce71e34Alex SakhartchoukElement::Builder::Builder() {
34598cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    const uint32_t initialCapacity = 32;
34698cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    mBuilderElementRefs.setCapacity(initialCapacity);
34798cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    mBuilderElements.setCapacity(initialCapacity);
34898cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    mBuilderNameStrings.setCapacity(initialCapacity);
34998cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    mBuilderNameLengths.setCapacity(initialCapacity);
35098cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk    mBuilderArrays.setCapacity(initialCapacity);
35198cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk}
35298cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk
353c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) {
354c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mBuilderElementRefs.push(ObjectBaseRef<const Element>(e));
355c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mBuilderElements.push(e);
356c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mBuilderNameStrings.push(nameStr);
357c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mBuilderNameLengths.push(strlen(nameStr));
358c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mBuilderArrays.push(arraySize);
359c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
360c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
361c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
362c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::Builder::create(Context *rsc) {
363c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return Element::createRef(rsc, mBuilderElements.size(),
364c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                              &(mBuilderElements.editArray()[0]),
365c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                              &(mBuilderNameStrings.editArray()[0]),
366c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                              mBuilderNameLengths.editArray(),
367c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                              mBuilderArrays.editArray());
368c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
369c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
3704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
371afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() {
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() {
3758154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
379e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
384d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
385d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
386d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
387d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
388afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            uint32_t vecSize) {
389c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
390d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
3922008747941749ad27fe80663d23036ac320e998fJason Sams
393d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
394d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
39570b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t ein_length,
3962008747941749ad27fe80663d23036ac320e998fJason Sams
397d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
39870b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t nameLengths_length,
3992008747941749ad27fe80663d23036ac320e998fJason Sams                             const size_t * nameLengths,
4002008747941749ad27fe80663d23036ac320e998fJason Sams
40170b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             const uint32_t * arraySizes,
40270b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t arraySizes_length) {
403c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
404c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                      names, nameLengths, arraySizes);
405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
407dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
408dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
409dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
410c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid rsaElementGetNativeData(RsContext con, RsElement elem,
411c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                             uint32_t *elemData, uint32_t elemDataSize) {
412417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
413417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
414417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
415417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
416417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
417417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
418417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
419417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
420417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
421417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
422417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
423c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids,
42431aca7dfb577503e789a0ec4e47e8c51d447bfcfAlex Sakhartchouk                              const char **names, uint32_t *arraySizes, uint32_t dataSize) {
425417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
426417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
427417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
428afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t i = 0; i < dataSize; i ++) {
429f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        e->getField(i)->incUserRef();
430417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        ids[i] = (uint32_t)e->getField(i);
431417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
43231aca7dfb577503e789a0ec4e47e8c51d447bfcfAlex Sakhartchouk        arraySizes[i] = e->getFieldArraySize(i);
433417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
434417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
435