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 2011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android { 2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript { 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement::Element(Context *rsc) : ObjectBase(rsc) { 244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mBits = 0; 252d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk mBitsUnpadded = 0; 2644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mFields = nullptr; 274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 28e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 29b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk memset(&mHal, 0, sizeof(mHal)); 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 32afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement::~Element() { 33c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk clear(); 34c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 35c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 3649a87772b9abe620d28cbe110260424b8950055dTim Murrayvoid Element::operator delete(void* ptr) { 3749a87772b9abe620d28cbe110260424b8950055dTim Murray if (ptr) { 3849a87772b9abe620d28cbe110260424b8950055dTim Murray Element *e = (Element*) ptr; 3949a87772b9abe620d28cbe110260424b8950055dTim Murray e->getContext()->mHal.funcs.freeRuntimeMem(ptr); 4049a87772b9abe620d28cbe110260424b8950055dTim Murray } 4149a87772b9abe620d28cbe110260424b8950055dTim Murray} 4249a87772b9abe620d28cbe110260424b8950055dTim Murray 43c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::preDestroy() const { 4482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang auto& elements = mRSC->mStateElement.mElements; 4582e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang for (uint32_t ct = 0; ct < elements.size(); ct++) { 4682e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang if (elements[ct] == this) { 4782e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang elements.erase(elements.begin() + ct); 48b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni break; 498154954868694e1f233d87d4933a474518b1cb81Jason Sams } 508154954868694e1f233d87d4933a474518b1cb81Jason Sams } 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::clear() { 5448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams if (mFields) { 5548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams for (size_t i = 0; i < mFieldCount; i++) { 5648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams delete[] mFields[i].name; 5748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams } 5848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams delete [] mFields; 5948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams } 6044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mFields = nullptr; 614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 62e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 63253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 64253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk delete [] mHal.state.fields; 65253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk delete [] mHal.state.fieldArraySizes; 66253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk delete [] mHal.state.fieldNames; 67253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk delete [] mHal.state.fieldNameLengths; 68253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk delete [] mHal.state.fieldOffsetBytes; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Element::getSizeBits() const { 724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 744815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 754815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 7839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk total += mFields[ct].e->mBits * mFields[ct].arraySize; 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouksize_t Element::getSizeBitsUnpadded() const { 842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (!mFieldCount) { 852d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return mBitsUnpadded; 862d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t total = 0; 892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (size_t ct=0; ct < mFieldCount; ct++) { 902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize; 912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return total; 932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::dumpLOGV(const char *prefix) const { 96e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 976598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("%s Element: fieldCount: %zu, size bytes: %zu", prefix, mFieldCount, getSizeBytes()); 98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mComponent.dumpLOGV(prefix); 994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 1006598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("%s Element field index: %u ------------------", prefix, ct); 1016598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("%s name: %s, offsetBits: %u, arraySize: %u", 10248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams prefix, mFields[ct].name, mFields[ct].offsetBits, mFields[ct].arraySize); 103963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk mFields[ct].e->dumpLOGV(prefix); 104e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 105e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 106e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 107e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Element::serialize(Context *rsc, OStream *stream) const { 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 11048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams stream->addString(getName()); 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mComponent.serialize(stream); 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now serialize all the fields 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mFieldCount); 116afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < mFieldCount; ct++) { 11748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams stream->addString(mFields[ct].name); 11846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams stream->addU32(mFields[ct].arraySize); 119e3150cfb3edb028407669e4a65e087eae77e718cJason Sams mFields[ct].e->serialize(rsc, stream); 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 123afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) { 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 126afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ELEMENT) { 127af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("element loading skipped due to invalid class id\n"); 12844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 129fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 130fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 13148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams const char *name = stream->loadString(); 132fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Component component; 134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.loadFromStream(stream); 135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 136c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t fieldCount = stream->loadU32(); 137c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (!fieldCount) { 138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (Element *)Element::create(rsc, 139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getType(), 140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getKind(), 141c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getIsNormalized(), 14279c51ded747d2584e2c86fd61a51f475b611275fYang Ni component.getVectorSize()); 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 145c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **subElems = new const Element *[fieldCount]; 146c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **subElemNames = new const char *[fieldCount]; 147c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk size_t *subElemNamesLengths = new size_t[fieldCount]; 148c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t *arraySizes = new uint32_t[fieldCount]; 149c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 150c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < fieldCount; ct ++) { 15148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams subElemNames[ct] = stream->loadString(); 15248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams subElemNamesLengths[ct] = strlen(subElemNames[ct]); 153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk arraySizes[ct] = stream->loadU32(); 154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElems[ct] = Element::createFromStream(rsc, stream); 155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 156c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 157c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames, 15879c51ded747d2584e2c86fd61a51f475b611275fYang Ni subElemNamesLengths, arraySizes); 159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < fieldCount; ct ++) { 160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete [] subElemNames[ct]; 161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElems[ct]->decUserRef(); 162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 16348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams delete[] name; 164c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElems; 165c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElemNames; 166c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElemNamesLengths; 167c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] arraySizes; 168c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 169c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (Element *)elem; 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk} 171d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() { 173253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mHal.state.dataType = mComponent.getType(); 174253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mHal.state.dataKind = mComponent.getKind(); 175253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mHal.state.vectorSize = mComponent.getVectorSize(); 176253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 177afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mFieldCount == 0) { 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mBits = mComponent.getBits(); 1792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk mBitsUnpadded = mComponent.getBitsUnpadded(); 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = mComponent.isReference(); 181253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 182253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mHal.state.elementSizeBytes = getSizeBytes(); 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 186b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk uint32_t noPaddingFieldCount = 0; 187b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk for (uint32_t ct = 0; ct < mFieldCount; ct ++) { 18848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams if (mFields[ct].name[0] != '#') { 189b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk noPaddingFieldCount ++; 190b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk } 191b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk } 192b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk 193b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fields = new const Element*[noPaddingFieldCount]; 194b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount]; 195b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldNames = new const char*[noPaddingFieldCount]; 196b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount]; 197b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount]; 198b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldsCount = noPaddingFieldCount; 199253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 20054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk size_t bits = 0; 2012d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk size_t bitsUnpadded = 0; 202b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) { 20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mFields[ct].offsetBits = bits; 2042d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk mFields[ct].offsetBitsUnpadded = bitsUnpadded; 20554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize; 2062d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize; 20754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 20854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (mFields[ct].e->mHasReference) { 20954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = true; 21054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 211253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk 21248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams if (mFields[ct].name[0] == '#') { 213b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk continue; 214b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk } 215b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk 216b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fields[ctNoPadding] = mFields[ct].e.get(); 217b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize; 21848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams mHal.state.fieldNames[ctNoPadding] = mFields[ct].name; 21948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams mHal.state.fieldNameLengths[ctNoPadding] = strlen(mFields[ct].name) + 1; // to include 0 220b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3; 221b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk 222b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk ctNoPadding ++; 22354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 22454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 2258b3ca7f67231b4c27ef32d02fee1fe225306ab4fPirama Arumuga Nainar mBits = bits; 2268b3ca7f67231b4c27ef32d02fee1fe225306ab4fPirama Arumuga Nainar mBitsUnpadded = bitsUnpadded; 227253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk mHal.state.elementSizeBytes = getSizeBytes(); 22854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 22954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 230c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk, 231afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk bool isNorm, uint32_t vecSize) { 232c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> returnRef; 2338154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 234c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 2358154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2368154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2378154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 2388154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 2398154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 2408154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 2418154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 2428154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 243c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(ee); 244c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 2458154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2468154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2478154954868694e1f233d87d4933a474518b1cb81Jason Sams } 248c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 2498154954868694e1f233d87d4933a474518b1cb81Jason Sams 250665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray // Element objects must use allocator specified by the driver 251665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0); 252665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray if (!allocMem) { 253665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element"); 25444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 255665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray } 256665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray 257665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray Element *e = new (allocMem) Element(rsc); 258c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(e); 259d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 26054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 261c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 262e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#ifdef RS_FIND_OFFSETS 263e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray ALOGE("pointer for element: %p", e); 264e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray ALOGE("pointer for element.drv: %p", &e->mHal.drv); 265e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#endif 266e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray 267e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray 268c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 26982e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang rsc->mStateElement.mElements.push_back(e); 270c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 271c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 272c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 2734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2744815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 275c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein, 276afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const char **nin, const size_t * lengths, const uint32_t *asin) { 277c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 278c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> returnRef; 2798154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 280c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 2818154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2828154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2838154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2848154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2858154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 286f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams size_t len; 287f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams uint32_t asize = 1; 288f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams if (lengths) { 289f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams len = lengths[i]; 290f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } else { 291f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams len = strlen(nin[i]); 292f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } 293f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams if (asin) { 294f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams asize = asin[i]; 295f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } 296f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams 2978154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 29848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams (strlen(ee->mFields[i].name) != len) || 29948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams strcmp(ee->mFields[i].name, nin[i]) || 300f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams (ee->mFields[i].arraySize != asize)) { 3018154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 3028154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 3038154954868694e1f233d87d4933a474518b1cb81Jason Sams } 3048154954868694e1f233d87d4933a474518b1cb81Jason Sams } 3058154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 306c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(ee); 307c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 308c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 3098154954868694e1f233d87d4933a474518b1cb81Jason Sams } 3108154954868694e1f233d87d4933a474518b1cb81Jason Sams } 3118154954868694e1f233d87d4933a474518b1cb81Jason Sams } 312c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 3138154954868694e1f233d87d4933a474518b1cb81Jason Sams 314665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray // Element objects must use allocator specified by the driver 315665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0); 316665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray if (!allocMem) { 317665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element"); 31844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 319665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray } 320665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray 321665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray Element *e = new (allocMem) Element(rsc); 322c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(e); 3234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 3244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 3254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 326f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams size_t len; 327f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams uint32_t asize = 1; 328f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams if (lengths) { 329f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams len = lengths[ct]; 330f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } else { 331f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams len = strlen(nin[ct]); 332f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } 333f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams if (asin) { 334f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams asize = asin[ct]; 335f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams } 336f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams 3374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 33848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams e->mFields[ct].name = rsuCopyString(nin[ct], len); 339f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams e->mFields[ct].arraySize = asize; 3404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 34154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 3424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 343c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 34482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang rsc->mStateElement.mElements.push_back(e); 345c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 346b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 347c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 348b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 349d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 350afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const { 351e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 352e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 353e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 354e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 35510e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 356e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 357e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 358e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 359e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 360e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 361e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 362e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 36349464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; 36446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 36549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk mFields[i].e->incRefs(p2); 36649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk p2 += mFields[i].e->getSizeBytes(); 36746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 368e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 369e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 370e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 371e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 372afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const { 373e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 374e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 375e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 376e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 37710e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 378e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 379e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 380e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 381e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 382e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 383e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 384e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 38549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; 38646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 38749464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk mFields[i].e->decRefs(p2); 38849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk p2 += mFields[i].e->getSizeBytes(); 38946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 390e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 391e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 392e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 393d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 394a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid Element::callUpdateCacheObject(const Context *rsc, void *dstObj) const { 39544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (rsc->mHal.funcs.element.updateCachedObject != nullptr) { 396a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams rsc->mHal.funcs.element.updateCachedObject(rsc, this, (rs_element *)dstObj); 397a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams } else { 398a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams *((const void **)dstObj) = this; 399a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams } 400a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams} 401a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams 402afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() { 403326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 404326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 405afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() { 4068154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 410e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 412d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 413d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 414d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 415d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 41679c51ded747d2584e2c86fd61a51f475b611275fYang Ni uint32_t vecSize) { 41779c51ded747d2584e2c86fd61a51f475b611275fYang Ni return (RsElement)Element::create(rsc, dt, dk, norm, vecSize); 418d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 4194815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 4202008747941749ad27fe80663d23036ac320e998fJason Sams 421d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 422d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 42370b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk size_t ein_length, 4242008747941749ad27fe80663d23036ac320e998fJason Sams 425d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 42670b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk size_t nameLengths_length, 4272008747941749ad27fe80663d23036ac320e998fJason Sams const size_t * nameLengths, 4282008747941749ad27fe80663d23036ac320e998fJason Sams 42970b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk const uint32_t * arraySizes, 43079c51ded747d2584e2c86fd61a51f475b611275fYang Ni size_t arraySizes_length) { 431c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (RsElement)Element::create(rsc, ein_length, (const Element **)ein, 43279c51ded747d2584e2c86fd61a51f475b611275fYang Ni names, nameLengths, arraySizes); 433326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 434326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43511496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript 43611496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android 437