blob: 81ade5d4f60fe8475f55577f46db9aa1bfc01d8c [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 Sakhartchoukfb6b6142010-05-21 12:53:13 -070019#ifndef ANDROID_RS_BUILD_FOR_HOST
Jason Samsd01d9702009-12-23 14:35:29 -080020#include <GLES/gl.h>
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070021#else
22#include <OpenGL/gl.h>
23#endif
Jason Samsd01d9702009-12-23 14:35:29 -080024
25using namespace android;
26using namespace android::renderscript;
27
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080028Component::Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080029 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
30}
31
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080032Component::~Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080033}
34
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080035void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
Jason Samsd01d9702009-12-23 14:35:29 -080036 mType = dt;
37 mKind = dk;
38 mNormalized = norm;
39 mVectorSize = vecSize;
40 rsAssert(vecSize <= 4);
41
42 mBits = 0;
43 mTypeBits = 0;
44 mIsFloat = false;
45 mIsSigned = false;
46 mIsPixel = false;
47
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080048 switch (mKind) {
Jason Samsd01d9702009-12-23 14:35:29 -080049 case RS_KIND_PIXEL_L:
50 case RS_KIND_PIXEL_A:
51 mIsPixel = true;
52 rsAssert(mVectorSize == 1);
53 rsAssert(mNormalized == true);
54 break;
55 case RS_KIND_PIXEL_LA:
56 mIsPixel = true;
57 rsAssert(mVectorSize == 2);
58 rsAssert(mNormalized == true);
59 break;
60 case RS_KIND_PIXEL_RGB:
61 mIsPixel = true;
62 rsAssert(mVectorSize == 3);
63 rsAssert(mNormalized == true);
64 break;
65 case RS_KIND_PIXEL_RGBA:
66 mIsPixel = true;
67 rsAssert(mVectorSize == 4);
68 rsAssert(mNormalized == true);
69 break;
70 default:
71 break;
72 }
73
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080074 switch (mType) {
Jason Samsd01d9702009-12-23 14:35:29 -080075 case RS_TYPE_NONE:
76 return;
77 case RS_TYPE_UNSIGNED_5_6_5:
78 mVectorSize = 3;
79 mBits = 16;
80 mNormalized = true;
81 rsAssert(mKind == RS_KIND_PIXEL_RGB);
82 return;
83 case RS_TYPE_UNSIGNED_5_5_5_1:
84 mVectorSize = 4;
85 mBits = 16;
86 mNormalized = true;
87 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
88 return;
89 case RS_TYPE_UNSIGNED_4_4_4_4:
90 mVectorSize = 4;
91 mBits = 16;
92 mNormalized = true;
93 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
94 return;
Jason Sams39cd3172010-08-25 14:31:48 -070095
96 case RS_TYPE_MATRIX_4X4:
97 mTypeBits = 16 * 32;
98 rsAssert(mVectorSize == 1);
99 rsAssert(mNormalized == false);
100 rsAssert(mKind == RS_KIND_USER);
101 break;
102 case RS_TYPE_MATRIX_3X3:
103 mTypeBits = 9 * 32;
104 rsAssert(mVectorSize == 1);
105 rsAssert(mNormalized == false);
106 rsAssert(mKind == RS_KIND_USER);
107 break;
108 case RS_TYPE_MATRIX_2X2:
109 mTypeBits = 4 * 32;
110 rsAssert(mVectorSize == 1);
111 rsAssert(mNormalized == false);
112 rsAssert(mKind == RS_KIND_USER);
113 break;
114
Jason Samsd01d9702009-12-23 14:35:29 -0800115 case RS_TYPE_ELEMENT:
116 case RS_TYPE_TYPE:
117 case RS_TYPE_ALLOCATION:
118 case RS_TYPE_SAMPLER:
119 case RS_TYPE_SCRIPT:
120 case RS_TYPE_MESH:
121 case RS_TYPE_PROGRAM_FRAGMENT:
122 case RS_TYPE_PROGRAM_VERTEX:
123 case RS_TYPE_PROGRAM_RASTER:
124 case RS_TYPE_PROGRAM_STORE:
125 rsAssert(mVectorSize == 1);
126 rsAssert(mNormalized == false);
127 rsAssert(mKind == RS_KIND_USER);
128 mBits = 32;
129 mTypeBits = 32;
130 return;
131
132 case RS_TYPE_FLOAT_16:
133 mTypeBits = 16;
134 mIsFloat = true;
135 break;
136 case RS_TYPE_FLOAT_32:
137 mTypeBits = 32;
138 mIsFloat = true;
139 break;
140 case RS_TYPE_FLOAT_64:
141 mTypeBits = 64;
142 mIsFloat = true;
143 break;
144 case RS_TYPE_SIGNED_8:
145 mTypeBits = 8;
146 mIsSigned = true;
147 break;
148 case RS_TYPE_SIGNED_16:
149 mTypeBits = 16;
150 mIsSigned = true;
151 break;
152 case RS_TYPE_SIGNED_32:
153 mTypeBits = 32;
154 mIsSigned = true;
155 break;
156 case RS_TYPE_SIGNED_64:
157 mTypeBits = 64;
158 mIsSigned = true;
159 break;
160 case RS_TYPE_UNSIGNED_8:
161 mTypeBits = 8;
162 break;
163 case RS_TYPE_UNSIGNED_16:
164 mTypeBits = 16;
165 break;
166 case RS_TYPE_UNSIGNED_32:
167 mTypeBits = 32;
168 break;
169 case RS_TYPE_UNSIGNED_64:
170 mTypeBits = 64;
171 break;
Jason Sams5e9811f2010-06-21 17:42:41 -0700172
173 case RS_TYPE_BOOLEAN:
174 mTypeBits = 8;
175 break;
Jason Samsd01d9702009-12-23 14:35:29 -0800176 }
177
178 mBits = mTypeBits * mVectorSize;
179}
180
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800181bool Component::isReference() const {
Jason Samse3929c92010-08-09 18:13:33 -0700182 return (mType >= RS_TYPE_ELEMENT);
183}
Jason Samsd01d9702009-12-23 14:35:29 -0800184
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800185uint32_t Component::getGLType() const {
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 }
199
200 return 0;
201}
202
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800203uint32_t Component::getGLFormat() const {
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 }
212 return 0;
213}
214
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800215String8 Component::getGLSLType() const {
Jason Samsb4d35682010-01-04 16:52:27 -0800216 if (mType == RS_TYPE_SIGNED_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800217 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800218 case 1: return String8("int");
219 case 2: return String8("ivec2");
220 case 3: return String8("ivec3");
221 case 4: return String8("ivec4");
222 }
223 }
224 if (mType == RS_TYPE_FLOAT_32) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800225 switch (mVectorSize) {
Jason Samsb4d35682010-01-04 16:52:27 -0800226 case 1: return String8("float");
227 case 2: return String8("vec2");
228 case 3: return String8("vec3");
229 case 4: return String8("vec4");
230 }
231 }
Jason Sams39cd3172010-08-25 14:31:48 -0700232 if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) {
233 return String8("mat4");
234 }
235 if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) {
236 return String8("mat3");
237 }
238 if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) {
239 return String8("mat2");
240 }
Jason Samsb4d35682010-01-04 16:52:27 -0800241 return String8();
242}
243
Jason Sams39cd3172010-08-25 14:31:48 -0700244static const char * gTypeBasicStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800245 "NONE",
246 "F16",
247 "F32",
248 "F64",
249 "S8",
250 "S16",
251 "S32",
252 "S64",
253 "U8",
254 "U16",
255 "U32",
256 "U64",
Jason Sams5e9811f2010-06-21 17:42:41 -0700257 "BOOLEAN",
Jason Samsd01d9702009-12-23 14:35:29 -0800258 "UP_565",
259 "UP_5551",
260 "UP_4444",
Jason Sams39cd3172010-08-25 14:31:48 -0700261 "MATRIX_4X4",
262 "MATRIX_3X3",
263 "MATRIX_2X2",
264};
265
266static const char * gTypeObjStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800267 "ELEMENT",
268 "TYPE",
269 "ALLOCATION",
270 "SAMPLER",
271 "SCRIPT",
272 "MESH",
273 "PROGRAM_FRAGMENT",
274 "PROGRAM_VERTEX",
275 "PROGRAM_RASTER",
276 "PROGRAM_STORE",
277};
278
279static const char * gKindStrings[] = {
280 "USER",
281 "COLOR",
282 "POSITION",
283 "TEXTURE",
284 "NORMAL",
285 "INDEX",
286 "POINT_SIZE",
287 "PIXEL_L",
288 "PIXEL_A",
289 "PIXEL_LA",
290 "PIXEL_RGB",
291 "PIXEL_RGBA",
292};
293
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800294void Component::dumpLOGV(const char *prefix) const {
Jason Sams39cd3172010-08-25 14:31:48 -0700295 if (mType >= RS_TYPE_ELEMENT) {
296 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
297 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
298 } else {
299 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
300 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
301 }
Jason Samsd01d9702009-12-23 14:35:29 -0800302}
303
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800304void Component::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700305 stream->addU8((uint8_t)mType);
306 stream->addU8((uint8_t)mKind);
307 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
308 stream->addU32(mVectorSize);
309}
310
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800311void Component::loadFromStream(IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700312 mType = (RsDataType)stream->loadU8();
313 mKind = (RsDataKind)stream->loadU8();
314 uint8_t temp = stream->loadU8();
315 mNormalized = temp != 0;
316 mVectorSize = stream->loadU32();
317
318 set(mType, mKind, mNormalized, mVectorSize);
319}
320
321
322
Jason Samsd01d9702009-12-23 14:35:29 -0800323