blob: f51b23e96c363c1cf1048b0f3aaee00c4cd155f3 [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
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;
Jason Sams39cd3172010-08-25 14:31:48 -070098
99 case RS_TYPE_MATRIX_4X4:
100 mTypeBits = 16 * 32;
101 rsAssert(mVectorSize == 1);
102 rsAssert(mNormalized == false);
103 rsAssert(mKind == RS_KIND_USER);
104 break;
105 case RS_TYPE_MATRIX_3X3:
106 mTypeBits = 9 * 32;
107 rsAssert(mVectorSize == 1);
108 rsAssert(mNormalized == false);
109 rsAssert(mKind == RS_KIND_USER);
110 break;
111 case RS_TYPE_MATRIX_2X2:
112 mTypeBits = 4 * 32;
113 rsAssert(mVectorSize == 1);
114 rsAssert(mNormalized == false);
115 rsAssert(mKind == RS_KIND_USER);
116 break;
117
Jason Samsd01d9702009-12-23 14:35:29 -0800118 case RS_TYPE_ELEMENT:
119 case RS_TYPE_TYPE:
120 case RS_TYPE_ALLOCATION:
121 case RS_TYPE_SAMPLER:
122 case RS_TYPE_SCRIPT:
123 case RS_TYPE_MESH:
124 case RS_TYPE_PROGRAM_FRAGMENT:
125 case RS_TYPE_PROGRAM_VERTEX:
126 case RS_TYPE_PROGRAM_RASTER:
127 case RS_TYPE_PROGRAM_STORE:
128 rsAssert(mVectorSize == 1);
129 rsAssert(mNormalized == false);
130 rsAssert(mKind == RS_KIND_USER);
131 mBits = 32;
132 mTypeBits = 32;
133 return;
134
135 case RS_TYPE_FLOAT_16:
136 mTypeBits = 16;
137 mIsFloat = true;
138 break;
139 case RS_TYPE_FLOAT_32:
140 mTypeBits = 32;
141 mIsFloat = true;
142 break;
143 case RS_TYPE_FLOAT_64:
144 mTypeBits = 64;
145 mIsFloat = true;
146 break;
147 case RS_TYPE_SIGNED_8:
148 mTypeBits = 8;
149 mIsSigned = true;
150 break;
151 case RS_TYPE_SIGNED_16:
152 mTypeBits = 16;
153 mIsSigned = true;
154 break;
155 case RS_TYPE_SIGNED_32:
156 mTypeBits = 32;
157 mIsSigned = true;
158 break;
159 case RS_TYPE_SIGNED_64:
160 mTypeBits = 64;
161 mIsSigned = true;
162 break;
163 case RS_TYPE_UNSIGNED_8:
164 mTypeBits = 8;
165 break;
166 case RS_TYPE_UNSIGNED_16:
167 mTypeBits = 16;
168 break;
169 case RS_TYPE_UNSIGNED_32:
170 mTypeBits = 32;
171 break;
172 case RS_TYPE_UNSIGNED_64:
173 mTypeBits = 64;
174 break;
Jason Sams5e9811f2010-06-21 17:42:41 -0700175
176 case RS_TYPE_BOOLEAN:
177 mTypeBits = 8;
178 break;
Jason Samsd01d9702009-12-23 14:35:29 -0800179 }
180
181 mBits = mTypeBits * mVectorSize;
182}
183
Jason Samse3929c92010-08-09 18:13:33 -0700184bool Component::isReference() const
185{
186 return (mType >= RS_TYPE_ELEMENT);
187}
Jason Samsd01d9702009-12-23 14:35:29 -0800188
189
190
191uint32_t Component::getGLType() const
192{
193 switch (mType) {
194 case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
195 case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
196 case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
197
198 //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
199 case RS_TYPE_FLOAT_32: return GL_FLOAT;
200 case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
201 case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
202 case RS_TYPE_SIGNED_8: return GL_BYTE;
203 case RS_TYPE_SIGNED_16: return GL_SHORT;
204 default: break;
205 }
206
207 return 0;
208}
209
210uint32_t Component::getGLFormat() const
211{
212 switch (mKind) {
213 case RS_KIND_PIXEL_L: return GL_LUMINANCE;
214 case RS_KIND_PIXEL_A: return GL_ALPHA;
215 case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
216 case RS_KIND_PIXEL_RGB: return GL_RGB;
217 case RS_KIND_PIXEL_RGBA: return GL_RGBA;
218 default: break;
219 }
220 return 0;
221}
222
Jason Samsb4d35682010-01-04 16:52:27 -0800223String8 Component::getGLSLType() const
224{
225 if (mType == RS_TYPE_SIGNED_32) {
226 switch(mVectorSize) {
227 case 1: return String8("int");
228 case 2: return String8("ivec2");
229 case 3: return String8("ivec3");
230 case 4: return String8("ivec4");
231 }
232 }
233 if (mType == RS_TYPE_FLOAT_32) {
234 switch(mVectorSize) {
235 case 1: return String8("float");
236 case 2: return String8("vec2");
237 case 3: return String8("vec3");
238 case 4: return String8("vec4");
239 }
240 }
Jason Sams39cd3172010-08-25 14:31:48 -0700241 if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) {
242 return String8("mat4");
243 }
244 if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) {
245 return String8("mat3");
246 }
247 if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) {
248 return String8("mat2");
249 }
Jason Samsb4d35682010-01-04 16:52:27 -0800250 return String8();
251}
252
Jason Sams39cd3172010-08-25 14:31:48 -0700253static const char * gTypeBasicStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800254 "NONE",
255 "F16",
256 "F32",
257 "F64",
258 "S8",
259 "S16",
260 "S32",
261 "S64",
262 "U8",
263 "U16",
264 "U32",
265 "U64",
Jason Sams5e9811f2010-06-21 17:42:41 -0700266 "BOOLEAN",
Jason Samsd01d9702009-12-23 14:35:29 -0800267 "UP_565",
268 "UP_5551",
269 "UP_4444",
Jason Sams39cd3172010-08-25 14:31:48 -0700270 "MATRIX_4X4",
271 "MATRIX_3X3",
272 "MATRIX_2X2",
273};
274
275static const char * gTypeObjStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800276 "ELEMENT",
277 "TYPE",
278 "ALLOCATION",
279 "SAMPLER",
280 "SCRIPT",
281 "MESH",
282 "PROGRAM_FRAGMENT",
283 "PROGRAM_VERTEX",
284 "PROGRAM_RASTER",
285 "PROGRAM_STORE",
286};
287
288static const char * gKindStrings[] = {
289 "USER",
290 "COLOR",
291 "POSITION",
292 "TEXTURE",
293 "NORMAL",
294 "INDEX",
295 "POINT_SIZE",
296 "PIXEL_L",
297 "PIXEL_A",
298 "PIXEL_LA",
299 "PIXEL_RGB",
300 "PIXEL_RGBA",
301};
302
303void Component::dumpLOGV(const char *prefix) const
304{
Jason Sams39cd3172010-08-25 14:31:48 -0700305 if (mType >= RS_TYPE_ELEMENT) {
306 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
307 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
308 } else {
309 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
310 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
311 }
Jason Samsd01d9702009-12-23 14:35:29 -0800312}
313
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700314void Component::serialize(OStream *stream) const
315{
316 stream->addU8((uint8_t)mType);
317 stream->addU8((uint8_t)mKind);
318 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
319 stream->addU32(mVectorSize);
320}
321
322void Component::loadFromStream(IStream *stream)
323{
324 mType = (RsDataType)stream->loadU8();
325 mKind = (RsDataKind)stream->loadU8();
326 uint8_t temp = stream->loadU8();
327 mNormalized = temp != 0;
328 mVectorSize = stream->loadU32();
329
330 set(mType, mKind, mNormalized, mVectorSize);
331}
332
333
334
Jason Samsd01d9702009-12-23 14:35:29 -0800335