rsElement.cpp revision 98cc35525b2563bf5c7bf05d856693e16ce71e34
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; 264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 28e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 31afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement::~Element() { 32c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk clear(); 33c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 34c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 35c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::preDestroy() const { 368154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) { 378154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateElement.mElements[ct] == this) { 388154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateElement.mElements.removeAt(ct); 398154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 408154954868694e1f233d87d4933a474518b1cb81Jason Sams } 418154954868694e1f233d87d4933a474518b1cb81Jason Sams } 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::clear() { 454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams delete [] mFields; 464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 48e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Element::getSizeBits() const { 524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 5839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk total += mFields[ct].e->mBits * mFields[ct].arraySize; 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 63afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::dumpLOGV(const char *prefix) const { 64e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 65099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk LOGV("%s Element: fieldCount: %zu, size bytes: %zu", prefix, mFieldCount, getSizeBytes()); 66c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mComponent.dumpLOGV(prefix); 674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 68963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk LOGV("%s Element field index: %u ------------------", prefix, ct); 69963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk LOGV("%s name: %s, offsetBits: %u, arraySize: %u", 70963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize); 71963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk mFields[ct].e->dumpLOGV(prefix); 72e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 73e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 74e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 75afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::serialize(OStream *stream) const { 76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mComponent.serialize(stream); 83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now serialize all the fields 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mFieldCount); 86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < mFieldCount; ct++) { 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&mFields[ct].name); 8846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams stream->addU32(mFields[ct].arraySize); 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mFields[ct].e->serialize(stream); 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 93afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) { 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 95b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 96afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ELEMENT) { 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("element loading skipped due to invalid class id\n"); 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Component component; 105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.loadFromStream(stream); 106fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 107c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t fieldCount = stream->loadU32(); 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (!fieldCount) { 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (Element *)Element::create(rsc, 110c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getType(), 111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getKind(), 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getIsNormalized(), 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk component.getVectorSize());; 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element **subElems = new const Element *[fieldCount]; 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **subElemNames = new const char *[fieldCount]; 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk size_t *subElemNamesLengths = new size_t[fieldCount]; 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t *arraySizes = new uint32_t[fieldCount]; 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk String8 elemName; 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < fieldCount; ct ++) { 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk stream->loadString(&elemName); 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElemNamesLengths[ct] = elemName.length(); 125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk char *tmpName = new char[subElemNamesLengths[ct]]; 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]); 127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElemNames[ct] = tmpName; 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk arraySizes[ct] = stream->loadU32(); 129c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElems[ct] = Element::createFromStream(rsc, stream); 130383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames, 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElemNamesLengths, arraySizes); 134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < fieldCount; ct ++) { 135c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete [] subElemNames[ct]; 136c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk subElems[ct]->decUserRef(); 137383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElems; 139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElemNames; 140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] subElemNamesLengths; 141c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk delete[] arraySizes; 142c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 143c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (Element *)elem; 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk} 145d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 14654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() { 147afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mFieldCount == 0) { 14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mBits = mComponent.getBits(); 14954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = mComponent.isReference(); 15054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 15154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk size_t bits = 0; 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (size_t ct=0; ct < mFieldCount; ct++) { 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mFields[ct].offsetBits = bits; 15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize; 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (mFields[ct].e->mHasReference) { 15954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = true; 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 16454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 165c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk, 166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk bool isNorm, uint32_t vecSize) { 167c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> returnRef; 1688154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 169c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 1708154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1718154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1728154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 1738154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 1748154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 1758154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 1768154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 1778154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 178c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(ee); 179c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 1808154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1818154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1828154954868694e1f233d87d4933a474518b1cb81Jason Sams } 183c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 1848154954868694e1f233d87d4933a474518b1cb81Jason Sams 1854815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 186c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(e); 187d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 189c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 190c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 1918154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 192c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 193c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 194c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 1954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 1964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 197c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein, 198afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const char **nin, const size_t * lengths, const uint32_t *asin) { 199c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 200c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> returnRef; 2018154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 202c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 2038154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2048154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2058154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2068154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2078154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 2088154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 2098154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 21046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].name != nin[i]) || 21146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].arraySize != asin[i])) { 2128154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 2138154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 2148154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2158154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2168154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 217c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(ee); 218c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 219c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 2208154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2218154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2228154954868694e1f233d87d4933a474518b1cb81Jason Sams } 223c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 2248154954868694e1f233d87d4933a474518b1cb81Jason Sams 2254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 226c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(e); 2274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 2284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 23246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams e->mFields[ct].arraySize = asin[ct]; 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 23454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 2354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 236c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 2378154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 238c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 239b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 240c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 241b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 242d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 243afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const { 244e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 245e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 246e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 247e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 24810e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 249e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 250e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 251e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 252e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 253e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 254e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 255e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 25649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; 25746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 25849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk mFields[i].e->incRefs(p2); 25949464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk p2 += mFields[i].e->getSizeBytes(); 26046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 261e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 262e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 263e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 264e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 265afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const { 266e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 27010e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 27849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; 27946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 28049464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk mFields[i].e->decRefs(p2); 28149464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk p2 += mFields[i].e->getSizeBytes(); 28246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 284e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 285e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 286d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 28798cc35525b2563bf5c7bf05d856693e16ce71e34Alex SakhartchoukElement::Builder::Builder() { 28898cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk const uint32_t initialCapacity = 32; 28998cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk mBuilderElementRefs.setCapacity(initialCapacity); 29098cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk mBuilderElements.setCapacity(initialCapacity); 29198cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk mBuilderNameStrings.setCapacity(initialCapacity); 29298cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk mBuilderNameLengths.setCapacity(initialCapacity); 29398cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk mBuilderArrays.setCapacity(initialCapacity); 29498cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk} 29598cc35525b2563bf5c7bf05d856693e16ce71e34Alex Sakhartchouk 296c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) { 297c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderElementRefs.push(ObjectBaseRef<const Element>(e)); 298c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderElements.push(e); 299c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderNameStrings.push(nameStr); 300c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderNameLengths.push(strlen(nameStr)); 301c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderArrays.push(arraySize); 302c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 303c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 304c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 305c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::Builder::create(Context *rsc) { 306c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return Element::createRef(rsc, mBuilderElements.size(), 307c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk &(mBuilderElements.editArray()[0]), 308c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk &(mBuilderNameStrings.editArray()[0]), 309c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderNameLengths.editArray(), 310c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mBuilderArrays.editArray()); 311c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 312c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 3134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 314afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() { 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 317afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() { 3188154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 322e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 324326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 325326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 327d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 328d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 329d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 330d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 331afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t vecSize) { 332c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (RsElement)Element::create(rsc, dt, dk, norm, vecSize); 333d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 3344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 3352008747941749ad27fe80663d23036ac320e998fJason Sams 336d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 337d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 33870b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk size_t ein_length, 3392008747941749ad27fe80663d23036ac320e998fJason Sams 340d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 34170b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk size_t nameLengths_length, 3422008747941749ad27fe80663d23036ac320e998fJason Sams const size_t * nameLengths, 3432008747941749ad27fe80663d23036ac320e998fJason Sams 34470b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk const uint32_t * arraySizes, 34570b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk size_t arraySizes_length) { 346c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return (RsElement)Element::create(rsc, ein_length, (const Element **)ein, 347c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk names, nameLengths, arraySizes); 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 350dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 351dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 352dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 353c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid rsaElementGetNativeData(RsContext con, RsElement elem, 354c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk uint32_t *elemData, uint32_t elemDataSize) { 355417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(elemDataSize == 5); 356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 359417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getType(); 360417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getKind(); 361417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; 362417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getVectorSize(); 363417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getFieldCount(); 364417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 365417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 366c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids, 367c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk const char **names, uint32_t dataSize) { 368417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 369417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(e->getFieldCount() == dataSize); 370417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 371afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < dataSize; i ++) { 372f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams e->getField(i)->incUserRef(); 373417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk ids[i] = (uint32_t)e->getField(i); 374417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk names[i] = e->getFieldName(i); 375417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 376417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 377