rsElement.cpp revision 326e0ddf89e8df2837752fbfd7a014814b32082c
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
19using namespace android;
20using namespace android::renderscript;
21
22void ElementState::initPredefined()
23{
24    Component * u_8  = new Component(Component::USER,   Component::UNSIGNED,  true,  8);
25    Component * i_8  = new Component(Component::USER,   Component::SIGNED,    true,  8);
26    Component * u_16 = new Component(Component::USER,   Component::UNSIGNED,  true,  16);
27    Component * i_16 = new Component(Component::USER,   Component::SIGNED,    true,  16);
28    Component * u_32 = new Component(Component::USER,   Component::UNSIGNED,  true,  32);
29    Component * i_32 = new Component(Component::USER,   Component::SIGNED,    true,  32);
30    Component * f_32 = new Component(Component::USER,   Component::FLOAT,     true,  32);
31
32
33    Component * r_4  = new Component(Component::RED,    Component::UNSIGNED,  true,  4);
34    Component * r_5  = new Component(Component::RED,    Component::UNSIGNED,  true,  5);
35    Component * r_8  = new Component(Component::RED,    Component::UNSIGNED,  true,  8);
36
37    Component * g_4  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  4);
38    Component * g_5  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  5);
39    Component * g_6  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  6);
40    Component * g_8  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  8);
41
42    Component * b_4  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  4);
43    Component * b_5  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  5);
44    Component * b_8  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  8);
45
46    Component * a_1  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  1);
47    Component * a_4  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  4);
48    Component * a_8  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  8);
49
50    Component * idx_16 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 16);
51    Component * idx_32 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 32);
52
53    Component * x    = new Component(Component::X,      Component::FLOAT,     false, 32);
54    Component * y    = new Component(Component::Y,      Component::FLOAT,     false, 32);
55    Component * z    = new Component(Component::Z,      Component::FLOAT,     false, 32);
56
57    Component * nx   = new Component(Component::NX,     Component::FLOAT,     false, 32);
58    Component * ny   = new Component(Component::NY,     Component::FLOAT,     false, 32);
59    Component * nz   = new Component(Component::NZ,     Component::FLOAT,     false, 32);
60
61    Component * s    = new Component(Component::S,      Component::FLOAT,     false, 32);
62    Component * t    = new Component(Component::T,      Component::FLOAT,     false, 32);
63
64    Element * e;
65
66    e = new Element(1);
67    e->setComponent(0, u_8);
68    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U8, e));
69
70    e = new Element(1);
71    e->setComponent(0, i_8);
72    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I8, e));
73
74    e = new Element(1);
75    e->setComponent(0, u_16);
76    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U16, e));
77
78    e = new Element(1);
79    e->setComponent(0, i_16);
80    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I16, e));
81
82    e = new Element(1);
83    e->setComponent(0, u_32);
84    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U32, e));
85
86    e = new Element(1);
87    e->setComponent(0, i_32);
88    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I32, e));
89
90    e = new Element(1);
91    e->setComponent(0, f_32);
92    mPredefinedList.add(Predefined(RS_ELEMENT_USER_FLOAT, e));
93
94    e = new Element(3);
95    e->setComponent(0, r_5);
96    e->setComponent(1, g_6);
97    e->setComponent(2, b_5);
98    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_565, e));
99
100    e = new Element(4);
101    e->setComponent(0, r_5);
102    e->setComponent(1, g_5);
103    e->setComponent(2, b_5);
104    e->setComponent(3, a_1);
105    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_5551, e));
106
107    e = new Element(4);
108    e->setComponent(0, r_4);
109    e->setComponent(1, g_4);
110    e->setComponent(2, b_4);
111    e->setComponent(3, a_4);
112    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_4444, e));
113
114    e = new Element(3);
115    e->setComponent(0, r_8);
116    e->setComponent(1, g_8);
117    e->setComponent(2, b_8);
118    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_888, e));
119
120    e = new Element(4);
121    e->setComponent(0, r_8);
122    e->setComponent(1, g_8);
123    e->setComponent(2, b_8);
124    e->setComponent(3, a_8);
125    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_8888, e));
126
127    e = new Element(1);
128    e->setComponent(0, idx_16);
129    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_16, e));
130
131    e = new Element(1);
132    e->setComponent(0, idx_32);
133    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_32, e));
134
135    e = new Element(2);
136    e->setComponent(0, x);
137    e->setComponent(1, y);
138    mPredefinedList.add(Predefined(RS_ELEMENT_XY_F32, e));
139
140    e = new Element(3);
141    e->setComponent(0, x);
142    e->setComponent(1, y);
143    e->setComponent(2, z);
144    mPredefinedList.add(Predefined(RS_ELEMENT_XYZ_F32, e));
145
146    e = new Element(4);
147    e->setComponent(0, s);
148    e->setComponent(1, t);
149    e->setComponent(2, x);
150    e->setComponent(3, y);
151    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XY_F32, e));
152
153    e = new Element(5);
154    e->setComponent(0, s);
155    e->setComponent(1, t);
156    e->setComponent(2, x);
157    e->setComponent(3, y);
158    e->setComponent(4, z);
159    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XYZ_F32, e));
160
161    e = new Element(6);
162    e->setComponent(0, nx);
163    e->setComponent(1, ny);
164    e->setComponent(2, nz);
165    e->setComponent(3, x);
166    e->setComponent(4, y);
167    e->setComponent(5, z);
168    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_XYZ_F32, e));
169
170    e = new Element(8);
171    e->setComponent(0, nx);
172    e->setComponent(1, ny);
173    e->setComponent(2, nz);
174    e->setComponent(3, s);
175    e->setComponent(4, t);
176    e->setComponent(5, x);
177    e->setComponent(6, y);
178    e->setComponent(7, z);
179    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_ST_XYZ_F32, e));
180}
181
182
183Element::Element()
184{
185    mComponents = NULL;
186    mComponentCount = 0;
187}
188
189Element::Element(uint32_t count)
190{
191    mComponents = new ObjectBaseRef<Component> [count];
192    mComponentCount = count;
193}
194
195Element::~Element()
196{
197    clear();
198}
199
200void Element::clear()
201{
202    delete [] mComponents;
203    mComponents = NULL;
204    mComponentCount = 0;
205}
206
207void Element::setComponent(uint32_t idx, Component *c)
208{
209    rsAssert(!mComponents[idx].get());
210    rsAssert(idx < mComponentCount);
211    mComponents[idx].set(c);
212    c->incRef();
213}
214
215
216size_t Element::getSizeBits() const
217{
218    size_t total = 0;
219    for (size_t ct=0; ct < mComponentCount; ct++) {
220        total += mComponents[ct]->getBits();
221    }
222    return total;
223}
224
225size_t Element::getComponentOffsetBits(uint32_t componentNumber) const
226{
227    size_t offset = 0;
228    for (uint32_t ct = 0; ct < componentNumber; ct++) {
229        offset += mComponents[ct]->getBits();
230    }
231    return offset;
232}
233
234ElementState::ElementState()
235{
236}
237
238ElementState::~ElementState()
239{
240}
241
242/////////////////////////////////////////
243//
244
245namespace android {
246namespace renderscript {
247
248void rsi_ElementBegin(Context *rsc)
249{
250    rsc->mStateElement.mComponentBuildList.clear();
251}
252
253void rsi_ElementAddPredefined(Context *rsc, RsElementPredefined predef)
254{
255    ElementState * sec = &rsc->mStateElement;
256
257    RsElement ve = rsi_ElementGetPredefined(rsc, predef);
258    const Element *e = static_cast<const Element *>(ve);
259
260    for(size_t ct = 0; ct < sec->mPredefinedList[predef].mElement->getComponentCount(); ct++) {
261        sec->mComponentBuildList.add(sec->mPredefinedList[predef].mElement->getComponent(ct));
262    }
263}
264
265RsElement rsi_ElementGetPredefined(Context *rsc, RsElementPredefined predef)
266{
267    ElementState * sec = &rsc->mStateElement;
268
269    if (!sec->mPredefinedList.size()) {
270        sec->initPredefined();
271    }
272
273    if ((predef < 0) ||
274        (static_cast<uint32_t>(predef) >= sec->mPredefinedList.size())) {
275        LOGE("rsElementGetPredefined: Request for bad predefined type");
276        // error
277        return NULL;
278    }
279
280    rsAssert(sec->mPredefinedList[predef].mEnum == predef);
281    Element * e = sec->mPredefinedList[predef].mElement;
282    e->incRef();
283    return e;
284}
285
286void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits)
287{
288    ElementState * sec = &rsc->mStateElement;
289
290}
291
292RsElement rsi_ElementCreate(Context *rsc)
293{
294    ElementState * sec = &rsc->mStateElement;
295
296    Element *se = new Element(sec->mComponentBuildList.size());
297    sec->mAllElements.add(se);
298
299    for (size_t ct = 0; ct < se->getComponentCount(); ct++) {
300        se->setComponent(ct, sec->mComponentBuildList[ct]);
301    }
302
303    rsc->mStateElement.mComponentBuildList.clear();
304    se->incRef();
305
306    LOGE("Create %p", se);
307    return se;
308}
309
310void rsi_ElementDestroy(Context *rsc, RsElement vse)
311{
312    ElementState * sec = &rsc->mStateElement;
313    Element * se = static_cast<Element *>(vse);
314
315    for (size_t ct = 0; ct < sec->mAllElements.size(); ct++) {
316        if (sec->mAllElements[ct] == se) {
317            sec->mAllElements.removeAt(ct);
318            break;
319        }
320    }
321    se->decRef();
322}
323
324
325}
326}
327