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 95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::serialize(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); 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mFields[ct].e->serialize(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(), 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 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