blob: e2ae043674367a7af3361b355aefe5835d6e741a [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 Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070021#include <GLES2/gl2.h>
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070022#endif
Jason Samsd01d9702009-12-23 14:35:29 -080023
24using namespace android;
25using namespace android::renderscript;
26
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080027Component::Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080028 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
29}
30
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080031Component::~Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080032}
33
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080034void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
Jason Samsd01d9702009-12-23 14:35:29 -080035 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
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080047 switch (mKind) {
Jason Samsd01d9702009-12-23 14:35:29 -080048 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
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080073 switch (mType) {
Jason Samsd01d9702009-12-23 14:35:29 -080074 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;
Jason Sams39cd3172010-08-25 14:31:48 -070094
95 case RS_TYPE_MATRIX_4X4:
96 mTypeBits = 16 * 32;
97 rsAssert(mVectorSize == 1);
98 rsAssert(mNormalized == false);
99 rsAssert(mKind == RS_KIND_USER);
100 break;
101 case RS_TYPE_MATRIX_3X3:
102 mTypeBits = 9 * 32;
103 rsAssert(mVectorSize == 1);
104 rsAssert(mNormalized == false);
105 rsAssert(mKind == RS_KIND_USER);
106 break;
107 case RS_TYPE_MATRIX_2X2:
108 mTypeBits = 4 * 32;
109 rsAssert(mVectorSize == 1);
110 rsAssert(mNormalized == false);
111 rsAssert(mKind == RS_KIND_USER);
112 break;
113
Jason Samsd01d9702009-12-23 14:35:29 -0800114 case RS_TYPE_ELEMENT:
115 case RS_TYPE_TYPE:
116 case RS_TYPE_ALLOCATION:
117 case RS_TYPE_SAMPLER:
118 case RS_TYPE_SCRIPT:
119 case RS_TYPE_MESH:
120 case RS_TYPE_PROGRAM_FRAGMENT:
121 case RS_TYPE_PROGRAM_VERTEX:
122 case RS_TYPE_PROGRAM_RASTER:
123 case RS_TYPE_PROGRAM_STORE:
124 rsAssert(mVectorSize == 1);
125 rsAssert(mNormalized == false);
126 rsAssert(mKind == RS_KIND_USER);
127 mBits = 32;
128 mTypeBits = 32;
129 return;
130
131 case RS_TYPE_FLOAT_16:
132 mTypeBits = 16;
133 mIsFloat = true;
134 break;
135 case RS_TYPE_FLOAT_32:
136 mTypeBits = 32;
137 mIsFloat = true;
138 break;
139 case RS_TYPE_FLOAT_64:
140 mTypeBits = 64;
141 mIsFloat = true;
142 break;
143 case RS_TYPE_SIGNED_8:
144 mTypeBits = 8;
145 mIsSigned = true;
146 break;
147 case RS_TYPE_SIGNED_16:
148 mTypeBits = 16;
149 mIsSigned = true;
150 break;
151 case RS_TYPE_SIGNED_32:
152 mTypeBits = 32;
153 mIsSigned = true;
154 break;
155 case RS_TYPE_SIGNED_64:
156 mTypeBits = 64;
157 mIsSigned = true;
158 break;
159 case RS_TYPE_UNSIGNED_8:
160 mTypeBits = 8;
161 break;
162 case RS_TYPE_UNSIGNED_16:
163 mTypeBits = 16;
164 break;
165 case RS_TYPE_UNSIGNED_32:
166 mTypeBits = 32;
167 break;
168 case RS_TYPE_UNSIGNED_64:
169 mTypeBits = 64;
170 break;
Jason Sams5e9811f2010-06-21 17:42:41 -0700171
172 case RS_TYPE_BOOLEAN:
173 mTypeBits = 8;
174 break;
Jason Samsd01d9702009-12-23 14:35:29 -0800175 }
176
177 mBits = mTypeBits * mVectorSize;
178}
179
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800180bool Component::isReference() const {
Jason Samse3929c92010-08-09 18:13:33 -0700181 return (mType >= RS_TYPE_ELEMENT);
182}
Jason Samsd01d9702009-12-23 14:35:29 -0800183
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800184uint32_t Component::getGLType() const {
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800185#ifndef ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800186 switch (mType) {
187 case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
188 case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
189 case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
190
191 //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
192 case RS_TYPE_FLOAT_32: return GL_FLOAT;
193 case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
194 case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
195 case RS_TYPE_SIGNED_8: return GL_BYTE;
196 case RS_TYPE_SIGNED_16: return GL_SHORT;
197 default: break;
198 }
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800199#endif //ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800200 return 0;
201}
202
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800203uint32_t Component::getGLFormat() const {
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800204#ifndef ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800205 switch (mKind) {
206 case RS_KIND_PIXEL_L: return GL_LUMINANCE;
207 case RS_KIND_PIXEL_A: return GL_ALPHA;
208 case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
209 case RS_KIND_PIXEL_RGB: return GL_RGB;
210 case RS_KIND_PIXEL_RGBA: return GL_RGBA;
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700211 case RS_KIND_PIXEL_DEPTH: return GL_DEPTH_COMPONENT16;
Jason Samsd01d9702009-12-23 14:35:29 -0800212 default: break;
213 }
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -0800214#endif //ANDROID_RS_SERIALIZE
Jason Samsd01d9702009-12-23 14:35:29 -0800215 return 0;
216}
217
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800218String8 Component::getGLSLType() const {
Jason Samsb4d35682010-01-04 16:52:27 -0800219 if (mType == RS_TYPE_SIGNED_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800220 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800221 case 1: return String8("int");
222 case 2: return String8("ivec2");
223 case 3: return String8("ivec3");
224 case 4: return String8("ivec4");
225 }
226 }
227 if (mType == RS_TYPE_FLOAT_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800228 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800229 case 1: return String8("float");
230 case 2: return String8("vec2");
231 case 3: return String8("vec3");
232 case 4: return String8("vec4");
233 }
234 }
Jason Sams39cd3172010-08-25 14:31:48 -0700235 if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) {
236 return String8("mat4");
237 }
238 if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) {
239 return String8("mat3");
240 }
241 if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) {
242 return String8("mat2");
243 }
Jason Samsb4d35682010-01-04 16:52:27 -0800244 return String8();
245}
246
Jason Sams39cd3172010-08-25 14:31:48 -0700247static const char * gTypeBasicStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800248 "NONE",
249 "F16",
250 "F32",
251 "F64",
252 "S8",
253 "S16",
254 "S32",
255 "S64",
256 "U8",
257 "U16",
258 "U32",
259 "U64",
Jason Sams5e9811f2010-06-21 17:42:41 -0700260 "BOOLEAN",
Jason Samsd01d9702009-12-23 14:35:29 -0800261 "UP_565",
262 "UP_5551",
263 "UP_4444",
Jason Sams39cd3172010-08-25 14:31:48 -0700264 "MATRIX_4X4",
265 "MATRIX_3X3",
266 "MATRIX_2X2",
267};
268
269static const char * gTypeObjStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800270 "ELEMENT",
271 "TYPE",
272 "ALLOCATION",
273 "SAMPLER",
274 "SCRIPT",
275 "MESH",
276 "PROGRAM_FRAGMENT",
277 "PROGRAM_VERTEX",
278 "PROGRAM_RASTER",
279 "PROGRAM_STORE",
280};
281
282static const char * gKindStrings[] = {
283 "USER",
284 "COLOR",
285 "POSITION",
286 "TEXTURE",
287 "NORMAL",
288 "INDEX",
289 "POINT_SIZE",
290 "PIXEL_L",
291 "PIXEL_A",
292 "PIXEL_LA",
293 "PIXEL_RGB",
294 "PIXEL_RGBA",
295};
296
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800297void Component::dumpLOGV(const char *prefix) const {
Jason Sams39cd3172010-08-25 14:31:48 -0700298 if (mType >= RS_TYPE_ELEMENT) {
299 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
300 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
301 } else {
302 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
303 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
304 }
Jason Samsd01d9702009-12-23 14:35:29 -0800305}
306
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800307void Component::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700308 stream->addU8((uint8_t)mType);
309 stream->addU8((uint8_t)mKind);
310 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
311 stream->addU32(mVectorSize);
312}
313
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800314void Component::loadFromStream(IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700315 mType = (RsDataType)stream->loadU8();
316 mKind = (RsDataKind)stream->loadU8();
317 uint8_t temp = stream->loadU8();
318 mNormalized = temp != 0;
319 mVectorSize = stream->loadU32();
320
321 set(mType, mKind, mNormalized, mVectorSize);
322}
323
324
325
Jason Samsd01d9702009-12-23 14:35:29 -0800326