rsElement.cpp revision 0f6f72e19db852cc253fd2fc05459abdf8d5c3af
10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h"
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElement::Element(Context *rsc) : ObjectBase(rsc) {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBits = 0;
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBitsUnpadded = 0;
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mFields = NULL;
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mFieldCount = 0;
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHasReference = false;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memset(&mHal, 0, sizeof(mHal));
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElement::~Element() {
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    clear();
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::preDestroy() const {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mRSC->mStateElement.mElements[ct] == this) {
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mRSC->mStateElement.mElements.removeAt(ct);
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            break;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::clear() {
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mFields;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mFields = NULL;
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mFieldCount = 0;
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHasReference = false;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mHal.state.fields;
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mHal.state.fieldArraySizes;
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mHal.state.fieldNames;
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mHal.state.fieldNameLengths;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete [] mHal.state.fieldOffsetBytes;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinessize_t Element::getSizeBits() const {
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!mFieldCount) {
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mBits;
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t total = 0;
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (size_t ct=0; ct < mFieldCount; ct++) {
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        total += mFields[ct].e->mBits * mFields[ct].arraySize;
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return total;
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinessize_t Element::getSizeBitsUnpadded() const {
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!mFieldCount) {
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mBitsUnpadded;
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t total = 0;
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (size_t ct=0; ct < mFieldCount; ct++) {
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return total;
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::dumpLOGV(const char *prefix) const {
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::dumpLOGV(prefix);
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ALOGV("%s Element: fieldCount: %zu,  size bytes: %zu", prefix, mFieldCount, getSizeBytes());
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mComponent.dumpLOGV(prefix);
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGV("%s Element field index: %u ------------------", prefix, ct);
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines             prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize);
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mFields[ct].e->dumpLOGV(prefix);
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::serialize(Context *rsc, OStream *stream) const {
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Need to identify ourselves
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    stream->addU32((uint32_t)getClassId());
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    String8 name(getName());
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    stream->addString(&name);
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mComponent.serialize(stream);
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Now serialize all the fields
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    stream->addU32(mFieldCount);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        stream->addString(&mFields[ct].name);
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        stream->addU32(mFields[ct].arraySize);
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mFields[ct].e->serialize(rsc, stream);
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElement *Element::createFromStream(Context *rsc, IStream *stream) {
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // First make sure we are reading the correct object
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (classID != RS_A3D_CLASS_ID_ELEMENT) {
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("element loading skipped due to invalid class id\n");
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return NULL;
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    String8 name;
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    stream->loadString(&name);
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Component component;
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    component.loadFromStream(stream);
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t fieldCount = stream->loadU32();
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!fieldCount) {
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return (Element *)Element::create(rsc,
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          component.getType(),
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          component.getKind(),
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          component.getIsNormalized(),
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          component.getVectorSize());
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const Element **subElems = new const Element *[fieldCount];
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const char **subElemNames = new const char *[fieldCount];
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t *subElemNamesLengths = new size_t[fieldCount];
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t *arraySizes = new uint32_t[fieldCount];
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    String8 elemName;
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        stream->loadString(&elemName);
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        subElemNamesLengths[ct] = elemName.length();
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        char *tmpName = new char[subElemNamesLengths[ct]];
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]);
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        subElemNames[ct] = tmpName;
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        arraySizes[ct] = stream->loadU32();
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        subElems[ct] = Element::createFromStream(rsc, stream);
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          subElemNamesLengths, arraySizes);
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        delete [] subElemNames[ct];
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        subElems[ct]->decUserRef();
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete[] subElems;
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete[] subElemNames;
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete[] subElemNamesLengths;
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    delete[] arraySizes;
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return (Element *)elem;
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::compute() {
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.dataType = mComponent.getType();
1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.dataKind = mComponent.getKind();
1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.vectorSize = mComponent.getVectorSize();
1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (mFieldCount == 0) {
1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mBits = mComponent.getBits();
1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mBitsUnpadded = mComponent.getBitsUnpadded();
1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHasReference = mComponent.isReference();
1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.elementSizeBytes = getSizeBytes();
1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return;
1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t noPaddingFieldCount = 0;
1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mFields[ct].name.string()[0] != '#') {
1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            noPaddingFieldCount ++;
1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fields = new const Element*[noPaddingFieldCount];
1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fieldNames = new const char*[noPaddingFieldCount];
1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.fieldsCount = noPaddingFieldCount;
1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t bits = 0;
1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t bitsUnpadded = 0;
1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mFields[ct].offsetBits = bits;
1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mFields[ct].offsetBitsUnpadded = bitsUnpadded;
1990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
2000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
2010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mFields[ct].e->mHasReference) {
2030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mHasReference = true;
2040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mFields[ct].name.string()[0] == '#') {
2070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            continue;
2080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
2110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
2120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string();
2130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0
2140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
2150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ctNoPadding ++;
2170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
2180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mHal.state.elementSizeBytes = getSizeBytes();
2200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
2230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                bool isNorm, uint32_t vecSize) {
2240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<const Element> returnRef;
2250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Look for an existing match.
2260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncLock();
2270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const Element *ee = rsc->mStateElement.mElements[ct];
2290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!ee->getFieldCount() &&
2300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            (ee->getComponent().getType() == dt) &&
2310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            (ee->getComponent().getKind() == dk) &&
2320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            (ee->getComponent().getIsNormalized() == isNorm) &&
2330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            (ee->getComponent().getVectorSize() == vecSize)) {
2340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // Match
2350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            returnRef.set(ee);
2360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ObjectBase::asyncUnlock();
2370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            return ee;
2380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
2400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncUnlock();
2410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Element *e = new Element(rsc);
2430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    returnRef.set(e);
2440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    e->mComponent.set(dt, dk, isNorm, vecSize);
2450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    e->compute();
2460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncLock();
2480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsc->mStateElement.mElements.push(e);
2490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncUnlock();
2500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return returnRef;
2520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
2550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const char **nin, const size_t * lengths, const uint32_t *asin) {
2560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<const Element> returnRef;
2580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Look for an existing match.
2590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncLock();
2600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const Element *ee = rsc->mStateElement.mElements[ct];
2620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (ee->getFieldCount() == count) {
2630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            bool match = true;
2640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (uint32_t i=0; i < count; i++) {
2650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                if ((ee->mFields[i].e.get() != ein[i]) ||
2660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    (ee->mFields[i].name.length() != lengths[i]) ||
2670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    (ee->mFields[i].name != nin[i]) ||
2680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    (ee->mFields[i].arraySize != asin[i])) {
2690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    match = false;
2700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    break;
2710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
2720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (match) {
2740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                returnRef.set(ee);
2750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                ObjectBase::asyncUnlock();
2760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                return returnRef;
2770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
2800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncUnlock();
2810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Element *e = new Element(rsc);
2830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    returnRef.set(e);
2840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    e->mFields = new ElementField_t [count];
2850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    e->mFieldCount = count;
2860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (size_t ct=0; ct < count; ct++) {
2870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        e->mFields[ct].e.set(ein[ct]);
2880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
2890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        e->mFields[ct].arraySize = asin[ct];
2900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
2910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    e->compute();
2920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncLock();
2940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsc->mStateElement.mElements.push(e);
2950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBase::asyncUnlock();
2960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return returnRef;
2980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::incRefs(const void *ptr) const {
3010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!mFieldCount) {
3020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mComponent.isReference()) {
3030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
3040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ObjectBase *ob = obp[0];
3050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (ob) ob->incSysRef();
3060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return;
3080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint8_t *p = static_cast<const uint8_t *>(ptr);
3110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t i=0; i < mFieldCount; i++) {
3120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mFields[i].e->mHasReference) {
3130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
3140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
3150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                mFields[i].e->incRefs(p2);
3160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                p2 += mFields[i].e->getSizeBytes();
3170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::decRefs(const void *ptr) const {
3230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!mFieldCount) {
3240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mComponent.isReference()) {
3250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
3260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ObjectBase *ob = obp[0];
3270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (ob) ob->decSysRef();
3280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return;
3300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint8_t *p = static_cast<const uint8_t *>(ptr);
3330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t i=0; i < mFieldCount; i++) {
3340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mFields[i].e->mHasReference) {
3350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
3360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
3370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                mFields[i].e->decRefs(p2);
3380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                p2 += mFields[i].e->getSizeBytes();
3390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElement::Builder::Builder() {
3450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint32_t initialCapacity = 32;
3460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderElementRefs.setCapacity(initialCapacity);
3470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderElements.setCapacity(initialCapacity);
3480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderNameStrings.setCapacity(initialCapacity);
3490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderNameLengths.setCapacity(initialCapacity);
3500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderArrays.setCapacity(initialCapacity);
3510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) {
3540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderElementRefs.push(ObjectBaseRef<const Element>(e));
3550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderElements.push(e);
3560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderNameStrings.push(nameStr);
3570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderNameLengths.push(strlen(nameStr));
3580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mBuilderArrays.push(arraySize);
3590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<const Element> Element::Builder::create(Context *rsc) {
3630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return Element::createRef(rsc, mBuilderElements.size(),
3640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              &(mBuilderElements.editArray()[0]),
3650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              &(mBuilderNameStrings.editArray()[0]),
3660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              mBuilderNameLengths.editArray(),
3670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              mBuilderArrays.editArray());
3680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElementState::ElementState() {
3720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesElementState::~ElementState() {
3750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(!mElements.size());
3760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/////////////////////////////////////////
3790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//
3800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
3820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
3830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesRsElement rsi_ElementCreate(Context *rsc,
3850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            RsDataType dt,
3860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            RsDataKind dk,
3870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            bool norm,
3880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t vecSize) {
3890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
3900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
3910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesRsElement rsi_ElementCreate2(Context *rsc,
3940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             const RsElement * ein,
3950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             size_t ein_length,
3960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             const char ** names,
3980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             size_t nameLengths_length,
3990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             const size_t * nameLengths,
4000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             const uint32_t * arraySizes,
4020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             size_t arraySizes_length) {
4030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
4040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                      names, nameLengths, arraySizes);
4050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
4060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
4080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
4090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsaElementGetNativeData(RsContext con, RsElement elem,
4110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             uint32_t *elemData, uint32_t elemDataSize) {
4120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(elemDataSize == 5);
4130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
4140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Element *e = static_cast<Element *>(elem);
4150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    (*elemData++) = (uint32_t)e->getType();
4170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    (*elemData++) = (uint32_t)e->getKind();
4180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
4190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    (*elemData++) = e->getComponent().getVectorSize();
4200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    (*elemData++) = e->getFieldCount();
4210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
4220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids,
4240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const char **names, uint32_t *arraySizes, uint32_t dataSize) {
4250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Element *e = static_cast<Element *>(elem);
4260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    rsAssert(e->getFieldCount() == dataSize);
4270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (uint32_t i = 0; i < dataSize; i ++) {
4290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        e->getField(i)->incUserRef();
4300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ids[i] = (uint32_t)e->getField(i);
4310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        names[i] = e->getFieldName(i);
4320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        arraySizes[i] = e->getFieldArraySize(i);
4330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
4340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
435