blob: e796556b4db19b87488722c330d828f9dbaf49b9 [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001/*
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
Jason Sams565ac362009-06-03 16:04:54 -070019#include <GLES/gl.h>
20
Jason Sams326e0dd2009-05-22 14:03:28 -070021using namespace android;
22using namespace android::renderscript;
23
Jason Sams326e0dd2009-05-22 14:03:28 -070024
Jason Samse514b452009-09-25 14:51:22 -070025Element::Element(Context *rsc) : ObjectBase(rsc)
Jason Sams326e0dd2009-05-22 14:03:28 -070026{
Jason Sams4815c0d2009-12-15 12:58:36 -080027 mType = RS_TYPE_FLOAT;
28 mIsNormalized = false;
29 mKind = RS_KIND_USER;
30 mBits = 0;
Jason Samsf2649a92009-09-25 16:37:33 -070031 mAllocFile = __FILE__;
32 mAllocLine = __LINE__;
Jason Sams4815c0d2009-12-15 12:58:36 -080033 mFields = NULL;
34 mFieldCount = 0;
Jason Sams326e0dd2009-05-22 14:03:28 -070035}
36
Jason Sams326e0dd2009-05-22 14:03:28 -070037
38Element::~Element()
39{
40 clear();
41}
42
43void Element::clear()
44{
Jason Sams4815c0d2009-12-15 12:58:36 -080045 delete [] mFields;
46 mFields = NULL;
47 mFieldCount = 0;
Jason Sams326e0dd2009-05-22 14:03:28 -070048}
Jason Sams4815c0d2009-12-15 12:58:36 -080049/*
Jason Sams326e0dd2009-05-22 14:03:28 -070050void Element::setComponent(uint32_t idx, Component *c)
51{
52 rsAssert(!mComponents[idx].get());
53 rsAssert(idx < mComponentCount);
54 mComponents[idx].set(c);
Jason Samse12c1c52009-09-27 17:50:38 -070055
56// Fixme: This should probably not be here
Jason Sams9397e302009-08-27 20:23:34 -070057 c->incUserRef();
Jason Sams326e0dd2009-05-22 14:03:28 -070058}
Jason Sams4815c0d2009-12-15 12:58:36 -080059*/
Jason Sams326e0dd2009-05-22 14:03:28 -070060
61size_t Element::getSizeBits() const
62{
Jason Sams4815c0d2009-12-15 12:58:36 -080063 if (!mFieldCount) {
64 return mBits;
65 }
66
Jason Sams326e0dd2009-05-22 14:03:28 -070067 size_t total = 0;
Jason Sams4815c0d2009-12-15 12:58:36 -080068 for (size_t ct=0; ct < mFieldCount; ct++) {
69 total += mFields[ct].e->mBits;
Jason Sams326e0dd2009-05-22 14:03:28 -070070 }
71 return total;
72}
73
Jason Sams4815c0d2009-12-15 12:58:36 -080074size_t Element::getFieldOffsetBits(uint32_t componentNumber) const
Jason Sams326e0dd2009-05-22 14:03:28 -070075{
76 size_t offset = 0;
77 for (uint32_t ct = 0; ct < componentNumber; ct++) {
Jason Sams4815c0d2009-12-15 12:58:36 -080078 offset += mFields[ct].e->mBits;
Jason Sams326e0dd2009-05-22 14:03:28 -070079 }
80 return offset;
81}
82
Jason Sams565ac362009-06-03 16:04:54 -070083uint32_t Element::getGLType() const
84{
85 int bits[4];
86
Jason Sams4815c0d2009-12-15 12:58:36 -080087 if (!mFieldCount) {
88 switch (mType) {
89 case RS_TYPE_FLOAT:
90 if (mBits == 32) {
91 return GL_FLOAT;
92 }
93 return 0;
94 case RS_TYPE_SIGNED:
95 switch (mBits) {
96 case 8:
97 return GL_BYTE;
98 case 16:
99 return GL_SHORT;
100 //case 32:
101 //return GL_INT;
102 }
103 return 0;
104 case RS_TYPE_UNSIGNED:
105 switch (mBits) {
106 case 8:
107 return GL_UNSIGNED_BYTE;
108 case 16:
109 return GL_UNSIGNED_SHORT;
110 //case 32:
111 //return GL_UNSIGNED_INT;
112 }
113 return 0;
114 }
115 }
116
117 if (mFieldCount > 4) {
Jason Sams565ac362009-06-03 16:04:54 -0700118 return 0;
119 }
120
Jason Sams4815c0d2009-12-15 12:58:36 -0800121 for (uint32_t ct=0; ct < mFieldCount; ct++) {
122 bits[ct] = mFields[ct].e->mBits;
123 if (mFields[ct].e->mFieldCount) {
Jason Sams565ac362009-06-03 16:04:54 -0700124 return 0;
125 }
Jason Sams4815c0d2009-12-15 12:58:36 -0800126 if (mFields[ct].e->mType != RS_TYPE_UNSIGNED) {
127 return 0;
128 }
129 if (!mFields[ct].e->mIsNormalized) {
Jason Sams565ac362009-06-03 16:04:54 -0700130 return 0;
131 }
132 }
133
Jason Sams4815c0d2009-12-15 12:58:36 -0800134 switch(mFieldCount) {
Jason Sams565ac362009-06-03 16:04:54 -0700135 case 1:
136 if (bits[0] == 8) {
137 return GL_UNSIGNED_BYTE;
138 }
139 return 0;
140 case 2:
141 if ((bits[0] == 8) &&
142 (bits[1] == 8)) {
143 return GL_UNSIGNED_BYTE;
144 }
145 return 0;
146 case 3:
147 if ((bits[0] == 8) &&
148 (bits[1] == 8) &&
149 (bits[2] == 8)) {
150 return GL_UNSIGNED_BYTE;
151 }
152 if ((bits[0] == 5) &&
153 (bits[1] == 6) &&
154 (bits[2] == 5)) {
155 return GL_UNSIGNED_SHORT_5_6_5;
156 }
157 return 0;
158 case 4:
159 if ((bits[0] == 8) &&
160 (bits[1] == 8) &&
161 (bits[2] == 8) &&
162 (bits[3] == 8)) {
163 return GL_UNSIGNED_BYTE;
164 }
165 if ((bits[0] == 4) &&
166 (bits[1] == 4) &&
167 (bits[2] == 4) &&
168 (bits[3] == 4)) {
169 return GL_UNSIGNED_SHORT_4_4_4_4;
170 }
171 if ((bits[0] == 5) &&
172 (bits[1] == 5) &&
173 (bits[2] == 5) &&
174 (bits[3] == 1)) {
175 return GL_UNSIGNED_SHORT_5_5_5_1;
176 }
177 }
178 return 0;
179}
180
181uint32_t Element::getGLFormat() const
182{
Jason Sams4815c0d2009-12-15 12:58:36 -0800183 if (!mFieldCount) {
184 if (mKind == RS_KIND_ALPHA) {
Jason Sams565ac362009-06-03 16:04:54 -0700185 return GL_ALPHA;
186 }
Jason Sams4815c0d2009-12-15 12:58:36 -0800187 if (mKind == RS_KIND_LUMINANCE) {
Jason Sams565ac362009-06-03 16:04:54 -0700188 return GL_LUMINANCE;
189 }
Jason Sams4815c0d2009-12-15 12:58:36 -0800190 }
191
192 switch(mFieldCount) {
Jason Sams565ac362009-06-03 16:04:54 -0700193 case 2:
Jason Sams4815c0d2009-12-15 12:58:36 -0800194 if ((mFields[0].e->mKind == RS_KIND_LUMINANCE) &&
195 (mFields[1].e->mKind == RS_KIND_ALPHA)) {
Jason Sams565ac362009-06-03 16:04:54 -0700196 return GL_LUMINANCE_ALPHA;
197 }
198 break;
199 case 3:
Jason Sams4815c0d2009-12-15 12:58:36 -0800200 if ((mFields[0].e->mKind == RS_KIND_RED) &&
201 (mFields[1].e->mKind == RS_KIND_GREEN) &&
202 (mFields[2].e->mKind == RS_KIND_BLUE)) {
Jason Sams565ac362009-06-03 16:04:54 -0700203 return GL_RGB;
204 }
205 break;
206 case 4:
Jason Sams4815c0d2009-12-15 12:58:36 -0800207 if ((mFields[0].e->mKind == RS_KIND_RED) &&
208 (mFields[1].e->mKind == RS_KIND_GREEN) &&
209 (mFields[2].e->mKind == RS_KIND_BLUE) &&
210 (mFields[3].e->mKind == RS_KIND_ALPHA)) {
Jason Sams565ac362009-06-03 16:04:54 -0700211 return GL_RGBA;
212 }
213 break;
214 }
215 return 0;
216}
217
Jason Sams4815c0d2009-12-15 12:58:36 -0800218const char * Element::getCType() const
219{
220 switch(mType) {
221 case RS_TYPE_FLOAT:
222 return "float";
223 case RS_TYPE_SIGNED:
224 case RS_TYPE_UNSIGNED:
225 switch(mBits) {
226 case 32:
227 return "int";
228 case 16:
229 return "short";
230 case 8:
231 return "char";
232 }
233 break;
234 }
235 return NULL;
236}
Jason Sams565ac362009-06-03 16:04:54 -0700237
Jason Samse12c1c52009-09-27 17:50:38 -0700238void Element::dumpLOGV(const char *prefix) const
239{
240 ObjectBase::dumpLOGV(prefix);
Jason Sams4815c0d2009-12-15 12:58:36 -0800241 LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits);
242 for (uint32_t ct = 0; ct < mFieldCount; ct++) {
Jason Samse12c1c52009-09-27 17:50:38 -0700243 char buf[1024];
244 sprintf(buf, "%s component %i: ", prefix, ct);
Jason Sams4815c0d2009-12-15 12:58:36 -0800245 //mComponents[ct]->dumpLOGV(buf);
Jason Samse12c1c52009-09-27 17:50:38 -0700246 }
247}
248
Jason Sams4815c0d2009-12-15 12:58:36 -0800249Element * Element::create(Context *rsc, RsDataKind dk, RsDataType dt,
250 bool isNorm, size_t bits)
251{
252 Element *e = new Element(rsc);
253 e->mKind = dk;
254 e->mType = dt;
255 e->mIsNormalized = isNorm;
256 e->mBits = bits;
257 return e;
258}
259
260Element * Element::create(Context *rsc, Element **ein, const char **nin,
261 const size_t * lengths, size_t count)
262{
263 Element *e = new Element(rsc);
264 e->mFields = new ElementField_t [count];
265 e->mFieldCount = count;
266
267 for (size_t ct=0; ct < count; ct++) {
268 e->mFields[ct].e.set(ein[ct]);
269 e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
270 }
271
272 return e;
273}
274
275
Jason Sams326e0dd2009-05-22 14:03:28 -0700276ElementState::ElementState()
277{
278}
279
280ElementState::~ElementState()
281{
282}
283
Jason Sams4815c0d2009-12-15 12:58:36 -0800284
Jason Sams326e0dd2009-05-22 14:03:28 -0700285/////////////////////////////////////////
Jason Samse5ffb872009-08-09 17:01:55 -0700286//
Jason Sams326e0dd2009-05-22 14:03:28 -0700287
288namespace android {
289namespace renderscript {
290
291void rsi_ElementBegin(Context *rsc)
292{
Jason Sams4815c0d2009-12-15 12:58:36 -0800293 ElementState * sec = &rsc->mStateElement;
294
295 sec->mBuildList.clear();
296 sec->mNames.clear();
Jason Sams326e0dd2009-05-22 14:03:28 -0700297}
298
Jason Sams8b2c0652009-08-12 17:54:11 -0700299void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
Jason Sams326e0dd2009-05-22 14:03:28 -0700300{
301 ElementState * sec = &rsc->mStateElement;
Jason Samse12c1c52009-09-27 17:50:38 -0700302
303 rsAssert(bits > 0);
304
Jason Sams4815c0d2009-12-15 12:58:36 -0800305 Element *c = Element::create(rsc, dk, dt, isNormalized, bits);
306 sec->mBuildList.add(c);
307 if (name)
308 sec->mNames.add(String8(name));
309 else
310 sec->mNames.add(String8(""));
Jason Sams326e0dd2009-05-22 14:03:28 -0700311}
312
313RsElement rsi_ElementCreate(Context *rsc)
314{
315 ElementState * sec = &rsc->mStateElement;
Jason Sams326e0dd2009-05-22 14:03:28 -0700316
Jason Sams4815c0d2009-12-15 12:58:36 -0800317 size_t count = sec->mBuildList.size();
318 rsAssert(count > 0);
Jason Samse12c1c52009-09-27 17:50:38 -0700319
Jason Sams4815c0d2009-12-15 12:58:36 -0800320 if (count == 1) {
321 Element *se = sec->mBuildList[0];
322 se->incUserRef();
323 sec->mBuildList.clear();
324 sec->mNames.clear();
325 return se;
Jason Sams326e0dd2009-05-22 14:03:28 -0700326 }
327
Jason Sams4815c0d2009-12-15 12:58:36 -0800328 Element ** tmpElements = (Element **)calloc(count, sizeof(Element *));
329 const char ** tmpNames = (const char **)calloc(count, sizeof(char *));
330 size_t * tmpLengths = (size_t *)calloc(count, sizeof(size_t));
331
332
333 for (size_t ct = 0; ct < count; ct++) {
334 tmpElements[ct] = sec->mBuildList[ct];
335 tmpNames[ct] = sec->mNames[ct].string();
336 tmpLengths[ct] = sec->mNames[ct].length();
337 }
338 Element *se = Element::create(rsc, tmpElements, tmpNames, tmpLengths, count);
339
340 sec->mBuildList.clear();
341 sec->mNames.clear();
Jason Sams9397e302009-08-27 20:23:34 -0700342 se->incUserRef();
Jason Sams4815c0d2009-12-15 12:58:36 -0800343 free(tmpElements);
344 free(tmpNames);
345 free(tmpLengths);
Jason Sams326e0dd2009-05-22 14:03:28 -0700346 return se;
347}
348
Jason Sams326e0dd2009-05-22 14:03:28 -0700349
350}
351}