rsElement.cpp revision 10e5e570bab66a6cd543c857b26c576795eb240f
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++) {
684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        total += mFields[ct].e->mBits;
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);
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    elem->mBits = elem->mComponent.getBits();
117e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    elem->mHasReference = elem->mComponent.isReference();
118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    elem->mFieldCount = stream->loadU32();
120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if(elem->mFieldCount) {
121e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        uint32_t offset = 0;
122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        elem->mFields = new ElementField_t [elem->mFieldCount];
123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) {
124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            stream->loadString(&elem->mFields[ct].name);
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            Element *fieldElem = Element::createFromStream(rsc, stream);
126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            elem->mFields[ct].e.set(fieldElem);
127e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            elem->mFields[ct].offsetBits = offset;
128e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            offset += fieldElem->getSizeBits();
129e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            // Check if our sub-elements have references
130e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            if(fieldElem->mHasReference) {
131e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk                elem->mHasReference = true;
132e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk            }
133fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
134fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // We need to check if this already exists
137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
138fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        Element *ee = rsc->mStateElement.mElements[ct];
139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        if (!ee->getFieldCount() ) {
141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            if((ee->getComponent().getType() == elem->getComponent().getType()) &&
143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getKind() == elem->getComponent().getKind()) &&
144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getIsNormalized() == elem->getComponent().getIsNormalized()) &&
145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getVectorSize() == elem->getComponent().getVectorSize())) {
146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                // Match
147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                delete elem;
148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                ee->incUserRef();
149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                return ee;
150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        } else if (ee->getFieldCount() == elem->mFieldCount) {
153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            bool match = true;
155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            for (uint32_t i=0; i < elem->mFieldCount; i++) {
156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) ||
157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    (ee->mFields[i].name.length() != elem->mFields[i].name.length()) ||
158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    (ee->mFields[i].name != elem->mFields[i].name)) {
159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    match = false;
160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    break;
161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                }
162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            if (match) {
164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                delete elem;
165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                ee->incUserRef();
166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                return ee;
167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    rsc->mStateElement.mElements.push(elem);
173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return elem;
174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
1778154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool isNorm, uint32_t vecSize)
1794815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
1808154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
1818154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
1828154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
1838154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
1848154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
1858154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
1868154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
1878154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
1888154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
1898154954868694e1f233d87d4933a474518b1cb81Jason Sams            ee->incUserRef();
1908154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
1918154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
1928154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
1938154954868694e1f233d87d4933a474518b1cb81Jason Sams
1944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
195d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
196d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mBits = e->mComponent.getBits();
197e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    e->mHasReference = e->mComponent.isReference();
1988154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
1994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2028154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein,
203d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            const char **nin, const size_t * lengths)
2044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2058154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
2068154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2078154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2088154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2098154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2108154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
2118154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
2128154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
2138154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name != nin[i])) {
2148154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2158154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2168154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2178154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2188154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
2198154954868694e1f233d87d4933a474518b1cb81Jason Sams                ee->incUserRef();
2208154954868694e1f233d87d4933a474518b1cb81Jason Sams                return ee;
2218154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2228154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2238154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
2248154954868694e1f233d87d4933a474518b1cb81Jason Sams
2254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
228e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    size_t bits = 0;
2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
232e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->mFields[ct].offsetBits = bits;
233e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        bits += ein[ct]->getSizeBits();
234e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
235e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (ein[ct]->mHasReference) {
236e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            e->mHasReference = true;
237e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
2384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
2394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2408154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
244b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const
245b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{
246b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    String8 s;
247b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
248b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(" ");
249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    if (!mFieldCount) {
252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        // Basic component.
253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(mComponent.getGLSLType());
254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    } else {
255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        rsAssert(0);
256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append("struct ");
257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append(getCStructBody(indent));
258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    return s;
261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
262d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
263e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const
264e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
265e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
266e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
26910e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]);
278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
282e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const
283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
284e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
285e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
286e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
28810e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]);
297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
300d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
3014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
302326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
306326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3088154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
313e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
318d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
319d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
320d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
321d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
322d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            uint32_t vecSize)
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
324d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
3258154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
326d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3278154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
328d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
330d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
331d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             size_t count,
332d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
333d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
334d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const size_t * nameLengths)
335d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
336d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate2 %i", count);
3378154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
338d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3398154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
342417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
343417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
344417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
345417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
346417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
347417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
348417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
349417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
350417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
351417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
352417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
353417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
354417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
355417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
359417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
360417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
361417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    for(uint32_t i = 0; i < dataSize; i ++) {
362417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        ids[i] = (uint32_t)e->getField(i);
363417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
364417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
365417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
366417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
367417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
371