rsComponent.cpp revision 77d9f4bd05b2d2a161f30c12a2248f9c97eaac42
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 19#ifndef ANDROID_RS_SERIALIZE 20#include <GLES/gl.h> 21#endif 22 23using namespace android; 24using namespace android::renderscript; 25 26Component::Component() { 27 set(RS_TYPE_NONE, RS_KIND_USER, false, 1); 28} 29 30Component::~Component() { 31} 32 33void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) { 34 mType = dt; 35 mKind = dk; 36 mNormalized = norm; 37 mVectorSize = vecSize; 38 rsAssert(vecSize <= 4); 39 40 mBits = 0; 41 mTypeBits = 0; 42 mIsFloat = false; 43 mIsSigned = false; 44 mIsPixel = false; 45 46 switch (mKind) { 47 case RS_KIND_PIXEL_L: 48 case RS_KIND_PIXEL_A: 49 mIsPixel = true; 50 rsAssert(mVectorSize == 1); 51 rsAssert(mNormalized == true); 52 break; 53 case RS_KIND_PIXEL_LA: 54 mIsPixel = true; 55 rsAssert(mVectorSize == 2); 56 rsAssert(mNormalized == true); 57 break; 58 case RS_KIND_PIXEL_RGB: 59 mIsPixel = true; 60 rsAssert(mVectorSize == 3); 61 rsAssert(mNormalized == true); 62 break; 63 case RS_KIND_PIXEL_RGBA: 64 mIsPixel = true; 65 rsAssert(mVectorSize == 4); 66 rsAssert(mNormalized == true); 67 break; 68 default: 69 break; 70 } 71 72 switch (mType) { 73 case RS_TYPE_NONE: 74 return; 75 case RS_TYPE_UNSIGNED_5_6_5: 76 mVectorSize = 3; 77 mBits = 16; 78 mNormalized = true; 79 rsAssert(mKind == RS_KIND_PIXEL_RGB); 80 return; 81 case RS_TYPE_UNSIGNED_5_5_5_1: 82 mVectorSize = 4; 83 mBits = 16; 84 mNormalized = true; 85 rsAssert(mKind == RS_KIND_PIXEL_RGBA); 86 return; 87 case RS_TYPE_UNSIGNED_4_4_4_4: 88 mVectorSize = 4; 89 mBits = 16; 90 mNormalized = true; 91 rsAssert(mKind == RS_KIND_PIXEL_RGBA); 92 return; 93 94 case RS_TYPE_MATRIX_4X4: 95 mTypeBits = 16 * 32; 96 rsAssert(mVectorSize == 1); 97 rsAssert(mNormalized == false); 98 rsAssert(mKind == RS_KIND_USER); 99 break; 100 case RS_TYPE_MATRIX_3X3: 101 mTypeBits = 9 * 32; 102 rsAssert(mVectorSize == 1); 103 rsAssert(mNormalized == false); 104 rsAssert(mKind == RS_KIND_USER); 105 break; 106 case RS_TYPE_MATRIX_2X2: 107 mTypeBits = 4 * 32; 108 rsAssert(mVectorSize == 1); 109 rsAssert(mNormalized == false); 110 rsAssert(mKind == RS_KIND_USER); 111 break; 112 113 case RS_TYPE_ELEMENT: 114 case RS_TYPE_TYPE: 115 case RS_TYPE_ALLOCATION: 116 case RS_TYPE_SAMPLER: 117 case RS_TYPE_SCRIPT: 118 case RS_TYPE_MESH: 119 case RS_TYPE_PROGRAM_FRAGMENT: 120 case RS_TYPE_PROGRAM_VERTEX: 121 case RS_TYPE_PROGRAM_RASTER: 122 case RS_TYPE_PROGRAM_STORE: 123 rsAssert(mVectorSize == 1); 124 rsAssert(mNormalized == false); 125 rsAssert(mKind == RS_KIND_USER); 126 mBits = 32; 127 mTypeBits = 32; 128 return; 129 130 case RS_TYPE_FLOAT_16: 131 mTypeBits = 16; 132 mIsFloat = true; 133 break; 134 case RS_TYPE_FLOAT_32: 135 mTypeBits = 32; 136 mIsFloat = true; 137 break; 138 case RS_TYPE_FLOAT_64: 139 mTypeBits = 64; 140 mIsFloat = true; 141 break; 142 case RS_TYPE_SIGNED_8: 143 mTypeBits = 8; 144 mIsSigned = true; 145 break; 146 case RS_TYPE_SIGNED_16: 147 mTypeBits = 16; 148 mIsSigned = true; 149 break; 150 case RS_TYPE_SIGNED_32: 151 mTypeBits = 32; 152 mIsSigned = true; 153 break; 154 case RS_TYPE_SIGNED_64: 155 mTypeBits = 64; 156 mIsSigned = true; 157 break; 158 case RS_TYPE_UNSIGNED_8: 159 mTypeBits = 8; 160 break; 161 case RS_TYPE_UNSIGNED_16: 162 mTypeBits = 16; 163 break; 164 case RS_TYPE_UNSIGNED_32: 165 mTypeBits = 32; 166 break; 167 case RS_TYPE_UNSIGNED_64: 168 mTypeBits = 64; 169 break; 170 171 case RS_TYPE_BOOLEAN: 172 mTypeBits = 8; 173 break; 174 } 175 176 mBits = mTypeBits * mVectorSize; 177} 178 179bool Component::isReference() const { 180 return (mType >= RS_TYPE_ELEMENT); 181} 182 183uint32_t Component::getGLType() const { 184#ifndef ANDROID_RS_SERIALIZE 185 switch (mType) { 186 case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5; 187 case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1; 188 case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4; 189 190 //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT; 191 case RS_TYPE_FLOAT_32: return GL_FLOAT; 192 case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE; 193 case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT; 194 case RS_TYPE_SIGNED_8: return GL_BYTE; 195 case RS_TYPE_SIGNED_16: return GL_SHORT; 196 default: break; 197 } 198#endif //ANDROID_RS_SERIALIZE 199 return 0; 200} 201 202uint32_t Component::getGLFormat() const { 203#ifndef ANDROID_RS_SERIALIZE 204 switch (mKind) { 205 case RS_KIND_PIXEL_L: return GL_LUMINANCE; 206 case RS_KIND_PIXEL_A: return GL_ALPHA; 207 case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA; 208 case RS_KIND_PIXEL_RGB: return GL_RGB; 209 case RS_KIND_PIXEL_RGBA: return GL_RGBA; 210 default: break; 211 } 212#endif //ANDROID_RS_SERIALIZE 213 return 0; 214} 215 216String8 Component::getGLSLType() const { 217 if (mType == RS_TYPE_SIGNED_32) { 218 switch (mVectorSize) { 219 case 1: return String8("int"); 220 case 2: return String8("ivec2"); 221 case 3: return String8("ivec3"); 222 case 4: return String8("ivec4"); 223 } 224 } 225 if (mType == RS_TYPE_FLOAT_32) { 226 switch (mVectorSize) { 227 case 1: return String8("float"); 228 case 2: return String8("vec2"); 229 case 3: return String8("vec3"); 230 case 4: return String8("vec4"); 231 } 232 } 233 if ((mType == RS_TYPE_MATRIX_4X4) && (mVectorSize == 1)) { 234 return String8("mat4"); 235 } 236 if ((mType == RS_TYPE_MATRIX_3X3) && (mVectorSize == 1)) { 237 return String8("mat3"); 238 } 239 if ((mType == RS_TYPE_MATRIX_2X2) && (mVectorSize == 1)) { 240 return String8("mat2"); 241 } 242 return String8(); 243} 244 245static const char * gTypeBasicStrings[] = { 246 "NONE", 247 "F16", 248 "F32", 249 "F64", 250 "S8", 251 "S16", 252 "S32", 253 "S64", 254 "U8", 255 "U16", 256 "U32", 257 "U64", 258 "BOOLEAN", 259 "UP_565", 260 "UP_5551", 261 "UP_4444", 262 "MATRIX_4X4", 263 "MATRIX_3X3", 264 "MATRIX_2X2", 265}; 266 267static const char * gTypeObjStrings[] = { 268 "ELEMENT", 269 "TYPE", 270 "ALLOCATION", 271 "SAMPLER", 272 "SCRIPT", 273 "MESH", 274 "PROGRAM_FRAGMENT", 275 "PROGRAM_VERTEX", 276 "PROGRAM_RASTER", 277 "PROGRAM_STORE", 278}; 279 280static const char * gKindStrings[] = { 281 "USER", 282 "COLOR", 283 "POSITION", 284 "TEXTURE", 285 "NORMAL", 286 "INDEX", 287 "POINT_SIZE", 288 "PIXEL_L", 289 "PIXEL_A", 290 "PIXEL_LA", 291 "PIXEL_RGB", 292 "PIXEL_RGBA", 293}; 294 295void Component::dumpLOGV(const char *prefix) const { 296 if (mType >= RS_TYPE_ELEMENT) { 297 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i", 298 prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits); 299 } else { 300 LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i", 301 prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits); 302 } 303} 304 305void Component::serialize(OStream *stream) const { 306 stream->addU8((uint8_t)mType); 307 stream->addU8((uint8_t)mKind); 308 stream->addU8((uint8_t)(mNormalized ? 1 : 0)); 309 stream->addU32(mVectorSize); 310} 311 312void Component::loadFromStream(IStream *stream) { 313 mType = (RsDataType)stream->loadU8(); 314 mKind = (RsDataKind)stream->loadU8(); 315 uint8_t temp = stream->loadU8(); 316 mNormalized = temp != 0; 317 mVectorSize = stream->loadU32(); 318 319 set(mType, mKind, mNormalized, mVectorSize); 320} 321 322 323 324 325