rsElement.cpp revision 8154954868694e1f233d87d4933a474518b1cb81
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#include "rsContext.h"
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
19565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams#include <GLES/gl.h>
20565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
25e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsElement::Element(Context *rsc) : ObjectBase(rsc)
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mBits = 0;
28f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
29f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
35326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element()
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
378154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
388154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateElement.mElements[ct] == this) {
398154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateElement.mElements.removeAt(ct);
408154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
418154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
428154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear()
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    delete [] mFields;
494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        total += mFields[ct].e->mBits;
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
664815c0d121310cfcd6a8aba4eab77a9910af53acJason Samssize_t Element::getFieldOffsetBits(uint32_t componentNumber) const
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t ct = 0; ct < componentNumber; ct++) {
704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        offset += mFields[ct].e->mBits;
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const
76e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
77e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
784815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    LOGV("%s   Element: components %i,  size %i", prefix, mFieldCount, mBits);
794815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
80e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        char buf[1024];
81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        sprintf(buf, "%s component %i: ", prefix, ct);
824815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        //mComponents[ct]->dumpLOGV(buf);
83e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
84e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
85e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
86d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
878154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
88d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool isNorm, uint32_t vecSize)
894815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
908154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
918154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
928154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
938154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (!ee->getFieldCount() &&
948154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getType() == dt) &&
958154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getKind() == dk) &&
968154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getIsNormalized() == isNorm) &&
978154954868694e1f233d87d4933a474518b1cb81Jason Sams            (ee->getComponent().getVectorSize() == vecSize)) {
988154954868694e1f233d87d4933a474518b1cb81Jason Sams            // Match
998154954868694e1f233d87d4933a474518b1cb81Jason Sams            ee->incUserRef();
1008154954868694e1f233d87d4933a474518b1cb81Jason Sams            return ee;
1018154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
1028154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
1038154954868694e1f233d87d4933a474518b1cb81Jason Sams
1044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
105d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mComponent.set(dt, dk, isNorm, vecSize);
106d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->mBits = e->mComponent.getBits();
1078154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
1084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
1094815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
1104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
1118154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein,
112d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            const char **nin, const size_t * lengths)
1134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
1148154954868694e1f233d87d4933a474518b1cb81Jason Sams    // Look for an existing match.
1158154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
1168154954868694e1f233d87d4933a474518b1cb81Jason Sams        const Element *ee = rsc->mStateElement.mElements[ct];
1178154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (ee->getFieldCount() == count) {
1188154954868694e1f233d87d4933a474518b1cb81Jason Sams            bool match = true;
1198154954868694e1f233d87d4933a474518b1cb81Jason Sams            for (uint32_t i=0; i < count; i++) {
1208154954868694e1f233d87d4933a474518b1cb81Jason Sams                if ((ee->mFields[i].e.get() != ein[i]) ||
1218154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name.length() != lengths[i]) ||
1228154954868694e1f233d87d4933a474518b1cb81Jason Sams                    (ee->mFields[i].name != nin[i])) {
1238154954868694e1f233d87d4933a474518b1cb81Jason Sams                    match = false;
1248154954868694e1f233d87d4933a474518b1cb81Jason Sams                    break;
1258154954868694e1f233d87d4933a474518b1cb81Jason Sams                }
1268154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
1278154954868694e1f233d87d4933a474518b1cb81Jason Sams            if (match) {
1288154954868694e1f233d87d4933a474518b1cb81Jason Sams                ee->incUserRef();
1298154954868694e1f233d87d4933a474518b1cb81Jason Sams                return ee;
1308154954868694e1f233d87d4933a474518b1cb81Jason Sams            }
1318154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
1328154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
1338154954868694e1f233d87d4933a474518b1cb81Jason Sams
1344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
1354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
1364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
1374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
1384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
1394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
1404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
1414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
1428154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsc->mStateElement.mElements.push(e);
1434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
1444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
1454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
146d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCStructBody(uint32_t indent) const
147d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
148d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    String8 si;
149d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        si.append(" ");
151d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
152d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
153d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    String8 s(si);
154d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    s.append("{\n");
155d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
156d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(si);
157d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(mFields[ct].e->getCType(indent+4));
158d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(" ");
159d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(mFields[ct].name);
160d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(";\n");
161d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
162d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    s.append(si);
163d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    s.append("}");
164d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    return s;
165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
166d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
167d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCType(uint32_t indent) const
168d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    String8 s;
170d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
171d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(" ");
172d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
173d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
174d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    if (!mFieldCount) {
175d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        // Basic component.
176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(mComponent.getCType());
177d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    } else {
178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append("struct ");
179d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        s.append(getCStructBody(indent));
180d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    }
181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
182d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    return s;
183d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
184d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
185b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const
186b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{
187b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    String8 s;
188b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    for (uint32_t ct=0; ct < indent; ct++) {
189b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(" ");
190b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
191b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
192b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    if (!mFieldCount) {
193b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        // Basic component.
194b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        s.append(mComponent.getGLSLType());
195b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    } else {
196b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        rsAssert(0);
197b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append("struct ");
198b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        //s.append(getCStructBody(indent));
199b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    }
200b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
201b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    return s;
202b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams}
203d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
204d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams
2054815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
206326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
210326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2128154954868694e1f233d87d4933a474518b1cb81Jason Sams    rsAssert(!mElements.size());
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
217e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
222d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc,
223d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataType dt,
224d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            RsDataKind dk,
225d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            bool norm,
226d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                            uint32_t vecSize)
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
228d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
2298154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, dt, dk, norm, vecSize);
230d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
2318154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
232d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams}
2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
234d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc,
235d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             size_t count,
236d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const RsElement * ein,
237d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const char ** names,
238d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams                             const size_t * nameLengths)
239d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{
240d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    //LOGE("rsi_ElementCreate2 %i", count);
2418154954868694e1f233d87d4933a474518b1cb81Jason Sams    const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
242d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    e->incUserRef();
2438154954868694e1f233d87d4933a474518b1cb81Jason Sams    return (RsElement)e;
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
249