rsElement.cpp revision 707aaf341a4b068e6ccadf923af85acdd85fd775
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18
19#include <GLES/gl.h>
20
21using namespace android;
22using namespace android::renderscript;
23
24void ElementState::initPredefined()
25{
26    Component * u_8  = new Component(Component::USER,   Component::UNSIGNED,  true,  8, 0);
27    Component * i_8  = new Component(Component::USER,   Component::SIGNED,    true,  8, 0);
28    Component * u_16 = new Component(Component::USER,   Component::UNSIGNED,  true,  16, 0);
29    Component * i_16 = new Component(Component::USER,   Component::SIGNED,    true,  16, 0);
30    Component * u_32 = new Component(Component::USER,   Component::UNSIGNED,  true,  32, 0);
31    Component * i_32 = new Component(Component::USER,   Component::SIGNED,    true,  32, 0);
32    Component * f_32 = new Component(Component::USER,   Component::FLOAT,     true,  32, 0);
33
34
35    Component * r_4  = new Component(Component::RED,    Component::UNSIGNED,  true,  4, 0);
36    Component * r_5  = new Component(Component::RED,    Component::UNSIGNED,  true,  5, 0);
37    Component * r_8  = new Component(Component::RED,    Component::UNSIGNED,  true,  8, 0);
38
39    Component * g_4  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  4, 0);
40    Component * g_5  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  5, 0);
41    Component * g_6  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  6, 0);
42    Component * g_8  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  8, 0);
43
44    Component * b_4  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  4, 0);
45    Component * b_5  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  5, 0);
46    Component * b_8  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  8, 0);
47
48    Component * a_1  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  1, 0);
49    Component * a_4  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  4, 0);
50    Component * a_8  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  8, 0);
51
52    Component * idx_16 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 16, 0);
53    Component * idx_32 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 32, 0);
54
55    Component * x    = new Component(Component::X,      Component::FLOAT,     false, 32, 0);
56    Component * y    = new Component(Component::Y,      Component::FLOAT,     false, 32, 0);
57    Component * z    = new Component(Component::Z,      Component::FLOAT,     false, 32, 0);
58
59    Component * nx   = new Component(Component::NX,     Component::FLOAT,     false, 32, 0);
60    Component * ny   = new Component(Component::NY,     Component::FLOAT,     false, 32, 0);
61    Component * nz   = new Component(Component::NZ,     Component::FLOAT,     false, 32, 0);
62
63    Component * s    = new Component(Component::S,      Component::FLOAT,     false, 32, 0);
64    Component * t    = new Component(Component::T,      Component::FLOAT,     false, 32, 0);
65
66    Element * e;
67
68    e = new Element(1);
69    e->setComponent(0, u_8);
70    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U8, e));
71
72    e = new Element(1);
73    e->setComponent(0, i_8);
74    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I8, e));
75
76    e = new Element(1);
77    e->setComponent(0, u_16);
78    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U16, e));
79
80    e = new Element(1);
81    e->setComponent(0, i_16);
82    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I16, e));
83
84    e = new Element(1);
85    e->setComponent(0, u_32);
86    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U32, e));
87
88    e = new Element(1);
89    e->setComponent(0, i_32);
90    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I32, e));
91
92    e = new Element(1);
93    e->setComponent(0, f_32);
94    mPredefinedList.add(Predefined(RS_ELEMENT_USER_FLOAT, e));
95
96    e = new Element(1);
97    e->setComponent(0, a_8);
98    mPredefinedList.add(Predefined(RS_ELEMENT_A_8, e));
99
100    e = new Element(3);
101    e->setComponent(0, r_5);
102    e->setComponent(1, g_6);
103    e->setComponent(2, b_5);
104    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_565, e));
105
106    e = new Element(4);
107    e->setComponent(0, r_5);
108    e->setComponent(1, g_5);
109    e->setComponent(2, b_5);
110    e->setComponent(3, a_1);
111    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_5551, e));
112
113    e = new Element(4);
114    e->setComponent(0, r_4);
115    e->setComponent(1, g_4);
116    e->setComponent(2, b_4);
117    e->setComponent(3, a_4);
118    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_4444, e));
119
120    e = new Element(3);
121    e->setComponent(0, r_8);
122    e->setComponent(1, g_8);
123    e->setComponent(2, b_8);
124    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_888, e));
125
126    e = new Element(4);
127    e->setComponent(0, r_8);
128    e->setComponent(1, g_8);
129    e->setComponent(2, b_8);
130    e->setComponent(3, a_8);
131    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_8888, e));
132
133    e = new Element(1);
134    e->setComponent(0, idx_16);
135    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_16, e));
136
137    e = new Element(1);
138    e->setComponent(0, idx_32);
139    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_32, e));
140
141    e = new Element(2);
142    e->setComponent(0, x);
143    e->setComponent(1, y);
144    mPredefinedList.add(Predefined(RS_ELEMENT_XY_F32, e));
145
146    e = new Element(3);
147    e->setComponent(0, x);
148    e->setComponent(1, y);
149    e->setComponent(2, z);
150    mPredefinedList.add(Predefined(RS_ELEMENT_XYZ_F32, e));
151
152    e = new Element(4);
153    e->setComponent(0, s);
154    e->setComponent(1, t);
155    e->setComponent(2, x);
156    e->setComponent(3, y);
157    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XY_F32, e));
158
159    e = new Element(5);
160    e->setComponent(0, s);
161    e->setComponent(1, t);
162    e->setComponent(2, x);
163    e->setComponent(3, y);
164    e->setComponent(4, z);
165    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XYZ_F32, e));
166
167    e = new Element(6);
168    e->setComponent(0, nx);
169    e->setComponent(1, ny);
170    e->setComponent(2, nz);
171    e->setComponent(3, x);
172    e->setComponent(4, y);
173    e->setComponent(5, z);
174    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_XYZ_F32, e));
175
176    e = new Element(8);
177    e->setComponent(0, nx);
178    e->setComponent(1, ny);
179    e->setComponent(2, nz);
180    e->setComponent(3, s);
181    e->setComponent(4, t);
182    e->setComponent(5, x);
183    e->setComponent(6, y);
184    e->setComponent(7, z);
185    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_ST_XYZ_F32, e));
186}
187
188
189Element::Element()
190{
191    mComponents = NULL;
192    mComponentCount = 0;
193}
194
195Element::Element(uint32_t count)
196{
197    mComponents = new ObjectBaseRef<Component> [count];
198    mComponentCount = count;
199}
200
201Element::~Element()
202{
203    clear();
204}
205
206void Element::clear()
207{
208    delete [] mComponents;
209    mComponents = NULL;
210    mComponentCount = 0;
211}
212
213void Element::setComponent(uint32_t idx, Component *c)
214{
215    rsAssert(!mComponents[idx].get());
216    rsAssert(idx < mComponentCount);
217    mComponents[idx].set(c);
218    c->incRef();
219}
220
221
222size_t Element::getSizeBits() const
223{
224    size_t total = 0;
225    for (size_t ct=0; ct < mComponentCount; ct++) {
226        total += mComponents[ct]->getBits();
227    }
228    return total;
229}
230
231size_t Element::getComponentOffsetBits(uint32_t componentNumber) const
232{
233    size_t offset = 0;
234    for (uint32_t ct = 0; ct < componentNumber; ct++) {
235        offset += mComponents[ct]->getBits();
236    }
237    return offset;
238}
239
240uint32_t Element::getGLType() const
241{
242    int bits[4];
243
244    if (mComponentCount > 4) {
245        return 0;
246    }
247
248    for (uint32_t ct=0; ct < mComponentCount; ct++) {
249        bits[ct] = mComponents[ct]->getBits();
250        if (mComponents[ct]->getType() != Component::UNSIGNED) {
251            return 0;
252        }
253        if (!mComponents[ct]->getIsNormalized()) {
254            return 0;
255        }
256    }
257
258    switch(mComponentCount) {
259    case 1:
260        if (bits[0] == 8) {
261            return GL_UNSIGNED_BYTE;
262        }
263        return 0;
264    case 2:
265        if ((bits[0] == 8) &&
266            (bits[1] == 8)) {
267            return GL_UNSIGNED_BYTE;
268        }
269        return 0;
270    case 3:
271        if ((bits[0] == 8) &&
272            (bits[1] == 8) &&
273            (bits[2] == 8)) {
274            return GL_UNSIGNED_BYTE;
275        }
276        if ((bits[0] == 5) &&
277            (bits[1] == 6) &&
278            (bits[2] == 5)) {
279            return GL_UNSIGNED_SHORT_5_6_5;
280        }
281        return 0;
282    case 4:
283        if ((bits[0] == 8) &&
284            (bits[1] == 8) &&
285            (bits[2] == 8) &&
286            (bits[3] == 8)) {
287            return GL_UNSIGNED_BYTE;
288        }
289        if ((bits[0] == 4) &&
290            (bits[1] == 4) &&
291            (bits[2] == 4) &&
292            (bits[3] == 4)) {
293            return GL_UNSIGNED_SHORT_4_4_4_4;
294        }
295        if ((bits[0] == 5) &&
296            (bits[1] == 5) &&
297            (bits[2] == 5) &&
298            (bits[3] == 1)) {
299            return GL_UNSIGNED_SHORT_5_5_5_1;
300        }
301    }
302    return 0;
303}
304
305uint32_t Element::getGLFormat() const
306{
307    switch(mComponentCount) {
308    case 1:
309        if (mComponents[0]->getKind() == Component::ALPHA) {
310            return GL_ALPHA;
311        }
312        if (mComponents[0]->getKind() == Component::LUMINANCE) {
313            return GL_LUMINANCE;
314        }
315        break;
316    case 2:
317        if ((mComponents[0]->getKind() == Component::LUMINANCE) &&
318            (mComponents[1]->getKind() == Component::ALPHA)) {
319            return GL_LUMINANCE_ALPHA;
320        }
321        break;
322    case 3:
323        if ((mComponents[0]->getKind() == Component::RED) &&
324            (mComponents[1]->getKind() == Component::GREEN) &&
325            (mComponents[2]->getKind() == Component::BLUE)) {
326            return GL_RGB;
327        }
328        break;
329    case 4:
330        if ((mComponents[0]->getKind() == Component::RED) &&
331            (mComponents[1]->getKind() == Component::GREEN) &&
332            (mComponents[2]->getKind() == Component::BLUE) &&
333            (mComponents[3]->getKind() == Component::ALPHA)) {
334            return GL_RGBA;
335        }
336        break;
337    }
338    return 0;
339}
340
341
342ElementState::ElementState()
343{
344}
345
346ElementState::~ElementState()
347{
348}
349
350/////////////////////////////////////////
351//
352
353namespace android {
354namespace renderscript {
355
356void rsi_ElementBegin(Context *rsc)
357{
358    rsc->mStateElement.mComponentBuildList.clear();
359}
360
361void rsi_ElementAddPredefined(Context *rsc, RsElementPredefined predef)
362{
363    ElementState * sec = &rsc->mStateElement;
364
365    RsElement ve = rsi_ElementGetPredefined(rsc, predef);
366    const Element *e = static_cast<const Element *>(ve);
367
368    for(size_t ct = 0; ct < sec->mPredefinedList[predef].mElement->getComponentCount(); ct++) {
369        sec->mComponentBuildList.add(sec->mPredefinedList[predef].mElement->getComponent(ct));
370    }
371}
372
373RsElement rsi_ElementGetPredefined(Context *rsc, RsElementPredefined predef)
374{
375    ElementState * sec = &rsc->mStateElement;
376
377    if (!sec->mPredefinedList.size()) {
378        sec->initPredefined();
379    }
380
381    if ((predef < 0) ||
382        (static_cast<uint32_t>(predef) >= sec->mPredefinedList.size())) {
383        LOGE("rsElementGetPredefined: Request for bad predefined type");
384        // error
385        return NULL;
386    }
387
388    rsAssert(sec->mPredefinedList[predef].mEnum == predef);
389    Element * e = sec->mPredefinedList[predef].mElement;
390    e->incRef();
391    return e;
392}
393
394void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
395{
396    ElementState * sec = &rsc->mStateElement;
397    Component *c = new Component(static_cast<Component::DataKind>(dk),
398                                 static_cast<Component::DataType>(dt),
399                                 isNormalized,
400                                 bits,
401                                 name);
402    sec->mComponentBuildList.add(c);
403}
404
405RsElement rsi_ElementCreate(Context *rsc)
406{
407    ElementState * sec = &rsc->mStateElement;
408    Element *se = new Element(sec->mComponentBuildList.size());
409
410    for (size_t ct = 0; ct < se->getComponentCount(); ct++) {
411        se->setComponent(ct, sec->mComponentBuildList[ct]);
412    }
413
414    rsc->mStateElement.mComponentBuildList.clear();
415    se->incRef();
416    return se;
417}
418
419
420}
421}
422