blob: 21b98f6193a2885605e60fbbeea4dc71a6fde24a [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
Jason Samsd01d9702009-12-23 14:35:29 -080019using namespace android;
20using namespace android::renderscript;
21
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080022Component::Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080023 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
24}
25
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080026Component::~Component() {
Jason Samsd01d9702009-12-23 14:35:29 -080027}
28
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080029void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
Jason Samsd01d9702009-12-23 14:35:29 -080030 mType = dt;
31 mKind = dk;
32 mNormalized = norm;
33 mVectorSize = vecSize;
34 rsAssert(vecSize <= 4);
35
36 mBits = 0;
37 mTypeBits = 0;
38 mIsFloat = false;
39 mIsSigned = false;
40 mIsPixel = false;
41
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080042 switch (mKind) {
Jason Samsd01d9702009-12-23 14:35:29 -080043 case RS_KIND_PIXEL_L:
44 case RS_KIND_PIXEL_A:
45 mIsPixel = true;
46 rsAssert(mVectorSize == 1);
47 rsAssert(mNormalized == true);
48 break;
49 case RS_KIND_PIXEL_LA:
50 mIsPixel = true;
51 rsAssert(mVectorSize == 2);
52 rsAssert(mNormalized == true);
53 break;
54 case RS_KIND_PIXEL_RGB:
55 mIsPixel = true;
56 rsAssert(mVectorSize == 3);
57 rsAssert(mNormalized == true);
58 break;
59 case RS_KIND_PIXEL_RGBA:
60 mIsPixel = true;
61 rsAssert(mVectorSize == 4);
62 rsAssert(mNormalized == true);
63 break;
64 default:
65 break;
66 }
67
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080068 switch (mType) {
Jason Samsd01d9702009-12-23 14:35:29 -080069 case RS_TYPE_NONE:
70 return;
71 case RS_TYPE_UNSIGNED_5_6_5:
72 mVectorSize = 3;
73 mBits = 16;
74 mNormalized = true;
75 rsAssert(mKind == RS_KIND_PIXEL_RGB);
76 return;
77 case RS_TYPE_UNSIGNED_5_5_5_1:
78 mVectorSize = 4;
79 mBits = 16;
80 mNormalized = true;
81 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
82 return;
83 case RS_TYPE_UNSIGNED_4_4_4_4:
84 mVectorSize = 4;
85 mBits = 16;
86 mNormalized = true;
87 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
88 return;
Jason Sams39cd3172010-08-25 14:31:48 -070089
90 case RS_TYPE_MATRIX_4X4:
91 mTypeBits = 16 * 32;
92 rsAssert(mVectorSize == 1);
93 rsAssert(mNormalized == false);
94 rsAssert(mKind == RS_KIND_USER);
95 break;
96 case RS_TYPE_MATRIX_3X3:
97 mTypeBits = 9 * 32;
98 rsAssert(mVectorSize == 1);
99 rsAssert(mNormalized == false);
100 rsAssert(mKind == RS_KIND_USER);
101 break;
102 case RS_TYPE_MATRIX_2X2:
103 mTypeBits = 4 * 32;
104 rsAssert(mVectorSize == 1);
105 rsAssert(mNormalized == false);
106 rsAssert(mKind == RS_KIND_USER);
107 break;
108
Jason Samsd01d9702009-12-23 14:35:29 -0800109 case RS_TYPE_ELEMENT:
110 case RS_TYPE_TYPE:
111 case RS_TYPE_ALLOCATION:
112 case RS_TYPE_SAMPLER:
113 case RS_TYPE_SCRIPT:
114 case RS_TYPE_MESH:
115 case RS_TYPE_PROGRAM_FRAGMENT:
116 case RS_TYPE_PROGRAM_VERTEX:
117 case RS_TYPE_PROGRAM_RASTER:
118 case RS_TYPE_PROGRAM_STORE:
119 rsAssert(mVectorSize == 1);
120 rsAssert(mNormalized == false);
121 rsAssert(mKind == RS_KIND_USER);
122 mBits = 32;
123 mTypeBits = 32;
124 return;
125
126 case RS_TYPE_FLOAT_16:
127 mTypeBits = 16;
128 mIsFloat = true;
129 break;
130 case RS_TYPE_FLOAT_32:
131 mTypeBits = 32;
132 mIsFloat = true;
133 break;
134 case RS_TYPE_FLOAT_64:
135 mTypeBits = 64;
136 mIsFloat = true;
137 break;
138 case RS_TYPE_SIGNED_8:
139 mTypeBits = 8;
140 mIsSigned = true;
141 break;
142 case RS_TYPE_SIGNED_16:
143 mTypeBits = 16;
144 mIsSigned = true;
145 break;
146 case RS_TYPE_SIGNED_32:
147 mTypeBits = 32;
148 mIsSigned = true;
149 break;
150 case RS_TYPE_SIGNED_64:
151 mTypeBits = 64;
152 mIsSigned = true;
153 break;
154 case RS_TYPE_UNSIGNED_8:
155 mTypeBits = 8;
156 break;
157 case RS_TYPE_UNSIGNED_16:
158 mTypeBits = 16;
159 break;
160 case RS_TYPE_UNSIGNED_32:
161 mTypeBits = 32;
162 break;
163 case RS_TYPE_UNSIGNED_64:
164 mTypeBits = 64;
165 break;
Jason Sams5e9811f2010-06-21 17:42:41 -0700166
167 case RS_TYPE_BOOLEAN:
168 mTypeBits = 8;
169 break;
Jason Samsd01d9702009-12-23 14:35:29 -0800170 }
171
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -0800172 mBitsUnpadded = mTypeBits * mVectorSize;
173 mBits = mTypeBits * rsHigherPow2(mVectorSize);
Jason Samsd01d9702009-12-23 14:35:29 -0800174}
175
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800176bool Component::isReference() const {
Jason Samse3929c92010-08-09 18:13:33 -0700177 return (mType >= RS_TYPE_ELEMENT);
178}
Jason Samsd01d9702009-12-23 14:35:29 -0800179
Jason Sams39cd3172010-08-25 14:31:48 -0700180static const char * gTypeBasicStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800181 "NONE",
182 "F16",
183 "F32",
184 "F64",
185 "S8",
186 "S16",
187 "S32",
188 "S64",
189 "U8",
190 "U16",
191 "U32",
192 "U64",
Jason Sams5e9811f2010-06-21 17:42:41 -0700193 "BOOLEAN",
Jason Samsd01d9702009-12-23 14:35:29 -0800194 "UP_565",
195 "UP_5551",
196 "UP_4444",
Jason Sams39cd3172010-08-25 14:31:48 -0700197 "MATRIX_4X4",
198 "MATRIX_3X3",
199 "MATRIX_2X2",
200};
201
202static const char * gTypeObjStrings[] = {
Jason Samsd01d9702009-12-23 14:35:29 -0800203 "ELEMENT",
204 "TYPE",
205 "ALLOCATION",
206 "SAMPLER",
207 "SCRIPT",
208 "MESH",
209 "PROGRAM_FRAGMENT",
210 "PROGRAM_VERTEX",
211 "PROGRAM_RASTER",
212 "PROGRAM_STORE",
213};
214
215static const char * gKindStrings[] = {
216 "USER",
217 "COLOR",
218 "POSITION",
219 "TEXTURE",
220 "NORMAL",
221 "INDEX",
222 "POINT_SIZE",
223 "PIXEL_L",
224 "PIXEL_A",
225 "PIXEL_LA",
226 "PIXEL_RGB",
227 "PIXEL_RGBA",
228};
229
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800230void Component::dumpLOGV(const char *prefix) const {
Jason Sams39cd3172010-08-25 14:31:48 -0700231 if (mType >= RS_TYPE_ELEMENT) {
Steve Block65982012011-10-20 11:56:00 +0100232 ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
Jason Sams39cd3172010-08-25 14:31:48 -0700233 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
234 } else {
Steve Block65982012011-10-20 11:56:00 +0100235 ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
Jason Sams39cd3172010-08-25 14:31:48 -0700236 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
237 }
Jason Samsd01d9702009-12-23 14:35:29 -0800238}
239
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800240void Component::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700241 stream->addU8((uint8_t)mType);
242 stream->addU8((uint8_t)mKind);
243 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
244 stream->addU32(mVectorSize);
245}
246
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800247void Component::loadFromStream(IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700248 mType = (RsDataType)stream->loadU8();
249 mKind = (RsDataKind)stream->loadU8();
250 uint8_t temp = stream->loadU8();
251 mNormalized = temp != 0;
252 mVectorSize = stream->loadU32();
253
254 set(mType, mKind, mNormalized, mVectorSize);
255}
256
257
258
Jason Samsd01d9702009-12-23 14:35:29 -0800259