rsComponent.cpp revision 25a59d051a218bd608b005a149509464b3e6d4f0
1/*
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
19using namespace android;
20using namespace android::renderscript;
21
22Component::Component() {
23    set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
24}
25
26Component::~Component() {
27}
28
29void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
30    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
42    switch (mKind) {
43    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        rsAssert(mKind != RS_KIND_INVALID);
66        break;
67    }
68
69    switch (mType) {
70    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;
90
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
110    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;
167
168    case RS_TYPE_BOOLEAN:
169        mTypeBits = 8;
170        break;
171    default:
172        rsAssert(mType != RS_TYPE_INVALID);
173        break;
174    }
175
176    mBitsUnpadded = mTypeBits * mVectorSize;
177    mBits = mTypeBits * rsHigherPow2(mVectorSize);
178}
179
180bool Component::isReference() const {
181    return (mType >= RS_TYPE_ELEMENT);
182}
183
184static const char * gTypeBasicStrings[] = {
185    "NONE",
186    "F16",
187    "F32",
188    "F64",
189    "S8",
190    "S16",
191    "S32",
192    "S64",
193    "U8",
194    "U16",
195    "U32",
196    "U64",
197    "BOOLEAN",
198    "UP_565",
199    "UP_5551",
200    "UP_4444",
201    "MATRIX_4X4",
202    "MATRIX_3X3",
203    "MATRIX_2X2",
204};
205
206static const char * gTypeObjStrings[] = {
207    "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
234void Component::dumpLOGV(const char *prefix) const {
235    if (mType >= RS_TYPE_ELEMENT) {
236        ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
237             prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
238    } else {
239        ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
240             prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
241    }
242}
243
244void Component::serialize(OStream *stream) const {
245    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
251void Component::loadFromStream(IStream *stream) {
252    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
263
264