rsElement.cpp revision 4815c0d121310cfcd6a8aba4eab77a9910af53ac
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    mType = RS_TYPE_FLOAT;
284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mIsNormalized = false;
294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mKind = RS_KIND_USER;
304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mBits = 0;
31f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
32f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
38326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element()
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear()
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    delete [] mFields;
464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFields = NULL;
474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mFieldCount = 0;
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams/*
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::setComponent(uint32_t idx, Component *c)
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mComponents[idx].get());
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(idx < mComponentCount);
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponents[idx].set(c);
55e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
56e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams// Fixme: This should probably not be here
579397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    c->incUserRef();
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams*/
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return mBits;
654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
664815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < mFieldCount; ct++) {
694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        total += mFields[ct].e->mBits;
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
744815c0d121310cfcd6a8aba4eab77a9910af53acJason Samssize_t Element::getFieldOffsetBits(uint32_t componentNumber) const
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t ct = 0; ct < componentNumber; ct++) {
784815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        offset += mFields[ct].e->mBits;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
83565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLType() const
84565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{
85565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    int bits[4];
86565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
884815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        switch (mType) {
894815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case RS_TYPE_FLOAT:
904815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            if (mBits == 32) {
914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                return GL_FLOAT;
924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            }
934815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return 0;
944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case RS_TYPE_SIGNED:
954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            switch (mBits) {
964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            case 8:
974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                return GL_BYTE;
984815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            case 16:
994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                return GL_SHORT;
1004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            //case 32:
1014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                //return GL_INT;
1024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            }
1034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return 0;
1044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case RS_TYPE_UNSIGNED:
1054815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            switch (mBits) {
1064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            case 8:
1074815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                return GL_UNSIGNED_BYTE;
1084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            case 16:
1094815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                return GL_UNSIGNED_SHORT;
1104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            //case 32:
1114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                //return GL_UNSIGNED_INT;
1124815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            }
1134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return 0;
1144815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        }
1154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
1164815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
1174815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (mFieldCount > 4) {
118565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
119565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
120565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
1214815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct=0; ct < mFieldCount; ct++) {
1224815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        bits[ct] = mFields[ct].e->mBits;
1234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if (mFields[ct].e->mFieldCount) {
1244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return 0;
1254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        }
1264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if (mFields[ct].e->mType != RS_TYPE_UNSIGNED) {
127565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return 0;
128565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
1294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if (!mFields[ct].e->mIsNormalized) {
130565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return 0;
131565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
132565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
133565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
1344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    switch(mFieldCount) {
135565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 1:
136565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (bits[0] == 8) {
137565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
138565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
139565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
140565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 2:
141565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
142565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8)) {
143565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
144565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
145565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
146565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 3:
147565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
148565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8) &&
149565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 8)) {
150565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
151565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
152565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 5) &&
153565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 6) &&
154565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 5)) {
155565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_5_6_5;
156565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
157565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
158565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 4:
159565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
160565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8) &&
161565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 8) &&
162565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 8)) {
163565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
164565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
165565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 4) &&
166565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 4) &&
167565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 4) &&
168565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 4)) {
169565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_4_4_4_4;
170565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
171565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 5) &&
172565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 5) &&
173565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 5) &&
174565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 1)) {
175565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_5_5_5_1;
176565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
177565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
178565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    return 0;
179565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
180565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
181565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLFormat() const
182565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{
1834815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (!mFieldCount) {
1844815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if (mKind == RS_KIND_ALPHA) {
185565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_ALPHA;
186565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
1874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if (mKind == RS_KIND_LUMINANCE) {
188565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_LUMINANCE;
189565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
1904815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
1914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
1924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    switch(mFieldCount) {
193565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 2:
1944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if ((mFields[0].e->mKind == RS_KIND_LUMINANCE) &&
1954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[1].e->mKind == RS_KIND_ALPHA)) {
196565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_LUMINANCE_ALPHA;
197565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
198565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
199565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 3:
2004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if ((mFields[0].e->mKind == RS_KIND_RED) &&
2014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[1].e->mKind == RS_KIND_GREEN) &&
2024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[2].e->mKind == RS_KIND_BLUE)) {
203565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_RGB;
204565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
205565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
206565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 4:
2074815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        if ((mFields[0].e->mKind == RS_KIND_RED) &&
2084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[1].e->mKind == RS_KIND_GREEN) &&
2094815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[2].e->mKind == RS_KIND_BLUE) &&
2104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            (mFields[3].e->mKind == RS_KIND_ALPHA)) {
211565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_RGBA;
212565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
213565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
214565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
215565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    return 0;
216565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
217565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
2184815c0d121310cfcd6a8aba4eab77a9910af53acJason Samsconst char * Element::getCType() const
2194815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2204815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    switch(mType) {
2214815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    case RS_TYPE_FLOAT:
2224815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return "float";
2234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    case RS_TYPE_SIGNED:
2244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    case RS_TYPE_UNSIGNED:
2254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        switch(mBits) {
2264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case 32:
2274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return "int";
2284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case 16:
2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return "short";
2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case 8:
2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            return "char";
2324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        }
2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        break;
2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
2354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return NULL;
2364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
237565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
238e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const
239e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
240e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    LOGV("%s   Element: components %i,  size %i", prefix, mFieldCount, mBits);
2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
243e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        char buf[1024];
244e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        sprintf(buf, "%s component %i: ", prefix, ct);
2454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        //mComponents[ct]->dumpLOGV(buf);
246e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
247e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
248e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
2494815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsElement * Element::create(Context *rsc, RsDataKind dk, RsDataType dt,
2504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                          bool isNorm, size_t bits)
2514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mKind = dk;
2544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mType = dt;
2554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mIsNormalized = isNorm;
2564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mBits = bits;
2574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2604815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsElement * Element::create(Context *rsc, Element **ein, const char **nin,
2614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                          const size_t * lengths, size_t count)
2624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
2634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *e = new Element(rsc);
2644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFields = new ElementField_t [count];
2654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    e->mFieldCount = count;
2664815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct=0; ct < count; ct++) {
2684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].e.set(ein[ct]);
2694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
2704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
2714815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return e;
2734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
2744815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2754815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
276326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
280326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2844815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
286e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
288326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementBegin(Context *rsc)
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2934815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    ElementState * sec = &rsc->mStateElement;
2944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
2954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    sec->mBuildList.clear();
2964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    sec->mNames.clear();
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2998b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Samsvoid rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
302e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
303e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    rsAssert(bits > 0);
304e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
3054815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *c = Element::create(rsc, dk, dt, isNormalized, bits);
3064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    sec->mBuildList.add(c);
3074815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (name)
3084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        sec->mNames.add(String8(name));
3094815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    else
3104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        sec->mNames.add(String8(""));
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
313326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementCreate(Context *rsc)
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3174815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    size_t count = sec->mBuildList.size();
3184815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    rsAssert(count > 0);
3194815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
3204815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    if (count == 1) {
3214815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        Element *se = sec->mBuildList[0];
3224815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        se->incUserRef();
3234815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        sec->mBuildList.clear();
3244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        sec->mNames.clear();
3254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        return se;
3264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    }
3274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
3284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element ** tmpElements = (Element **)calloc(count, sizeof(Element *));
3294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    const char ** tmpNames = (const char **)calloc(count, sizeof(char *));
3304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    size_t * tmpLengths = (size_t *)calloc(count, sizeof(size_t));
3314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
332e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
3334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (size_t ct = 0; ct < count; ct++) {
3344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        tmpElements[ct] = sec->mBuildList[ct];
3354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        tmpNames[ct] = sec->mNames[ct].string();
3364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        tmpLengths[ct] = sec->mNames[ct].length();
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
3384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Element *se = Element::create(rsc, tmpElements, tmpNames, tmpLengths, count);
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    sec->mBuildList.clear();
3414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    sec->mNames.clear();
3429397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    se->incUserRef();
3434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    free(tmpElements);
3444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    free(tmpNames);
3454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    free(tmpLengths);
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return se;
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
352