rsElement.cpp revision 44bef6fba6244292b751387f3d6c31cca96c28ad
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;
2744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    mFields = nullptr;
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 {
4593d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes    auto &elements = mRSC->mStateElement.mElements;
4693d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes
4793d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes    for (auto elIter = elements.begin(), endIter = elements.end();
4893d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes         elIter != endIter; elIter++) {
4993d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes
5093d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes        if (this == *elIter) {
5193d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes            elements.erase(elIter);
5293d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes            return;
538154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
548154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
57afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::clear() {
5848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    if (mFields) {
5948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        for (size_t i = 0; i < mFieldCount; i++) {
6048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams            delete[] mFields[i].name;
6148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        }
6248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        delete [] mFields;
6348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    }
6444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    mFields = nullptr;
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
66e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
67253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
68253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fields;
69253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldArraySizes;
70253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNames;
71253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldNameLengths;
72253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    delete [] mHal.state.fieldOffsetBytes;
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouksize_t Element::getSizeBits() const {
764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
784815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
794815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
814815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
8239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        total += mFields[ct].e->mBits * mFields[ct].arraySize;
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouksize_t Element::getSizeBitsUnpadded() const {
882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (!mFieldCount) {
892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        return mBitsUnpadded;
902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t total = 0;
932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    for (size_t ct=0; ct < mFieldCount; ct++) {
942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
962d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    return total;
972d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
982d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
99afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::dumpLOGV(const char *prefix) const {
100e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
1016598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%s Element: fieldCount: %zu,  size bytes: %zu", prefix, mFieldCount, getSizeBytes());
102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    mComponent.dumpLOGV(prefix);
1034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
1046598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s Element field index: %u ------------------", prefix, ct);
1056598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
10648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams             prefix, mFields[ct].name, mFields[ct].offsetBits, mFields[ct].arraySize);
107963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        mFields[ct].e->dumpLOGV(prefix);
108e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
109e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
110e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
111e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Element::serialize(Context *rsc, OStream *stream) const {
112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
11448ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    stream->addString(getName());
115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mComponent.serialize(stream);
117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now serialize all the fields
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mFieldCount);
120afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
12148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        stream->addString(mFields[ct].name);
12246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        stream->addU32(mFields[ct].arraySize);
123e3150cfb3edb028407669e4a65e087eae77e718cJason Sams        mFields[ct].e->serialize(rsc, stream);
124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
127afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) {
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
129b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
130afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ELEMENT) {
131af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("element loading skipped due to invalid class id\n");
13244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
133fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
134fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
13548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    const char *name = stream->loadString();
136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
137c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Component component;
138c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    component.loadFromStream(stream);
139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t fieldCount = stream->loadU32();
141c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    if (!fieldCount) {
142c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        return (Element *)Element::create(rsc,
143c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getType(),
144c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getKind(),
145c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          component.getIsNormalized(),
146807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                          component.getVectorSize());
147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
149c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element **subElems = new const Element *[fieldCount];
150c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const char **subElemNames = new const char *[fieldCount];
151c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    size_t *subElemNamesLengths = new size_t[fieldCount];
152c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    uint32_t *arraySizes = new uint32_t[fieldCount];
153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
15548ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        subElemNames[ct] = stream->loadString();
15648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        subElemNamesLengths[ct] = strlen(subElemNames[ct]);
157c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        arraySizes[ct] = stream->loadU32();
158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct] = Element::createFromStream(rsc, stream);
159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                          subElemNamesLengths, arraySizes);
163c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
164c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        delete [] subElemNames[ct];
165c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        subElems[ct]->decUserRef();
166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
16748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams    delete[] name;
168c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElems;
169c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNames;
170c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] subElemNamesLengths;
171c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    delete[] arraySizes;
172c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
173c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (Element *)elem;
174383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
175d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() {
177253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataType = mComponent.getType();
178253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.dataKind = mComponent.getKind();
179253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.vectorSize = mComponent.getVectorSize();
180253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
181afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mFieldCount == 0) {
18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mBits = mComponent.getBits();
1832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mBitsUnpadded = mComponent.getBitsUnpadded();
18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mHasReference = mComponent.isReference();
185253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
186253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk        mHal.state.elementSizeBytes = getSizeBytes();
18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        return;
18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
18954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
190b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    uint32_t noPaddingFieldCount = 0;
191b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
19248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        if (mFields[ct].name[0] != '#') {
193b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            noPaddingFieldCount ++;
194b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
195b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    }
196b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
197b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fields = new const Element*[noPaddingFieldCount];
198b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
199b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNames = new const char*[noPaddingFieldCount];
200b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
201b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
202b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    mHal.state.fieldsCount = noPaddingFieldCount;
203253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
20454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    size_t bits = 0;
2052d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    size_t bitsUnpadded = 0;
206b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk    for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
20754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mFields[ct].offsetBits = bits;
2082d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        mFields[ct].offsetBitsUnpadded = bitsUnpadded;
20954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
2102d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
21154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
21254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        if (mFields[ct].e->mHasReference) {
21354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk            mHasReference = true;
21454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        }
215253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
21648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        if (mFields[ct].name[0] == '#') {
217b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk            continue;
218b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        }
219b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
220b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
221b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
22248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        mHal.state.fieldNames[ctNoPadding] = mFields[ct].name;
22348ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        mHal.state.fieldNameLengths[ctNoPadding] = strlen(mFields[ct].name) + 1; // to include 0
224b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
225b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk
226b7c8c521cfa5c8b6801720ad31d026228dc1e784Alex Sakhartchouk        ctNoPadding ++;
22754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
22854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
229253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    mHal.state.elementSizeBytes = getSizeBytes();
23054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
23154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
232c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
233afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                bool isNorm, uint32_t vecSize) {
234c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2358154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
236c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2378154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2388154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2398154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
2408154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
2418154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
2428154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
2438154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
2448154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
245c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            returnRef.set(ee);
246c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            ObjectBase::asyncUnlock();
2478154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
2488154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2498154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
250c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
2518154954868694e1f233d87d4933a474518b1cb81Jason Sams
252665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    // Element objects must use allocator specified by the driver
253665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
254665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    if (!allocMem) {
255665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
25644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
257665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    }
258665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray
259665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    Element *e = new (allocMem) Element(rsc);
260c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
261d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
26254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
263c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
264e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#ifdef RS_FIND_OFFSETS
265e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray    ALOGE("pointer for element: %p", e);
266e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray    ALOGE("pointer for element.drv: %p", &e->mHal.drv);
267e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#endif
268e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray
269e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray
270c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
27193d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes    rsc->mStateElement.mElements.push_back(e);
272c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
273c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
274c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
2754815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
277c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
278afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            const char **nin, const size_t * lengths, const uint32_t *asin) {
279c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
280c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> returnRef;
2818154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
282c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
2838154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2848154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2858154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2868154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2878154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
288f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                size_t len;
289f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                uint32_t asize = 1;
290f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (lengths) {
291f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = lengths[i];
292f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                } else {
293f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    len = strlen(nin[i]);
294f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
295f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                if (asin) {
296f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    asize = asin[i];
297f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                }
298f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
2998154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
30048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    (strlen(ee->mFields[i].name) != len) ||
30148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams                    strcmp(ee->mFields[i].name, nin[i]) ||
302f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams                    (ee->mFields[i].arraySize != asize)) {
3038154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
3048154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
3058154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
3068154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
3078154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
308c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                returnRef.set(ee);
309c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                ObjectBase::asyncUnlock();
310c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                return returnRef;
3118154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
3128154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
3138154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
314c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
3158154954868694e1f233d87d4933a474518b1cb81Jason Sams
316665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    // Element objects must use allocator specified by the driver
317665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
318665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    if (!allocMem) {
319665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray        rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
32044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
321665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    }
322665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray
323665eafe0287f0d12c3f049a4f73b95db6e38b3f0Tim Murray    Element *e = new (allocMem) Element(rsc);
324c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(e);
3254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
3264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
3274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
328f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        size_t len;
329f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        uint32_t asize = 1;
330f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (lengths) {
331f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = lengths[ct];
332f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        } else {
333f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            len = strlen(nin[ct]);
334f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
335f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        if (asin) {
336f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams            asize = asin[ct];
337f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        }
338f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams
3394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
34048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams        e->mFields[ct].name = rsuCopyString(nin[ct], len);
341f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams        e->mFields[ct].arraySize = asize;
3424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
34354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
3444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
345c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
34693d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes    rsc->mStateElement.mElements.push_back(e);
347c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
348b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
349c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
350b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
351d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
352afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::incRefs(const void *ptr) const {
353e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
354e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
355e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
356e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
35710e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
358e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
359e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
360e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
361e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
362e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
363e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
364e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
36549464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
36646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
36749464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->incRefs(p2);
36849464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
36946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
370e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
371e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
372e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
373e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Element::decRefs(const void *ptr) const {
375e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
376e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
377e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
378e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
37910e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
380e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
381e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
382e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
383e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
384e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
385e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
386e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
38749464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
38846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
38949464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                mFields[i].e->decRefs(p2);
39049464a9b664dc8f98e9991a455d27a850bd15ff6Alex Sakhartchouk                p2 += mFields[i].e->getSizeBytes();
39146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
392e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
393e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
394e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
395d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
396a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid Element::callUpdateCacheObject(const Context *rsc, void *dstObj) const {
39744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (rsc->mHal.funcs.element.updateCachedObject != nullptr) {
398a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        rsc->mHal.funcs.element.updateCachedObject(rsc, this, (rs_element *)dstObj);
399a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } else {
400a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        *((const void **)dstObj) = this;
401a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    }
402a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams}
403a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
404afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::ElementState() {
405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
407afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukElementState::~ElementState() {
4088154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
412e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
415326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
416326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
417d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
418d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
419d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
420d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
421afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                            uint32_t vecSize) {
422c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
423d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
4244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
4252008747941749ad27fe80663d23036ac320e998fJason Sams
426d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
427d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
42870b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t ein_length,
4292008747941749ad27fe80663d23036ac320e998fJason Sams
430d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
43170b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t nameLengths_length,
4322008747941749ad27fe80663d23036ac320e998fJason Sams                             const size_t * nameLengths,
4332008747941749ad27fe80663d23036ac320e998fJason Sams
43470b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             const uint32_t * arraySizes,
43570b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchouk                             size_t arraySizes_length) {
436c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
437c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                      names, nameLengths, arraySizes);
438326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
439326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
440dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
441dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
442dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
443c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
444c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                             uint32_t *elemData, uint32_t elemDataSize) {
445417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
446417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
447417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
448417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
449417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
450417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
451417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
452417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
453417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
454417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
455417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
456c2ce707a3d1a8eae79bcf1c749afc6d6e7969ad9Tim Murrayextern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
457099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                              const char **names, size_t *arraySizes, uint32_t dataSize) {
458417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
459417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
460417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
461afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t i = 0; i < dataSize; i ++) {
462f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        e->getField(i)->incUserRef();
463099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray        ids[i] = (uintptr_t)e->getField(i);
464417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
46531aca7dfb577503e789a0ec4e47e8c51d447bfcfAlex Sakhartchouk        arraySizes[i] = e->getFieldArraySize(i);
466417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
467417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
468