rsElement.cpp revision 54929cce0bf44090424b1f91b676529a2422378f
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#ifndef ANDROID_RS_BUILD_FOR_HOST
19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContext.h"
20565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams#include <GLES/gl.h>
21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h"
23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h>
24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif
25565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsElement::Element(Context *rsc) : ObjectBase(rsc)
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mBits = 0;
334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
35e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
39326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element()
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
418154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
428154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateElement.mElements[ct] == this) {
438154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateElement.mElements.removeAt(ct);
448154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
458154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
468154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear()
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    delete [] mFields;
534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
55e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
6639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        total += mFields[ct].e->mBits * mFields[ct].arraySize;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
71e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const
72e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
73e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
74963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk    LOGV("%s Element: fieldCount: %i,  size bytes: %i", prefix, mFieldCount, getSizeBytes());
754815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
76963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        LOGV("%s Element field index: %u ------------------", prefix, ct);
77963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        LOGV("%s name: %s, offsetBits: %u, arraySize: %u",
78963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk             prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize);
79963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk        mFields[ct].e->dumpLOGV(prefix);
80e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
82e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Element::serialize(OStream *stream) const
84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mComponent.serialize(stream);
92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now serialize all the fields
94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mFieldCount);
95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    for(uint32_t ct = 0; ct < mFieldCount; ct++) {
96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        stream->addString(&mFields[ct].name);
9746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        stream->addU32(mFields[ct].arraySize);
98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        mFields[ct].e->serialize(stream);
99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream)
103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    if(classID != RS_A3D_CLASS_ID_ELEMENT) {
107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("element loading skipped due to invalid class id\n");
108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Element *elem = new Element(rsc);
115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mComponent.loadFromStream(stream);
116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mFieldCount = stream->loadU32();
118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if(elem->mFieldCount) {
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        elem->mFields = new ElementField_t [elem->mFieldCount];
120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) {
121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            stream->loadString(&elem->mFields[ct].name);
12246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            elem->mFields[ct].arraySize = stream->loadU32();
123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            Element *fieldElem = Element::createFromStream(rsc, stream);
124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            elem->mFields[ct].e.set(fieldElem);
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // We need to check if this already exists
129fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
130fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        Element *ee = rsc->mStateElement.mElements[ct];
131383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        if(ee->isEqual(elem)) {
132225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams            ObjectBase::checkDelete(elem);
133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            ee->incUserRef();
134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            return ee;
135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
13854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    elem->compute();
139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    rsc->mStateElement.mElements.push(elem);
140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return elem;
141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
143383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Element::isEqual(const Element *other) const {
144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if(other == NULL) {
145383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return false;
146383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
147383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if (!other->getFieldCount() && !mFieldCount) {
148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        if((other->getType() == getType()) &&
149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getKind() == getKind()) &&
150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getComponent().getIsNormalized() == getComponent().getIsNormalized()) &&
151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getComponent().getVectorSize() == getComponent().getVectorSize())) {
152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            return true;
153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        }
154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return false;
155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
156383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if (other->getFieldCount() == mFieldCount) {
157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        for (uint32_t i=0; i < mFieldCount; i++) {
158383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            if ((!other->mFields[i].e->isEqual(mFields[i].e.get())) ||
159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].name.length() != mFields[i].name.length()) ||
160383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].name != mFields[i].name) ||
161383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].arraySize != mFields[i].arraySize)) {
162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                return false;
163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            }
164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        }
165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return true;
166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    return false;
168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() {
17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    if(mFieldCount == 0) {
17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mBits = mComponent.getBits();
17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mHasReference = mComponent.isReference();
17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        return;
17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    size_t bits = 0;
17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    for (size_t ct=0; ct < mFieldCount; ct++) {
17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        mFields[ct].offsetBits = bits;
18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        if (mFields[ct].e->mHasReference) {
18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk            mHasReference = true;
18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk        }
18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    }
18654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk}
18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
1898154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool isNorm, uint32_t vecSize)
1914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
1928154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
1938154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
1948154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
1958154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
1968154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
1978154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
1988154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
1998154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
2008154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
2018154954868694e1f233d87d4933a474518b1cb81Jason Sams            ee->incUserRef();
2028154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
2038154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2048154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
2058154954868694e1f233d87d4933a474518b1cb81Jason Sams
2064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
207d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
20854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
2098154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2124815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2138154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein,
21446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                            const char **nin, const size_t * lengths, const uint32_t *asin)
2154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2168154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
2178154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2188154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2198154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2208154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2218154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
2228154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
2238154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
22446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].name != nin[i]) ||
22546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].arraySize != asin[i])) {
2268154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2278154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2288154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2298154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2308154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
2318154954868694e1f233d87d4933a474518b1cb81Jason Sams                ee->incUserRef();
2328154954868694e1f233d87d4933a474518b1cb81Jason Sams                return ee;
2338154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2348154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2358154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
2368154954868694e1f233d87d4933a474518b1cb81Jason Sams
2374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
2404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
24346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        e->mFields[ct].arraySize = asin[ct];
2444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
24554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    e->compute();
2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2478154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const
252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{
253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    String8 s;
254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(" ");
256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    if (!mFieldCount) {
259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        // Basic component.
260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(mComponent.getGLSLType());
261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    } else {
262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        rsAssert(0);
263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append("struct ");
264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append(getCStructBody(indent));
265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
266b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
267b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    return s;
268b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
269d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const
271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
27610e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
282e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
28646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->incRefs(p);
28746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
28846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const
294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
29910e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
304e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
305e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
306e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
30946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->decRefs(p);
31046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
31146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
313e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
314e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
315d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
3164815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
317326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
319e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    const uint32_t initialCapacity = 32;
320e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.setCapacity(initialCapacity);
321e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.setCapacity(initialCapacity);
322e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.setCapacity(initialCapacity);
323e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.setCapacity(initialCapacity);
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
326326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3288154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
331e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderBegin() {
332e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.clear();
333e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.clear();
334e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.clear();
335e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.clear();
336e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
337e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
338e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize) {
339e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.push(e);
340e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.push(nameStr);
341e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.push(strlen(nameStr));
342e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.push(arraySize);
343e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
344e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
345e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
346e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukconst Element *ElementState::elementBuilderCreate(Context *rsc) {
347e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    return Element::create(rsc, mBuilderElements.size(),
348e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                &(mBuilderElements.editArray()[0]),
349e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                &(mBuilderNameStrings.editArray()[0]),
350e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                mBuilderNameLengths.editArray(),
351e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                mBuilderArrays.editArray());
352e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
353e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
3544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
356e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
361d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
362d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
363d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
364d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
365d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            uint32_t vecSize)
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
367d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
3688154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
369d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3708154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
371d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
373d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
374d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             size_t count,
375d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
376d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
37746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const size_t * nameLengths,
37846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const uint32_t * arraySizes)
379d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
380d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate2 %i", count);
38146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes);
382d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3838154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
386dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
387dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
388dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
389dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaElementGetNativeData(RsContext con, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
390417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
391417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
392417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
393417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
394417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
395417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
396417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
397417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
398417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
399417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
400417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
401417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
402417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
403dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
404417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
405417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
406417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
407417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
408417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    for(uint32_t i = 0; i < dataSize; i ++) {
409f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        e->getField(i)->incUserRef();
410417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        ids[i] = (uint32_t)e->getField(i);
411417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
412417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
413417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
414417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
415