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