blob: 9c2c2005f38d5a34db5cb11d1cfa4f81b0d99c28 [file] [log] [blame]
Jason Sams718cd1f2009-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 Sams718cd1f2009-12-23 14:35:29 -080019using namespace android;
20using namespace android::renderscript;
21
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080022Component::Component() {
Jason Sams718cd1f2009-12-23 14:35:29 -080023 set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
24}
25
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080026Component::~Component() {
Jason Sams718cd1f2009-12-23 14:35:29 -080027}
28
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080029void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
Jason Sams718cd1f2009-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 Sakhartchouked9f2102010-11-09 17:00:54 -080042 switch (mKind) {
Jason Sams718cd1f2009-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:
Alex Sakhartchouk5b5664a2011-12-29 11:17:38 -080065 rsAssert(mKind != RS_KIND_INVALID);
Jason Sams718cd1f2009-12-23 14:35:29 -080066 break;
67 }
68
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080069 switch (mType) {
Jason Sams718cd1f2009-12-23 14:35:29 -080070 case RS_TYPE_NONE:
71 return;
72 case RS_TYPE_UNSIGNED_5_6_5:
73 mVectorSize = 3;
74 mBits = 16;
75 mNormalized = true;
76 rsAssert(mKind == RS_KIND_PIXEL_RGB);
77 return;
78 case RS_TYPE_UNSIGNED_5_5_5_1:
79 mVectorSize = 4;
80 mBits = 16;
81 mNormalized = true;
82 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
83 return;
84 case RS_TYPE_UNSIGNED_4_4_4_4:
85 mVectorSize = 4;
86 mBits = 16;
87 mNormalized = true;
88 rsAssert(mKind == RS_KIND_PIXEL_RGBA);
89 return;
Jason Sams1d45c472010-08-25 14:31:48 -070090
91 case RS_TYPE_MATRIX_4X4:
92 mTypeBits = 16 * 32;
93 rsAssert(mVectorSize == 1);
94 rsAssert(mNormalized == false);
95 rsAssert(mKind == RS_KIND_USER);
96 break;
97 case RS_TYPE_MATRIX_3X3:
98 mTypeBits = 9 * 32;
99 rsAssert(mVectorSize == 1);
100 rsAssert(mNormalized == false);
101 rsAssert(mKind == RS_KIND_USER);
102 break;
103 case RS_TYPE_MATRIX_2X2:
104 mTypeBits = 4 * 32;
105 rsAssert(mVectorSize == 1);
106 rsAssert(mNormalized == false);
107 rsAssert(mKind == RS_KIND_USER);
108 break;
109
Jason Sams718cd1f2009-12-23 14:35:29 -0800110 case RS_TYPE_ELEMENT:
111 case RS_TYPE_TYPE:
112 case RS_TYPE_ALLOCATION:
113 case RS_TYPE_SAMPLER:
114 case RS_TYPE_SCRIPT:
115 case RS_TYPE_MESH:
116 case RS_TYPE_PROGRAM_FRAGMENT:
117 case RS_TYPE_PROGRAM_VERTEX:
118 case RS_TYPE_PROGRAM_RASTER:
119 case RS_TYPE_PROGRAM_STORE:
120 rsAssert(mVectorSize == 1);
121 rsAssert(mNormalized == false);
122 rsAssert(mKind == RS_KIND_USER);
123 mBits = 32;
124 mTypeBits = 32;
125 return;
126
127 case RS_TYPE_FLOAT_16:
128 mTypeBits = 16;
129 mIsFloat = true;
130 break;
131 case RS_TYPE_FLOAT_32:
132 mTypeBits = 32;
133 mIsFloat = true;
134 break;
135 case RS_TYPE_FLOAT_64:
136 mTypeBits = 64;
137 mIsFloat = true;
138 break;
139 case RS_TYPE_SIGNED_8:
140 mTypeBits = 8;
141 mIsSigned = true;
142 break;
143 case RS_TYPE_SIGNED_16:
144 mTypeBits = 16;
145 mIsSigned = true;
146 break;
147 case RS_TYPE_SIGNED_32:
148 mTypeBits = 32;
149 mIsSigned = true;
150 break;
151 case RS_TYPE_SIGNED_64:
152 mTypeBits = 64;
153 mIsSigned = true;
154 break;
155 case RS_TYPE_UNSIGNED_8:
156 mTypeBits = 8;
157 break;
158 case RS_TYPE_UNSIGNED_16:
159 mTypeBits = 16;
160 break;
161 case RS_TYPE_UNSIGNED_32:
162 mTypeBits = 32;
163 break;
164 case RS_TYPE_UNSIGNED_64:
165 mTypeBits = 64;
166 break;
Jason Samsf110d4b2010-06-21 17:42:41 -0700167
168 case RS_TYPE_BOOLEAN:
169 mTypeBits = 8;
170 break;
Alex Sakhartchouk5b5664a2011-12-29 11:17:38 -0800171 default:
172 rsAssert(mType != RS_TYPE_INVALID);
173 break;
Jason Sams718cd1f2009-12-23 14:35:29 -0800174 }
175
Alex Sakhartchouke60149d2011-11-15 15:15:21 -0800176 mBitsUnpadded = mTypeBits * mVectorSize;
177 mBits = mTypeBits * rsHigherPow2(mVectorSize);
Jason Sams718cd1f2009-12-23 14:35:29 -0800178}
179
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800180bool Component::isReference() const {
Jason Samsb28ca96f2010-08-09 18:13:33 -0700181 return (mType >= RS_TYPE_ELEMENT);
182}
Jason Sams718cd1f2009-12-23 14:35:29 -0800183
Jason Sams1d45c472010-08-25 14:31:48 -0700184static const char * gTypeBasicStrings[] = {
Jason Sams718cd1f2009-12-23 14:35:29 -0800185 "NONE",
186 "F16",
187 "F32",
188 "F64",
189 "S8",
190 "S16",
191 "S32",
192 "S64",
193 "U8",
194 "U16",
195 "U32",
196 "U64",
Jason Samsf110d4b2010-06-21 17:42:41 -0700197 "BOOLEAN",
Jason Sams718cd1f2009-12-23 14:35:29 -0800198 "UP_565",
199 "UP_5551",
200 "UP_4444",
Jason Sams1d45c472010-08-25 14:31:48 -0700201 "MATRIX_4X4",
202 "MATRIX_3X3",
203 "MATRIX_2X2",
204};
205
206static const char * gTypeObjStrings[] = {
Jason Sams718cd1f2009-12-23 14:35:29 -0800207 "ELEMENT",
208 "TYPE",
209 "ALLOCATION",
210 "SAMPLER",
211 "SCRIPT",
212 "MESH",
213 "PROGRAM_FRAGMENT",
214 "PROGRAM_VERTEX",
215 "PROGRAM_RASTER",
216 "PROGRAM_STORE",
217};
218
219static const char * gKindStrings[] = {
220 "USER",
221 "COLOR",
222 "POSITION",
223 "TEXTURE",
224 "NORMAL",
225 "INDEX",
226 "POINT_SIZE",
227 "PIXEL_L",
228 "PIXEL_A",
229 "PIXEL_LA",
230 "PIXEL_RGB",
231 "PIXEL_RGBA",
232};
233
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800234void Component::dumpLOGV(const char *prefix) const {
Jason Sams1d45c472010-08-25 14:31:48 -0700235 if (mType >= RS_TYPE_ELEMENT) {
Steve Block71f2cf12011-10-20 11:56:00 +0100236 ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
Jason Sams1d45c472010-08-25 14:31:48 -0700237 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
238 } else {
Steve Block71f2cf12011-10-20 11:56:00 +0100239 ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
Jason Sams1d45c472010-08-25 14:31:48 -0700240 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
241 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800242}
243
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800244void Component::serialize(OStream *stream) const {
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700245 stream->addU8((uint8_t)mType);
246 stream->addU8((uint8_t)mKind);
247 stream->addU8((uint8_t)(mNormalized ? 1 : 0));
248 stream->addU32(mVectorSize);
249}
250
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800251void Component::loadFromStream(IStream *stream) {
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700252 mType = (RsDataType)stream->loadU8();
253 mKind = (RsDataKind)stream->loadU8();
254 uint8_t temp = stream->loadU8();
255 mNormalized = temp != 0;
256 mVectorSize = stream->loadU32();
257
258 set(mType, mKind, mNormalized, mVectorSize);
259}
260
261
262
Jason Sams718cd1f2009-12-23 14:35:29 -0800263