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