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
3749a87772b9abe620d28cbe110260424b8950055dTim Murrayvoid Element::operator delete(void* ptr) {
3849a87772b9abe620d28cbe110260424b8950055dTim Murray    if (ptr) {
3949a87772b9abe620d28cbe110260424b8950055dTim Murray        Element *e = (Element*) ptr;
4049a87772b9abe620d28cbe110260424b8950055dTim Murray        e->getContext()->mHal.funcs.freeRuntimeMem(ptr);
4149a87772b9abe620d28cbe110260424b8950055dTim Murray    }
4249a87772b9abe620d28cbe110260424b8950055dTim Murray}
4349a87772b9abe620d28cbe110260424b8950055dTim Murray
44c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Element::preDestroy() const {
458154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
468154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateElement.mElements[ct] == this) {
478154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateElement.mElements.removeAt(ct);
488154954868694e1f233d87d4933a474518b1cb81Jason Sams            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    }
604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
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");
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
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(),
142807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                          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,
158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          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
225253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.elementSizeBytes = getSizeBytes();
22654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
22754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
228c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
229afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                bool isNorm, uint32_t vecSize) {
230c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2318154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
232c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2338154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2348154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2358154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
2368154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
2378154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
2388154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
2398154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
2408154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
241c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            returnRef.set(ee);
242c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            ObjectBase::asyncUnlock();
2438154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
2448154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2458154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
246c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2478154954868694e1f233d87d4933a474518b1cb81Jason Sams
248665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    // Element objects must use allocator specified by the driver
249665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
250665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    if (!allocMem) {
251665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
252665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        return NULL;
253665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    }
254665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray
255665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    Element *e = new (allocMem) Element(rsc);
256c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
257d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
25854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
259c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
260e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#ifdef RS_FIND_OFFSETS
261e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray    ALOGE("pointer for element: %p", e);
262e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray    ALOGE("pointer for element.drv: %p", &e->mHal.drv);
263e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#endif
264e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray
265e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray
266c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2678154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
268c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
269c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
270c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
2714815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
273c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
274afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            const char **nin, const size_t * lengths, const uint32_t *asin) {
275c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
276c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2778154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
278c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2798154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2808154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2818154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2828154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2838154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
284f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                size_t len;
285f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                uint32_t asize = 1;
286f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (lengths) {
287f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = lengths[i];
288f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                } else {
289f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = strlen(nin[i]);
290f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
291f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (asin) {
292f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    asize = asin[i];
293f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
294f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
2958154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
29648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    (strlen(ee->mFields[i].name) != len) ||
29748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    strcmp(ee->mFields[i].name, nin[i]) ||
298f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    (ee->mFields[i].arraySize != asize)) {
2998154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
3008154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
3018154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
3028154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
3038154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
304c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                returnRef.set(ee);
305c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                ObjectBase::asyncUnlock();
306c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                return returnRef;
3078154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
3088154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
3098154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
310c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
3118154954868694e1f233d87d4933a474518b1cb81Jason Sams
312665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    // Element objects must use allocator specified by the driver
313665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
314665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    if (!allocMem) {
315665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
316665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        return NULL;
317665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    }
318665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray
319665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    Element *e = new (allocMem) Element(rsc);
320c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
3214815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
3224815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
3234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
324f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        size_t len;
325f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        uint32_t asize = 1;
326f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (lengths) {
327f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = lengths[ct];
328f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        } else {
329f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = strlen(nin[ct]);
330f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
331f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (asin) {
332f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            asize = asin[ct];
333f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
334f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
3354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
33648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        e->mFields[ct].name = rsuCopyString(nin[ct], len);
337f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        e->mFields[ct].arraySize = asize;
3384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
33954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
3404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
341c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
3428154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
343c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
344b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
345c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
346b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
347d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
348afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const {
349e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
350e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
351e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
352e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
35310e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
354e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
355e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
356e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
357e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
358e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
359e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
360e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
36149464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
36246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
36349464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->incRefs(p2);
36449464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
36546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
366e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
367e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
368e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
369e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
370afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const {
371e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
372e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
373e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
374e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
37510e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
376e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
377e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
378e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
379e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
380e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
381e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
382e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
38349464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
38446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
38549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->decRefs(p2);
38649464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
38746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
388e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
389e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
390e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
391d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
392a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid Element::callUpdateCacheObject(const Context *rsc, void *dstObj) const {
393a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    if (rsc->mHal.funcs.element.updateCachedObject != NULL) {
394a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        rsc->mHal.funcs.element.updateCachedObject(rsc, this, (rs_element *)dstObj);
395a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } else {
396a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        *((const void **)dstObj) = this;
397a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    }
398a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams}
399a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
400afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() {
401326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
402326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
403afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() {
4048154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
408e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
413d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
414d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
415d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
416d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
417afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            uint32_t vecSize) {
418c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
419d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
4204815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
4212008747941749ad27fe80663d23036ac320e998fJason Sams
422d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
423d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
42470b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t ein_length,
4252008747941749ad27fe80663d23036ac320e998fJason Sams
426d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
42770b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t nameLengths_length,
4282008747941749ad27fe80663d23036ac320e998fJason Sams                             const size_t * nameLengths,
4292008747941749ad27fe80663d23036ac320e998fJason Sams
43070b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             const uint32_t * arraySizes,
43170b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t arraySizes_length) {
432c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
433c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                      names, nameLengths, arraySizes);
434326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
435326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
436dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
437dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
438dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
439c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
440c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                             uint32_t *elemData, uint32_t elemDataSize) {
441417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
442417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
443417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
444417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
445417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
446417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
447417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
448417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
449417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
450417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
451417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
452c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
453099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                              const char **names, size_t *arraySizes, uint32_t dataSize) {
454417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
455417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
456417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
457afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t i = 0; i < dataSize; i ++) {
458f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        e->getField(i)->incUserRef();
459099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray        ids[i] = (uintptr_t)e->getField(i);
460417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
46131aca7dfb577503e789a0ec4e47e8c51d447bfcfAlex Sakhartchouk        arraySizes[i] = e->getFieldArraySize(i);
462417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
463417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
464