rsElement.cpp revision 46e45548dc80e801139c9ccc2f2aa927e7f35027
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++) {
6846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        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];
141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        if (!ee->getFieldCount() ) {
143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            if((ee->getComponent().getType() == elem->getComponent().getType()) &&
145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getKind() == elem->getComponent().getKind()) &&
146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getIsNormalized() == elem->getComponent().getIsNormalized()) &&
147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk               (ee->getComponent().getVectorSize() == elem->getComponent().getVectorSize())) {
148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                // Match
149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                delete elem;
150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                ee->incUserRef();
151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                return ee;
152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        } else if (ee->getFieldCount() == elem->mFieldCount) {
155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            bool match = true;
157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            for (uint32_t i=0; i < elem->mFieldCount; i++) {
158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) ||
159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    (ee->mFields[i].name.length() != elem->mFields[i].name.length()) ||
16046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].name != elem->mFields[i].name) ||
16146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].arraySize != elem->mFields[i].arraySize)) {
162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    match = false;
163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                    break;
164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                }
165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            if (match) {
167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                delete elem;
168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                ee->incUserRef();
169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                return ee;
170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            }
171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        }
173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    rsc->mStateElement.mElements.push(elem);
176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return elem;
177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
179d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
1808154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool isNorm, uint32_t vecSize)
1824815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
1838154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
1848154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
1858154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
1868154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
1878154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
1888154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
1898154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
1908154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
1918154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
1928154954868694e1f233d87d4933a474518b1cb81Jason Sams            ee->incUserRef();
1938154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
1948154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
1958154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
1968154954868694e1f233d87d4933a474518b1cb81Jason Sams
1974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
198d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
199d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mBits = e->mComponent.getBits();
200e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    e->mHasReference = e->mComponent.isReference();
2018154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2058154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein,
20646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                            const char **nin, const size_t * lengths, const uint32_t *asin)
2074815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2088154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
2098154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
2108154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
2118154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
2128154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
2138154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
2148154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
2158154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
21646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].name != nin[i]) ||
21746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                    (ee->mFields[i].arraySize != asin[i])) {
2188154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
2198154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
2208154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
2218154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2228154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
2238154954868694e1f233d87d4933a474518b1cb81Jason Sams                ee->incUserRef();
2248154954868694e1f233d87d4933a474518b1cb81Jason Sams                return ee;
2258154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
2268154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
2278154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
2288154954868694e1f233d87d4933a474518b1cb81Jason Sams
2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
232e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    size_t bits = 0;
2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
236e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->mFields[ct].offsetBits = bits;
23746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams        e->mFields[ct].arraySize = asin[ct];
238e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        bits += ein[ct]->getSizeBits();
239e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
240e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (ein[ct]->mHasReference) {
241e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            e->mHasReference = true;
242e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
2444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2458154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const
250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{
251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    String8 s;
252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(" ");
254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    if (!mFieldCount) {
257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        // Basic component.
258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(mComponent.getGLSLType());
259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    } else {
260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        rsAssert(0);
261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append("struct ");
262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append(getCStructBody(indent));
263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    return s;
266b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
267d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const
269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
27410e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->incSysRef();
275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
28246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
28346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->incRefs(p);
28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
28646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
288e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const
292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{
293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (!mFieldCount) {
294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mComponent.isReference()) {
295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            ObjectBase *ob = obp[0];
29710e5e570bab66a6cd543c857b26c576795eb240fJason Sams            if (ob) ob->decSysRef();
298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        return;
300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    for (uint32_t i=0; i < mFieldCount; i++) {
304e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mFields[i].e->mHasReference) {
30546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            p = &p[mFields[i].offsetBits >> 3];
30646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                mFields[i].e->decRefs(p);
30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                p += mFields[i].e->getSizeBytes();
30946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams            }
310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
313d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
3144815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
315326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
319326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
3218154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
326e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
331d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
332d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
333d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
334d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
335d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            uint32_t vecSize)
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
337d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
3388154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
339d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3408154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
341d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
3424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
343d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
344d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             size_t count,
345d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
346d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
34746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const size_t * nameLengths,
34846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams                             const uint32_t * arraySizes)
349d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
350d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate2 %i", count);
35146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes);
352d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
3538154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize)
357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(elemDataSize == 5);
359417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
360417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
361417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
362417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getType();
363417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = (uint32_t)e->getKind();
364417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
365417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getComponent().getVectorSize();
366417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*elemData++) = e->getFieldCount();
367417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
368417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
369417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
370417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize)
371417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
372417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Element *e = static_cast<Element *>(elem);
373417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(e->getFieldCount() == dataSize);
374417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
375417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    for(uint32_t i = 0; i < dataSize; i ++) {
376417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        ids[i] = (uint32_t)e->getField(i);
377417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        names[i] = e->getFieldName(i);
378417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    }
379417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
380417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
381417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
385