rsElement.cpp revision e5ffb879ae535a899a486285a23bea05e912480f
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 Samsvoid ElementState::initPredefined()
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * u_8  = new Component(Component::USER,   Component::UNSIGNED,  true,  8);
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * i_8  = new Component(Component::USER,   Component::SIGNED,    true,  8);
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * u_16 = new Component(Component::USER,   Component::UNSIGNED,  true,  16);
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * i_16 = new Component(Component::USER,   Component::SIGNED,    true,  16);
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * u_32 = new Component(Component::USER,   Component::UNSIGNED,  true,  32);
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * i_32 = new Component(Component::USER,   Component::SIGNED,    true,  32);
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * f_32 = new Component(Component::USER,   Component::FLOAT,     true,  32);
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * r_4  = new Component(Component::RED,    Component::UNSIGNED,  true,  4);
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * r_5  = new Component(Component::RED,    Component::UNSIGNED,  true,  5);
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * r_8  = new Component(Component::RED,    Component::UNSIGNED,  true,  8);
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * g_4  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  4);
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * g_5  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  5);
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * g_6  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  6);
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * g_8  = new Component(Component::GREEN,  Component::UNSIGNED,  true,  8);
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * b_4  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  4);
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * b_5  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  5);
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * b_8  = new Component(Component::BLUE,   Component::UNSIGNED,  true,  8);
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * a_1  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  1);
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * a_4  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  4);
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * a_8  = new Component(Component::ALPHA,  Component::UNSIGNED,  true,  8);
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * idx_16 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 16);
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * idx_32 = new Component(Component::INDEX,  Component::UNSIGNED,  false, 32);
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * x    = new Component(Component::X,      Component::FLOAT,     false, 32);
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * y    = new Component(Component::Y,      Component::FLOAT,     false, 32);
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * z    = new Component(Component::Z,      Component::FLOAT,     false, 32);
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * nx   = new Component(Component::NX,     Component::FLOAT,     false, 32);
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * ny   = new Component(Component::NY,     Component::FLOAT,     false, 32);
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * nz   = new Component(Component::NZ,     Component::FLOAT,     false, 32);
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * s    = new Component(Component::S,      Component::FLOAT,     false, 32);
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Component * t    = new Component(Component::T,      Component::FLOAT,     false, 32);
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Element * e;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, u_8);
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U8, e));
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, i_8);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I8, e));
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, u_16);
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U16, e));
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, i_16);
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I16, e));
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, u_32);
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_U32, e));
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, i_32);
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_I32, e));
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, f_32);
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_USER_FLOAT, e));
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
966678e9b2568ad041429a2477177133fe4932159fJason Sams    e = new Element(1);
976678e9b2568ad041429a2477177133fe4932159fJason Sams    e->setComponent(0, a_8);
986678e9b2568ad041429a2477177133fe4932159fJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_A_8, e));
996678e9b2568ad041429a2477177133fe4932159fJason Sams
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(3);
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, r_5);
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, g_6);
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, b_5);
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_565, e));
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(4);
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, r_5);
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, g_5);
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, b_5);
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, a_1);
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_5551, e));
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(4);
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, r_4);
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, g_4);
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, b_4);
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, a_4);
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_4444, e));
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(3);
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, r_8);
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, g_8);
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, b_8);
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_RGB_888, e));
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(4);
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, r_8);
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, g_8);
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, b_8);
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, a_8);
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_8888, e));
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, idx_16);
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_16, e));
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(1);
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, idx_32);
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_32, e));
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(2);
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, x);
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, y);
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_XY_F32, e));
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(3);
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, x);
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, y);
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, z);
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_XYZ_F32, e));
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(4);
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, s);
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, t);
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, x);
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, y);
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XY_F32, e));
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(5);
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, s);
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, t);
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, x);
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, y);
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(4, z);
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_ST_XYZ_F32, e));
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(6);
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, nx);
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, ny);
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, nz);
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, x);
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(4, y);
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(5, z);
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_XYZ_F32, e));
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e = new Element(8);
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(0, nx);
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(1, ny);
179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(2, nz);
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(3, s);
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(4, t);
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(5, x);
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(6, y);
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->setComponent(7, z);
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPredefinedList.add(Predefined(RS_ELEMENT_NORM_ST_XYZ_F32, e));
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
189326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::Element()
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponents = NULL;
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponentCount = 0;
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
195326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::Element(uint32_t count)
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponents = new ObjectBaseRef<Component> [count];
198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponentCount = count;
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
201326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element()
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear()
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    delete [] mComponents;
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponents = NULL;
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponentCount = 0;
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::setComponent(uint32_t idx, Component *c)
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mComponents[idx].get());
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(idx < mComponentCount);
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mComponents[idx].set(c);
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    c->incRef();
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t total = 0;
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (size_t ct=0; ct < mComponentCount; ct++) {
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        total += mComponents[ct]->getBits();
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return total;
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getComponentOffsetBits(uint32_t componentNumber) const
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t ct = 0; ct < componentNumber; ct++) {
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset += mComponents[ct]->getBits();
236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
240565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLType() const
241565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{
242565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    int bits[4];
243565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
244565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    if (mComponentCount > 4) {
245565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
246565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
247565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
248565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    for (uint32_t ct=0; ct < mComponentCount; ct++) {
249565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        bits[ct] = mComponents[ct]->getBits();
250565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (mComponents[ct]->getType() != Component::UNSIGNED) {
251565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return 0;
252565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
253565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (!mComponents[ct]->getIsNormalized()) {
254565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return 0;
255565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
256565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
257565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
258565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    switch(mComponentCount) {
259565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 1:
260565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (bits[0] == 8) {
261565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
262565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
263565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
264565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 2:
265565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
266565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8)) {
267565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
268565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
269565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
270565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 3:
271565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
272565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8) &&
273565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 8)) {
274565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
275565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
276565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 5) &&
277565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 6) &&
278565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 5)) {
279565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_5_6_5;
280565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
281565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return 0;
282565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 4:
283565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 8) &&
284565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 8) &&
285565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 8) &&
286565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 8)) {
287565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_BYTE;
288565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
289565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 4) &&
290565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 4) &&
291565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 4) &&
292565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 4)) {
293565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_4_4_4_4;
294565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
295565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((bits[0] == 5) &&
296565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[1] == 5) &&
297565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[2] == 5) &&
298565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (bits[3] == 1)) {
299565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_UNSIGNED_SHORT_5_5_5_1;
300565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
301565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
302565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    return 0;
303565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
304565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
305565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLFormat() const
306565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{
307565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    switch(mComponentCount) {
308565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 1:
309565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (mComponents[0]->getKind() == Component::ALPHA) {
310565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_ALPHA;
311565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
312565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if (mComponents[0]->getKind() == Component::LUMINANCE) {
313565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_LUMINANCE;
314565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
315565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
316565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 2:
317565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((mComponents[0]->getKind() == Component::LUMINANCE) &&
318565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[1]->getKind() == Component::ALPHA)) {
319565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_LUMINANCE_ALPHA;
320565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
321565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
322565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 3:
323565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((mComponents[0]->getKind() == Component::RED) &&
324565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[1]->getKind() == Component::GREEN) &&
325565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[2]->getKind() == Component::BLUE)) {
326565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_RGB;
327565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
328565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
329565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    case 4:
330565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        if ((mComponents[0]->getKind() == Component::RED) &&
331565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[1]->getKind() == Component::GREEN) &&
332565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[2]->getKind() == Component::BLUE) &&
333565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            (mComponents[3]->getKind() == Component::ALPHA)) {
334565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            return GL_RGBA;
335565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
336565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        break;
337565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
338565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    return 0;
339565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
340565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
341565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
342326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState()
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
346326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState()
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////////////////////////////
351e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementBegin(Context *rsc)
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsc->mStateElement.mComponentBuildList.clear();
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementAddPredefined(Context *rsc, RsElementPredefined predef)
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    RsElement ve = rsi_ElementGetPredefined(rsc, predef);
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const Element *e = static_cast<const Element *>(ve);
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(size_t ct = 0; ct < sec->mPredefinedList[predef].mElement->getComponentCount(); ct++) {
369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        sec->mComponentBuildList.add(sec->mPredefinedList[predef].mElement->getComponent(ct));
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
373326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementGetPredefined(Context *rsc, RsElementPredefined predef)
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!sec->mPredefinedList.size()) {
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        sec->initPredefined();
379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
381e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if ((predef < 0) ||
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        (static_cast<uint32_t>(predef) >= sec->mPredefinedList.size())) {
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsElementGetPredefined: Request for bad predefined type");
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        // error
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return NULL;
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(sec->mPredefinedList[predef].mEnum == predef);
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Element * e = sec->mPredefinedList[predef].mElement;
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    e->incRef();
391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return e;
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
394326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits)
395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
398e5ffb879ae535a899a486285a23bea05e912480fJason Sams    Component *c = new Component(static_cast<Component::DataKind>(dk),
399e5ffb879ae535a899a486285a23bea05e912480fJason Sams                                 static_cast<Component::DataType>(dt),
400e5ffb879ae535a899a486285a23bea05e912480fJason Sams                                 isNormalized,
401e5ffb879ae535a899a486285a23bea05e912480fJason Sams                                 bits);
402e5ffb879ae535a899a486285a23bea05e912480fJason Sams    sec->mComponentBuildList.add(c);
403326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
404326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
405326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementCreate(Context *rsc)
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ElementState * sec = &rsc->mStateElement;
408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Element *se = new Element(sec->mComponentBuildList.size());
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (size_t ct = 0; ct < se->getComponentCount(); ct++) {
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        se->setComponent(ct, sec->mComponentBuildList[ct]);
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsc->mStateElement.mComponentBuildList.clear();
415326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    se->incRef();
416326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return se;
417326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
418326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
419326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementDestroy(Context *rsc, RsElement vse)
420326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
421326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Element * se = static_cast<Element *>(vse);
422326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    se->decRef();
423326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
424326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
425326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
426326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
427326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
428