blob: 15a56f7fe48e33491de983a7100b56c07bfb09d5 [file] [log] [blame]
Jason Sams718cd1f2009-12-23 14:35:29 -08001/*
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 "rsComponent.h"
18
19#include <GLES/gl.h>
20
21using namespace android;
22using namespace android::renderscript;
23
24Component::Component()
25{
26 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
27}
28
29Component::~Component()
30{
31}
32
33void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize)
34{
35 mType = dt;
36 mKind = dk;
37 mNormalized = norm;
38 mVectorSize = vecSize;
39 rsAssert(vecSize <= 4);
40
41 mBits = 0;
42 mTypeBits = 0;
43 mIsFloat = false;
44 mIsSigned = false;
45 mIsPixel = false;
46
47 switch(mKind) {
48 case RS_KIND_PIXEL_L:
49 case RS_KIND_PIXEL_A:
50 mIsPixel = true;
51 rsAssert(mVectorSize == 1);
52 rsAssert(mNormalized == true);
53 break;
54 case RS_KIND_PIXEL_LA:
55 mIsPixel = true;
56 rsAssert(mVectorSize == 2);
57 rsAssert(mNormalized == true);
58 break;
59 case RS_KIND_PIXEL_RGB:
60 mIsPixel = true;
61 rsAssert(mVectorSize == 3);
62 rsAssert(mNormalized == true);
63 break;
64 case RS_KIND_PIXEL_RGBA:
65 mIsPixel = true;
66 rsAssert(mVectorSize == 4);
67 rsAssert(mNormalized == true);
68 break;
69 default:
70 break;
71 }
72
73 switch(mType) {
74 case RS_TYPE_NONE:
75 return;
76 case RS_TYPE_UNSIGNED_5_6_5:
77 mVectorSize = 3;
78 mBits = 16;
79 mNormalized = true;
80 rsAssert(mKind == RS_KIND_PIXEL_RGB);
81 return;
82 case RS_TYPE_UNSIGNED_5_5_5_1:
83 mVectorSize = 4;
84 mBits = 16;
85 mNormalized = true;
86 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
87 return;
88 case RS_TYPE_UNSIGNED_4_4_4_4:
89 mVectorSize = 4;
90 mBits = 16;
91 mNormalized = true;
92 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
93 return;
94 case RS_TYPE_ELEMENT:
95 case RS_TYPE_TYPE:
96 case RS_TYPE_ALLOCATION:
97 case RS_TYPE_SAMPLER:
98 case RS_TYPE_SCRIPT:
99 case RS_TYPE_MESH:
100 case RS_TYPE_PROGRAM_FRAGMENT:
101 case RS_TYPE_PROGRAM_VERTEX:
102 case RS_TYPE_PROGRAM_RASTER:
103 case RS_TYPE_PROGRAM_STORE:
104 rsAssert(mVectorSize == 1);
105 rsAssert(mNormalized == false);
106 rsAssert(mKind == RS_KIND_USER);
107 mBits = 32;
108 mTypeBits = 32;
109 return;
110
111 case RS_TYPE_FLOAT_16:
112 mTypeBits = 16;
113 mIsFloat = true;
114 break;
115 case RS_TYPE_FLOAT_32:
116 mTypeBits = 32;
117 mIsFloat = true;
118 break;
119 case RS_TYPE_FLOAT_64:
120 mTypeBits = 64;
121 mIsFloat = true;
122 break;
123 case RS_TYPE_SIGNED_8:
124 mTypeBits = 8;
125 mIsSigned = true;
126 break;
127 case RS_TYPE_SIGNED_16:
128 mTypeBits = 16;
129 mIsSigned = true;
130 break;
131 case RS_TYPE_SIGNED_32:
132 mTypeBits = 32;
133 mIsSigned = true;
134 break;
135 case RS_TYPE_SIGNED_64:
136 mTypeBits = 64;
137 mIsSigned = true;
138 break;
139 case RS_TYPE_UNSIGNED_8:
140 mTypeBits = 8;
141 break;
142 case RS_TYPE_UNSIGNED_16:
143 mTypeBits = 16;
144 break;
145 case RS_TYPE_UNSIGNED_32:
146 mTypeBits = 32;
147 break;
148 case RS_TYPE_UNSIGNED_64:
149 mTypeBits = 64;
150 break;
151 }
152
153 mBits = mTypeBits * mVectorSize;
154}
155
156
157
158
159uint32_t Component::getGLType() const
160{
161 switch (mType) {
162 case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
163 case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
164 case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
165
166 //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
167 case RS_TYPE_FLOAT_32: return GL_FLOAT;
168 case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
169 case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
170 case RS_TYPE_SIGNED_8: return GL_BYTE;
171 case RS_TYPE_SIGNED_16: return GL_SHORT;
172 default: break;
173 }
174
175 return 0;
176}
177
178uint32_t Component::getGLFormat() const
179{
180 switch (mKind) {
181 case RS_KIND_PIXEL_L: return GL_LUMINANCE;
182 case RS_KIND_PIXEL_A: return GL_ALPHA;
183 case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
184 case RS_KIND_PIXEL_RGB: return GL_RGB;
185 case RS_KIND_PIXEL_RGBA: return GL_RGBA;
186 default: break;
187 }
188 return 0;
189}
190
191static const char * gCTypeStrings[] = {
192 0,
193 0,//"F16",
194 "float",
195 "double",
196 "char",
197 "short",
198 "int",
199 0,//"S64",
200 "char",//U8",
201 "short",//U16",
202 "int",//U32",
203 0,//"U64",
204 0,//"UP_565",
205 0,//"UP_5551",
206 0,//"UP_4444",
207 0,//"ELEMENT",
208 0,//"TYPE",
209 0,//"ALLOCATION",
210 0,//"SAMPLER",
211 0,//"SCRIPT",
212 0,//"MESH",
213 0,//"PROGRAM_FRAGMENT",
214 0,//"PROGRAM_VERTEX",
215 0,//"PROGRAM_RASTER",
216 0,//"PROGRAM_STORE",
217};
218
219static const char * gCVecTypeStrings[] = {
220 0,
221 0,//"F16",
222 "vecF32",
223 "vecF64",
224 "vecI8",
225 "vecI16",
226 "vecI32",
227 0,//"S64",
228 "vecU8",//U8",
229 "vecU16",//U16",
230 "vecU32",//U32",
231 0,//"U64",
232 0,//"UP_565",
233 0,//"UP_5551",
234 0,//"UP_4444",
235 0,//"ELEMENT",
236 0,//"TYPE",
237 0,//"ALLOCATION",
238 0,//"SAMPLER",
239 0,//"SCRIPT",
240 0,//"MESH",
241 0,//"PROGRAM_FRAGMENT",
242 0,//"PROGRAM_VERTEX",
243 0,//"PROGRAM_RASTER",
244 0,//"PROGRAM_STORE",
245};
246
247String8 Component::getCType() const
248{
249 char buf[64];
250 if (mVectorSize == 1) {
251 return String8(gCTypeStrings[mType]);
252 }
253
254 // Yuck, acc WAR
255 // Appears to have problems packing chars
256 if (mVectorSize == 4 && mType == RS_TYPE_UNSIGNED_8) {
257 return String8("int");
258 }
259
260
261 String8 s(gCVecTypeStrings[mType]);
262 sprintf(buf, "_%i_t", mVectorSize);
263 s.append(buf);
264 return s;
265}
266
Jason Samse17964e2010-01-04 16:52:27 -0800267String8 Component::getGLSLType() const
268{
269 if (mType == RS_TYPE_SIGNED_32) {
270 switch(mVectorSize) {
271 case 1: return String8("int");
272 case 2: return String8("ivec2");
273 case 3: return String8("ivec3");
274 case 4: return String8("ivec4");
275 }
276 }
277 if (mType == RS_TYPE_FLOAT_32) {
278 switch(mVectorSize) {
279 case 1: return String8("float");
280 case 2: return String8("vec2");
281 case 3: return String8("vec3");
282 case 4: return String8("vec4");
283 }
284 }
285 return String8();
286}
287
Jason Sams718cd1f2009-12-23 14:35:29 -0800288static const char * gTypeStrings[] = {
289 "NONE",
290 "F16",
291 "F32",
292 "F64",
293 "S8",
294 "S16",
295 "S32",
296 "S64",
297 "U8",
298 "U16",
299 "U32",
300 "U64",
301 "UP_565",
302 "UP_5551",
303 "UP_4444",
304 "ELEMENT",
305 "TYPE",
306 "ALLOCATION",
307 "SAMPLER",
308 "SCRIPT",
309 "MESH",
310 "PROGRAM_FRAGMENT",
311 "PROGRAM_VERTEX",
312 "PROGRAM_RASTER",
313 "PROGRAM_STORE",
314};
315
316static const char * gKindStrings[] = {
317 "USER",
318 "COLOR",
319 "POSITION",
320 "TEXTURE",
321 "NORMAL",
322 "INDEX",
323 "POINT_SIZE",
324 "PIXEL_L",
325 "PIXEL_A",
326 "PIXEL_LA",
327 "PIXEL_RGB",
328 "PIXEL_RGBA",
329};
330
331void Component::dumpLOGV(const char *prefix) const
332{
333 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
334 prefix, gTypeStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
335}
336
337