blob: 4c4987aaf7a4f8e2d1409bce745ad4b1ca087153 [file] [log] [blame]
Jason Samsd01d9702009-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 Sakhartchouk77d9f4b2011-01-31 14:53:24 -080019#ifndef ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -080020#include <GLES/gl.h>
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070021#endif
Jason Samsd01d9702009-12-23 14:35:29 -080022
23using namespace android;
24using namespace android::renderscript;
25
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080026Component::Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080027 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
28}
29
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080030Component::~Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080031}
32
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080033void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
Jason Samsd01d9702009-12-23 14:35:29 -080034 mType = dt;
35 mKind = dk;
36 mNormalized = norm;
37 mVectorSize = vecSize;
38 rsAssert(vecSize <= 4);
39
40 mBits = 0;
41 mTypeBits = 0;
42 mIsFloat = false;
43 mIsSigned = false;
44 mIsPixel = false;
45
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080046 switch (mKind) {
Jason Samsd01d9702009-12-23 14:35:29 -080047 case RS_KIND_PIXEL_L:
48 case RS_KIND_PIXEL_A:
49 mIsPixel = true;
50 rsAssert(mVectorSize == 1);
51 rsAssert(mNormalized == true);
52 break;
53 case RS_KIND_PIXEL_LA:
54 mIsPixel = true;
55 rsAssert(mVectorSize == 2);
56 rsAssert(mNormalized == true);
57 break;
58 case RS_KIND_PIXEL_RGB:
59 mIsPixel = true;
60 rsAssert(mVectorSize == 3);
61 rsAssert(mNormalized == true);
62 break;
63 case RS_KIND_PIXEL_RGBA:
64 mIsPixel = true;
65 rsAssert(mVectorSize == 4);
66 rsAssert(mNormalized == true);
67 break;
68 default:
69 break;
70 }
71
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080072 switch (mType) {
Jason Samsd01d9702009-12-23 14:35:29 -080073 case RS_TYPE_NONE:
74 return;
75 case RS_TYPE_UNSIGNED_5_6_5:
76 mVectorSize = 3;
77 mBits = 16;
78 mNormalized = true;
79 rsAssert(mKind == RS_KIND_PIXEL_RGB);
80 return;
81 case RS_TYPE_UNSIGNED_5_5_5_1:
82 mVectorSize = 4;
83 mBits = 16;
84 mNormalized = true;
85 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
86 return;
87 case RS_TYPE_UNSIGNED_4_4_4_4:
88 mVectorSize = 4;
89 mBits = 16;
90 mNormalized = true;
91 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
92 return;
Jason Sams39cd3172010-08-25 14:31:48 -070093
94 case RS_TYPE_MATRIX_4X4:
95 mTypeBits = 16 * 32;
96 rsAssert(mVectorSize == 1);
97 rsAssert(mNormalized == false);
98 rsAssert(mKind == RS_KIND_USER);
99 break;
100 case RS_TYPE_MATRIX_3X3:
101 mTypeBits = 9 * 32;
102 rsAssert(mVectorSize == 1);
103 rsAssert(mNormalized == false);
104 rsAssert(mKind == RS_KIND_USER);
105 break;
106 case RS_TYPE_MATRIX_2X2:
107 mTypeBits = 4 * 32;
108 rsAssert(mVectorSize == 1);
109 rsAssert(mNormalized == false);
110 rsAssert(mKind == RS_KIND_USER);
111 break;
112
Jason Samsd01d9702009-12-23 14:35:29 -0800113 case RS_TYPE_ELEMENT:
114 case RS_TYPE_TYPE:
115 case RS_TYPE_ALLOCATION:
116 case RS_TYPE_SAMPLER:
117 case RS_TYPE_SCRIPT:
118 case RS_TYPE_MESH:
119 case RS_TYPE_PROGRAM_FRAGMENT:
120 case RS_TYPE_PROGRAM_VERTEX:
121 case RS_TYPE_PROGRAM_RASTER:
122 case RS_TYPE_PROGRAM_STORE:
123 rsAssert(mVectorSize == 1);
124 rsAssert(mNormalized == false);
125 rsAssert(mKind == RS_KIND_USER);
126 mBits = 32;
127 mTypeBits = 32;
128 return;
129
130 case RS_TYPE_FLOAT_16:
131 mTypeBits = 16;
132 mIsFloat = true;
133 break;
134 case RS_TYPE_FLOAT_32:
135 mTypeBits = 32;
136 mIsFloat = true;
137 break;
138 case RS_TYPE_FLOAT_64:
139 mTypeBits = 64;
140 mIsFloat = true;
141 break;
142 case RS_TYPE_SIGNED_8:
143 mTypeBits = 8;
144 mIsSigned = true;
145 break;
146 case RS_TYPE_SIGNED_16:
147 mTypeBits = 16;
148 mIsSigned = true;
149 break;
150 case RS_TYPE_SIGNED_32:
151 mTypeBits = 32;
152 mIsSigned = true;
153 break;
154 case RS_TYPE_SIGNED_64:
155 mTypeBits = 64;
156 mIsSigned = true;
157 break;
158 case RS_TYPE_UNSIGNED_8:
159 mTypeBits = 8;
160 break;
161 case RS_TYPE_UNSIGNED_16:
162 mTypeBits = 16;
163 break;
164 case RS_TYPE_UNSIGNED_32:
165 mTypeBits = 32;
166 break;
167 case RS_TYPE_UNSIGNED_64:
168 mTypeBits = 64;
169 break;
Jason Sams5e9811f2010-06-21 17:42:41 -0700170
171 case RS_TYPE_BOOLEAN:
172 mTypeBits = 8;
173 break;
Jason Samsd01d9702009-12-23 14:35:29 -0800174 }
175
176 mBits = mTypeBits * mVectorSize;
177}
178
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800179bool Component::isReference() const {
Jason Samse3929c92010-08-09 18:13:33 -0700180 return (mType >= RS_TYPE_ELEMENT);
181}
Jason Samsd01d9702009-12-23 14:35:29 -0800182
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800183uint32_t Component::getGLType() const {
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800184#ifndef ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800185 switch (mType) {
186 case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
187 case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
188 case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
189
190 //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
191 case RS_TYPE_FLOAT_32: return GL_FLOAT;
192 case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
193 case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
194 case RS_TYPE_SIGNED_8: return GL_BYTE;
195 case RS_TYPE_SIGNED_16: return GL_SHORT;
196 default: break;
197 }
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800198#endif //ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800199 return 0;
200}
201
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800202uint32_t Component::getGLFormat() const {
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800203#ifndef ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800204 switch (mKind) {
205 case RS_KIND_PIXEL_L: return GL_LUMINANCE;
206 case RS_KIND_PIXEL_A: return GL_ALPHA;
207 case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
208 case RS_KIND_PIXEL_RGB: return GL_RGB;
209 case RS_KIND_PIXEL_RGBA: return GL_RGBA;
210 default: break;
211 }
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800212#endif //ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800213 return 0;
214}
215
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800216String8 Component::getGLSLType() const {
Jason Samsb4d35682010-01-04 16:52:27 -0800217 if (mType == RS_TYPE_SIGNED_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800218 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800219 case 1: return String8("int");
220 case 2: return String8("ivec2");
221 case 3: return String8("ivec3");
222 case 4: return String8("ivec4");
223 }
224 }
225 if (mType == RS_TYPE_FLOAT_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800226 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800227 case 1: return String8("float");
228 case 2: return String8("vec2");
229 case 3: return String8("vec3");
230 case 4: return String8("vec4");
231 }
232 }
Jason Sams39cd3172010-08-25 14:31:48 -0700233 if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) {
234 return String8("mat4");
235 }
236 if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) {
237 return String8("mat3");
238 }
239 if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) {
240 return String8("mat2");
241 }
Jason Samsb4d35682010-01-04 16:52:27 -0800242 return String8();
243}
244
Jason Sams39cd3172010-08-25 14:31:48 -0700245static const char * gTypeBasicStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800246 "NONE",
247 "F16",
248 "F32",
249 "F64",
250 "S8",
251 "S16",
252 "S32",
253 "S64",
254 "U8",
255 "U16",
256 "U32",
257 "U64",
Jason Sams5e9811f2010-06-21 17:42:41 -0700258 "BOOLEAN",
Jason Samsd01d9702009-12-23 14:35:29 -0800259 "UP_565",
260 "UP_5551",
261 "UP_4444",
Jason Sams39cd3172010-08-25 14:31:48 -0700262 "MATRIX_4X4",
263 "MATRIX_3X3",
264 "MATRIX_2X2",
265};
266
267static const char * gTypeObjStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800268 "ELEMENT",
269 "TYPE",
270 "ALLOCATION",
271 "SAMPLER",
272 "SCRIPT",
273 "MESH",
274 "PROGRAM_FRAGMENT",
275 "PROGRAM_VERTEX",
276 "PROGRAM_RASTER",
277 "PROGRAM_STORE",
278};
279
280static const char * gKindStrings[] = {
281 "USER",
282 "COLOR",
283 "POSITION",
284 "TEXTURE",
285 "NORMAL",
286 "INDEX",
287 "POINT_SIZE",
288 "PIXEL_L",
289 "PIXEL_A",
290 "PIXEL_LA",
291 "PIXEL_RGB",
292 "PIXEL_RGBA",
293};
294
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800295void Component::dumpLOGV(const char *prefix) const {
Jason Sams39cd3172010-08-25 14:31:48 -0700296 if (mType >= RS_TYPE_ELEMENT) {
297 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
298 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
299 } else {
300 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
301 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
302 }
Jason Samsd01d9702009-12-23 14:35:29 -0800303}
304
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800305void Component::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700306 stream->addU8((uint8_t)mType);
307 stream->addU8((uint8_t)mKind);
308 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
309 stream->addU32(mVectorSize);
310}
311
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800312void Component::loadFromStream(IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700313 mType = (RsDataType)stream->loadU8();
314 mKind = (RsDataKind)stream->loadU8();
315 uint8_t temp = stream->loadU8();
316 mNormalized = temp != 0;
317 mVectorSize = stream->loadU32();
318
319 set(mType, mKind, mNormalized, mVectorSize);
320}
321
322
323
Jason Samsd01d9702009-12-23 14:35:29 -0800324