xref: /aosp_15_r20/frameworks/rs/rsComponent.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include "rsComponent.h"
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker namespace android {
20*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
21*e1eccf28SAndroid Build Coastguard Worker 
Component()22*e1eccf28SAndroid Build Coastguard Worker Component::Component() {
23*e1eccf28SAndroid Build Coastguard Worker     set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
24*e1eccf28SAndroid Build Coastguard Worker }
25*e1eccf28SAndroid Build Coastguard Worker 
~Component()26*e1eccf28SAndroid Build Coastguard Worker Component::~Component() {
27*e1eccf28SAndroid Build Coastguard Worker }
28*e1eccf28SAndroid Build Coastguard Worker 
set(RsDataType dt,RsDataKind dk,bool norm,uint32_t vecSize)29*e1eccf28SAndroid Build Coastguard Worker void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
30*e1eccf28SAndroid Build Coastguard Worker     mType = dt;
31*e1eccf28SAndroid Build Coastguard Worker     mKind = dk;
32*e1eccf28SAndroid Build Coastguard Worker     mNormalized = norm;
33*e1eccf28SAndroid Build Coastguard Worker     mVectorSize = vecSize;
34*e1eccf28SAndroid Build Coastguard Worker     rsAssert(vecSize <= 4);
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker     mBits = 0;
37*e1eccf28SAndroid Build Coastguard Worker     mTypeBits = 0;
38*e1eccf28SAndroid Build Coastguard Worker     mIsFloat = false;
39*e1eccf28SAndroid Build Coastguard Worker     mIsSigned = false;
40*e1eccf28SAndroid Build Coastguard Worker     mIsPixel = false;
41*e1eccf28SAndroid Build Coastguard Worker 
42*e1eccf28SAndroid Build Coastguard Worker     switch (mKind) {
43*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_L:
44*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_A:
45*e1eccf28SAndroid Build Coastguard Worker         mIsPixel = true;
46*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
47*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == true);
48*e1eccf28SAndroid Build Coastguard Worker         break;
49*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_LA:
50*e1eccf28SAndroid Build Coastguard Worker         mIsPixel = true;
51*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 2);
52*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == true);
53*e1eccf28SAndroid Build Coastguard Worker         break;
54*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_RGB:
55*e1eccf28SAndroid Build Coastguard Worker         mIsPixel = true;
56*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 3);
57*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == true);
58*e1eccf28SAndroid Build Coastguard Worker         break;
59*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_RGBA:
60*e1eccf28SAndroid Build Coastguard Worker         mIsPixel = true;
61*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 4);
62*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == true);
63*e1eccf28SAndroid Build Coastguard Worker         break;
64*e1eccf28SAndroid Build Coastguard Worker     case RS_KIND_PIXEL_YUV:
65*e1eccf28SAndroid Build Coastguard Worker         mIsPixel = true;
66*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
67*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == true);
68*e1eccf28SAndroid Build Coastguard Worker         break;
69*e1eccf28SAndroid Build Coastguard Worker 
70*e1eccf28SAndroid Build Coastguard Worker     default:
71*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind != RS_KIND_INVALID);
72*e1eccf28SAndroid Build Coastguard Worker         break;
73*e1eccf28SAndroid Build Coastguard Worker     }
74*e1eccf28SAndroid Build Coastguard Worker 
75*e1eccf28SAndroid Build Coastguard Worker     switch (mType) {
76*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_NONE:
77*e1eccf28SAndroid Build Coastguard Worker         return;
78*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_5_6_5:
79*e1eccf28SAndroid Build Coastguard Worker         mVectorSize = 3;
80*e1eccf28SAndroid Build Coastguard Worker         mBits = 16;
81*e1eccf28SAndroid Build Coastguard Worker         mNormalized = true;
82*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_PIXEL_RGB);
83*e1eccf28SAndroid Build Coastguard Worker         return;
84*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_5_5_5_1:
85*e1eccf28SAndroid Build Coastguard Worker         mVectorSize = 4;
86*e1eccf28SAndroid Build Coastguard Worker         mBits = 16;
87*e1eccf28SAndroid Build Coastguard Worker         mNormalized = true;
88*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_PIXEL_RGBA);
89*e1eccf28SAndroid Build Coastguard Worker         return;
90*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_4_4_4_4:
91*e1eccf28SAndroid Build Coastguard Worker         mVectorSize = 4;
92*e1eccf28SAndroid Build Coastguard Worker         mBits = 16;
93*e1eccf28SAndroid Build Coastguard Worker         mNormalized = true;
94*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_PIXEL_RGBA);
95*e1eccf28SAndroid Build Coastguard Worker         return;
96*e1eccf28SAndroid Build Coastguard Worker 
97*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_MATRIX_4X4:
98*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 16 * 32;
99*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
100*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == false);
101*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_USER);
102*e1eccf28SAndroid Build Coastguard Worker         break;
103*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_MATRIX_3X3:
104*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 9 * 32;
105*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
106*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == false);
107*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_USER);
108*e1eccf28SAndroid Build Coastguard Worker         break;
109*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_MATRIX_2X2:
110*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 4 * 32;
111*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
112*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == false);
113*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_USER);
114*e1eccf28SAndroid Build Coastguard Worker         break;
115*e1eccf28SAndroid Build Coastguard Worker 
116*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_ELEMENT:
117*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_TYPE:
118*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_ALLOCATION:
119*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SAMPLER:
120*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SCRIPT:
121*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_MESH:
122*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_PROGRAM_FRAGMENT:
123*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_PROGRAM_VERTEX:
124*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_PROGRAM_RASTER:
125*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_PROGRAM_STORE:
126*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_FONT:
127*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mVectorSize == 1);
128*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mNormalized == false);
129*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mKind == RS_KIND_USER);
130*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
131*e1eccf28SAndroid Build Coastguard Worker         // Large object pointers on 64-bit targets.
132*e1eccf28SAndroid Build Coastguard Worker         mBits = 256;
133*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 256;
134*e1eccf28SAndroid Build Coastguard Worker #else
135*e1eccf28SAndroid Build Coastguard Worker         // Single pointer objects on 32-bit targets.
136*e1eccf28SAndroid Build Coastguard Worker         mBits = 32;
137*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 32;
138*e1eccf28SAndroid Build Coastguard Worker #endif  // __LP64__
139*e1eccf28SAndroid Build Coastguard Worker         return;
140*e1eccf28SAndroid Build Coastguard Worker 
141*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_FLOAT_16:
142*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 16;
143*e1eccf28SAndroid Build Coastguard Worker         mIsFloat = true;
144*e1eccf28SAndroid Build Coastguard Worker         break;
145*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_FLOAT_32:
146*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 32;
147*e1eccf28SAndroid Build Coastguard Worker         mIsFloat = true;
148*e1eccf28SAndroid Build Coastguard Worker         break;
149*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_FLOAT_64:
150*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 64;
151*e1eccf28SAndroid Build Coastguard Worker         mIsFloat = true;
152*e1eccf28SAndroid Build Coastguard Worker         break;
153*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SIGNED_8:
154*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 8;
155*e1eccf28SAndroid Build Coastguard Worker         mIsSigned = true;
156*e1eccf28SAndroid Build Coastguard Worker         break;
157*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SIGNED_16:
158*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 16;
159*e1eccf28SAndroid Build Coastguard Worker         mIsSigned = true;
160*e1eccf28SAndroid Build Coastguard Worker         break;
161*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SIGNED_32:
162*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 32;
163*e1eccf28SAndroid Build Coastguard Worker         mIsSigned = true;
164*e1eccf28SAndroid Build Coastguard Worker         break;
165*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_SIGNED_64:
166*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 64;
167*e1eccf28SAndroid Build Coastguard Worker         mIsSigned = true;
168*e1eccf28SAndroid Build Coastguard Worker         break;
169*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_8:
170*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 8;
171*e1eccf28SAndroid Build Coastguard Worker         break;
172*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_16:
173*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 16;
174*e1eccf28SAndroid Build Coastguard Worker         break;
175*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_32:
176*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 32;
177*e1eccf28SAndroid Build Coastguard Worker         break;
178*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_UNSIGNED_64:
179*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 64;
180*e1eccf28SAndroid Build Coastguard Worker         break;
181*e1eccf28SAndroid Build Coastguard Worker 
182*e1eccf28SAndroid Build Coastguard Worker     case RS_TYPE_BOOLEAN:
183*e1eccf28SAndroid Build Coastguard Worker         mTypeBits = 8;
184*e1eccf28SAndroid Build Coastguard Worker         break;
185*e1eccf28SAndroid Build Coastguard Worker     default:
186*e1eccf28SAndroid Build Coastguard Worker         rsAssert(mType != RS_TYPE_INVALID);
187*e1eccf28SAndroid Build Coastguard Worker         rsAssert(0);
188*e1eccf28SAndroid Build Coastguard Worker         break;
189*e1eccf28SAndroid Build Coastguard Worker     }
190*e1eccf28SAndroid Build Coastguard Worker 
191*e1eccf28SAndroid Build Coastguard Worker     mBitsUnpadded = mTypeBits * mVectorSize;
192*e1eccf28SAndroid Build Coastguard Worker     mBits = mTypeBits * rsHigherPow2(mVectorSize);
193*e1eccf28SAndroid Build Coastguard Worker }
194*e1eccf28SAndroid Build Coastguard Worker 
isReference() const195*e1eccf28SAndroid Build Coastguard Worker bool Component::isReference() const {
196*e1eccf28SAndroid Build Coastguard Worker     return (mType >= RS_TYPE_ELEMENT);
197*e1eccf28SAndroid Build Coastguard Worker }
198*e1eccf28SAndroid Build Coastguard Worker 
199*e1eccf28SAndroid Build Coastguard Worker static const char * gTypeBasicStrings[] = {
200*e1eccf28SAndroid Build Coastguard Worker     "NONE",
201*e1eccf28SAndroid Build Coastguard Worker     "F16",
202*e1eccf28SAndroid Build Coastguard Worker     "F32",
203*e1eccf28SAndroid Build Coastguard Worker     "F64",
204*e1eccf28SAndroid Build Coastguard Worker     "S8",
205*e1eccf28SAndroid Build Coastguard Worker     "S16",
206*e1eccf28SAndroid Build Coastguard Worker     "S32",
207*e1eccf28SAndroid Build Coastguard Worker     "S64",
208*e1eccf28SAndroid Build Coastguard Worker     "U8",
209*e1eccf28SAndroid Build Coastguard Worker     "U16",
210*e1eccf28SAndroid Build Coastguard Worker     "U32",
211*e1eccf28SAndroid Build Coastguard Worker     "U64",
212*e1eccf28SAndroid Build Coastguard Worker     "BOOLEAN",
213*e1eccf28SAndroid Build Coastguard Worker     "UP_565",
214*e1eccf28SAndroid Build Coastguard Worker     "UP_5551",
215*e1eccf28SAndroid Build Coastguard Worker     "UP_4444",
216*e1eccf28SAndroid Build Coastguard Worker     "MATRIX_4X4",
217*e1eccf28SAndroid Build Coastguard Worker     "MATRIX_3X3",
218*e1eccf28SAndroid Build Coastguard Worker     "MATRIX_2X2",
219*e1eccf28SAndroid Build Coastguard Worker };
220*e1eccf28SAndroid Build Coastguard Worker 
221*e1eccf28SAndroid Build Coastguard Worker static const char * gTypeObjStrings[] = {
222*e1eccf28SAndroid Build Coastguard Worker     "ELEMENT",
223*e1eccf28SAndroid Build Coastguard Worker     "TYPE",
224*e1eccf28SAndroid Build Coastguard Worker     "ALLOCATION",
225*e1eccf28SAndroid Build Coastguard Worker     "SAMPLER",
226*e1eccf28SAndroid Build Coastguard Worker     "SCRIPT",
227*e1eccf28SAndroid Build Coastguard Worker     "MESH",
228*e1eccf28SAndroid Build Coastguard Worker     "PROGRAM_FRAGMENT",
229*e1eccf28SAndroid Build Coastguard Worker     "PROGRAM_VERTEX",
230*e1eccf28SAndroid Build Coastguard Worker     "PROGRAM_RASTER",
231*e1eccf28SAndroid Build Coastguard Worker     "PROGRAM_STORE",
232*e1eccf28SAndroid Build Coastguard Worker };
233*e1eccf28SAndroid Build Coastguard Worker 
234*e1eccf28SAndroid Build Coastguard Worker static const char * gKindStrings[] = {
235*e1eccf28SAndroid Build Coastguard Worker     "USER",
236*e1eccf28SAndroid Build Coastguard Worker     "COLOR",
237*e1eccf28SAndroid Build Coastguard Worker     "POSITION",
238*e1eccf28SAndroid Build Coastguard Worker     "TEXTURE",
239*e1eccf28SAndroid Build Coastguard Worker     "NORMAL",
240*e1eccf28SAndroid Build Coastguard Worker     "INDEX",
241*e1eccf28SAndroid Build Coastguard Worker     "POINT_SIZE",
242*e1eccf28SAndroid Build Coastguard Worker     "PIXEL_L",
243*e1eccf28SAndroid Build Coastguard Worker     "PIXEL_A",
244*e1eccf28SAndroid Build Coastguard Worker     "PIXEL_LA",
245*e1eccf28SAndroid Build Coastguard Worker     "PIXEL_RGB",
246*e1eccf28SAndroid Build Coastguard Worker     "PIXEL_RGBA",
247*e1eccf28SAndroid Build Coastguard Worker };
248*e1eccf28SAndroid Build Coastguard Worker 
dumpLOGV(const char * prefix) const249*e1eccf28SAndroid Build Coastguard Worker void Component::dumpLOGV(const char *prefix) const {
250*e1eccf28SAndroid Build Coastguard Worker     if (mType >= RS_TYPE_ELEMENT) {
251*e1eccf28SAndroid Build Coastguard Worker         ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
252*e1eccf28SAndroid Build Coastguard Worker              prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
253*e1eccf28SAndroid Build Coastguard Worker     } else {
254*e1eccf28SAndroid Build Coastguard Worker         ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
255*e1eccf28SAndroid Build Coastguard Worker              prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
256*e1eccf28SAndroid Build Coastguard Worker     }
257*e1eccf28SAndroid Build Coastguard Worker }
258*e1eccf28SAndroid Build Coastguard Worker 
serialize(OStream * stream) const259*e1eccf28SAndroid Build Coastguard Worker void Component::serialize(OStream *stream) const {
260*e1eccf28SAndroid Build Coastguard Worker     stream->addU8((uint8_t)mType);
261*e1eccf28SAndroid Build Coastguard Worker     stream->addU8((uint8_t)mKind);
262*e1eccf28SAndroid Build Coastguard Worker     stream->addU8((uint8_t)(mNormalized ? 1 : 0));
263*e1eccf28SAndroid Build Coastguard Worker     stream->addU32(mVectorSize);
264*e1eccf28SAndroid Build Coastguard Worker }
265*e1eccf28SAndroid Build Coastguard Worker 
loadFromStream(IStream * stream)266*e1eccf28SAndroid Build Coastguard Worker void Component::loadFromStream(IStream *stream) {
267*e1eccf28SAndroid Build Coastguard Worker     mType = (RsDataType)stream->loadU8();
268*e1eccf28SAndroid Build Coastguard Worker     mKind = (RsDataKind)stream->loadU8();
269*e1eccf28SAndroid Build Coastguard Worker     uint8_t temp = stream->loadU8();
270*e1eccf28SAndroid Build Coastguard Worker     mNormalized = temp != 0;
271*e1eccf28SAndroid Build Coastguard Worker     mVectorSize = stream->loadU32();
272*e1eccf28SAndroid Build Coastguard Worker 
273*e1eccf28SAndroid Build Coastguard Worker     set(mType, mKind, mNormalized, mVectorSize);
274*e1eccf28SAndroid Build Coastguard Worker }
275*e1eccf28SAndroid Build Coastguard Worker 
276*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
277*e1eccf28SAndroid Build Coastguard Worker } // namespace android
278