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