rsElement.cpp revision 39f2ef6fed00a99c5c389e12c4597884027d4858
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;
33f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
34f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
37e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
41326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element()
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
438154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
448154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateElement.mElements[ct] == this) {
458154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateElement.mElements.removeAt(ct);
468154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
478154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
488154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear()
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    delete [] mFields;
554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
57e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    mHasReference = false;
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
6839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        total += mFields[ct].e->mBits * mFields[ct].arraySize;
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
73e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const
74e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
75e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    LOGV("%s   Element: components %i,  size %i", prefix, mFieldCount, mBits);
774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
78e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        char buf[1024];
79e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        sprintf(buf, "%s component %i: ", prefix, ct);
804815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        //mComponents[ct]->dumpLOGV(buf);
81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
82e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
83e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Element::serialize(OStream *stream) const
85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mComponent.serialize(stream);
93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now serialize all the fields
95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mFieldCount);
96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    for(uint32_t ct = 0; ct < mFieldCount; ct++) {
97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        stream->addString(&mFields[ct].name);
9846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        stream->addU32(mFields[ct].arraySize);
99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        mFields[ct].e->serialize(stream);
100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream)
104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    if(classID != RS_A3D_CLASS_ID_ELEMENT) {
108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("element loading skipped due to invalid class id\n");
109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Element *elem = new Element(rsc);
116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mComponent.loadFromStream(stream);
117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mBits = elem->mComponent.getBits();
118e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    elem->mHasReference = elem->mComponent.isReference();
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mFieldCount = stream->loadU32();
121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if(elem->mFieldCount) {
122e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        uint32_t offset = 0;
123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        elem->mFields = new ElementField_t [elem->mFieldCount];
124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) {
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            stream->loadString(&elem->mFields[ct].name);
12646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            elem->mFields[ct].arraySize = stream->loadU32();
127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            Element *fieldElem = Element::createFromStream(rsc, stream);
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            elem->mFields[ct].e.set(fieldElem);
129e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            elem->mFields[ct].offsetBits = offset;
130e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            offset += fieldElem->getSizeBits();
131e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            // Check if our sub-elements have references
132e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            if(fieldElem->mHasReference) {
133e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk                elem->mHasReference = true;
134e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            }
135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
138fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // We need to check if this already exists
139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        Element *ee = rsc->mStateElement.mElements[ct];
141383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        if(ee->isEqual(elem)) {
142383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            delete elem;
143383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            ee->incUserRef();
144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            return ee;
145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    rsc->mStateElement.mElements.push(elem);
149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return elem;
150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Element::isEqual(const Element *other) const {
153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if(other == NULL) {
154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return false;
155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
156383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if (!other->getFieldCount() && !mFieldCount) {
157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        if((other->getType() == getType()) &&
158383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getKind() == getKind()) &&
159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getComponent().getIsNormalized() == getComponent().getIsNormalized()) &&
160383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk           (other->getComponent().getVectorSize() == getComponent().getVectorSize())) {
161383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            return true;
162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        }
163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return false;
164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if (other->getFieldCount() == mFieldCount) {
166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        for (uint32_t i=0; i < mFieldCount; i++) {
167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            if ((!other->mFields[i].e->isEqual(mFields[i].e.get())) ||
168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].name.length() != mFields[i].name.length()) ||
169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].name != mFields[i].name) ||
170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                (other->mFields[i].arraySize != mFields[i].arraySize)) {
171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk                return false;
172383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            }
173383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        }
174383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return true;
175383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
176383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    return false;
177383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
1798154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
180d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool isNorm, uint32_t vecSize)
1814815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
1828154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
1838154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
1848154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
1858154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
1868154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
1878154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
1888154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
1898154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
1908154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
1918154954868694e1f233d87d4933a474518b1cb81Jason Sams            ee->incUserRef();
1928154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
1938154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
1948154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
1958154954868694e1f233d87d4933a474518b1cb81Jason Sams
1964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
197d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
198d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mBits = e->mComponent.getBits();
199e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    e->mHasReference = e->mComponent.isReference();
2008154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2048154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein,
20546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                            const char **nin, const size_t * lengths, const uint32_t *asin)
2064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2078154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
2088154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2098154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2108154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2118154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2128154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
2138154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
2148154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
21546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].name != nin[i]) ||
21646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].arraySize != asin[i])) {
2178154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2188154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2198154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2208154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2218154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
2228154954868694e1f233d87d4933a474518b1cb81Jason Sams                ee->incUserRef();
2238154954868694e1f233d87d4933a474518b1cb81Jason Sams                return ee;
2248154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2258154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2268154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
2278154954868694e1f233d87d4933a474518b1cb81Jason Sams
2284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
231e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    size_t bits = 0;
2324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
235e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->mFields[ct].offsetBits = bits;
23646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        e->mFields[ct].arraySize = asin[ct];
237e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        bits += ein[ct]->getSizeBits();
238e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
239e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (ein[ct]->mHasReference) {
240e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            e->mHasReference = true;
241e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2448154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
248b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const
249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{
250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    String8 s;
251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(" ");
253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    if (!mFieldCount) {
256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        // Basic component.
257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(mComponent.getGLSLType());
258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    } else {
259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        rsAssert(0);
260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append("struct ");
261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append(getCStructBody(indent));
262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    return s;
265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
266d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const
268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
27310e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
28146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
28246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
28346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->incRefs(p);
28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
286e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
288e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const
291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
29610e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
30446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
30546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
30646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->decRefs(p);
30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
309e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
312d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
3134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
314326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
316e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    const uint32_t initialCapacity = 32;
317e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.setCapacity(initialCapacity);
318e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.setCapacity(initialCapacity);
319e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.setCapacity(initialCapacity);
320e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.setCapacity(initialCapacity);
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
323326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3258154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
328e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderBegin() {
329e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.clear();
330e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.clear();
331e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.clear();
332e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.clear();
333e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
334e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
335e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize) {
336e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderElements.push(e);
337e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameStrings.push(nameStr);
338e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderNameLengths.push(strlen(nameStr));
339e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    mBuilderArrays.push(arraySize);
340e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
341e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
342e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
343e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukconst Element *ElementState::elementBuilderCreate(Context *rsc) {
344e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    return Element::create(rsc, mBuilderElements.size(),
345e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                &(mBuilderElements.editArray()[0]),
346e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                &(mBuilderNameStrings.editArray()[0]),
347e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                mBuilderNameLengths.editArray(),
348e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                mBuilderArrays.editArray());
349e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}
350e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
3514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
353e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
358d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
359d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
360d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
361d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
362d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            uint32_t vecSize)
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
364d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
3658154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
366d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3678154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
368d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
370d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
371d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             size_t count,
372d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
373d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
37446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const size_t * nameLengths,
37546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const uint32_t * arraySizes)
376d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
377d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate2 %i", count);
37846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes);
379d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3808154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
383417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
384417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
385417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
386417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
387417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
388417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
389417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
390417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
391417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
392417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
393417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
394417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
395417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
396417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
397417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
398417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
399417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
400417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
401417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
402417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    for(uint32_t i = 0; i < dataSize; i ++) {
403417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        ids[i] = (uint32_t)e->getField(i);
404417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
405417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
406417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
407417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
408417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
412