blob: 0574343d304d737c19c220f08de42b7c031b3286 [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
267static const char * gTypeStrings[] = {
268 "NONE",
269 "F16",
270 "F32",
271 "F64",
272 "S8",
273 "S16",
274 "S32",
275 "S64",
276 "U8",
277 "U16",
278 "U32",
279 "U64",
280 "UP_565",
281 "UP_5551",
282 "UP_4444",
283 "ELEMENT",
284 "TYPE",
285 "ALLOCATION",
286 "SAMPLER",
287 "SCRIPT",
288 "MESH",
289 "PROGRAM_FRAGMENT",
290 "PROGRAM_VERTEX",
291 "PROGRAM_RASTER",
292 "PROGRAM_STORE",
293};
294
295static const char * gKindStrings[] = {
296 "USER",
297 "COLOR",
298 "POSITION",
299 "TEXTURE",
300 "NORMAL",
301 "INDEX",
302 "POINT_SIZE",
303 "PIXEL_L",
304 "PIXEL_A",
305 "PIXEL_LA",
306 "PIXEL_RGB",
307 "PIXEL_RGBA",
308};
309
310void Component::dumpLOGV(const char *prefix) const
311{
312 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
313 prefix, gTypeStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
314}
315
316