Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2013 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 namespace android {
     20 namespace renderscript {
     21 
     22 Component::Component() {
     23     set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
     24 }
     25 
     26 Component::~Component() {
     27 }
     28 
     29 void 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     case RS_KIND_PIXEL_YUV:
     65         mIsPixel = true;
     66         rsAssert(mVectorSize == 1);
     67         rsAssert(mNormalized == true);
     68         break;
     69 
     70     default:
     71         rsAssert(mKind != RS_KIND_INVALID);
     72         break;
     73     }
     74 
     75     switch (mType) {
     76     case RS_TYPE_NONE:
     77         return;
     78     case RS_TYPE_UNSIGNED_5_6_5:
     79         mVectorSize = 3;
     80         mBits = 16;
     81         mNormalized = true;
     82         rsAssert(mKind == RS_KIND_PIXEL_RGB);
     83         return;
     84     case RS_TYPE_UNSIGNED_5_5_5_1:
     85         mVectorSize = 4;
     86         mBits = 16;
     87         mNormalized = true;
     88         rsAssert(mKind == RS_KIND_PIXEL_RGBA);
     89         return;
     90     case RS_TYPE_UNSIGNED_4_4_4_4:
     91         mVectorSize = 4;
     92         mBits = 16;
     93         mNormalized = true;
     94         rsAssert(mKind == RS_KIND_PIXEL_RGBA);
     95         return;
     96 
     97     case RS_TYPE_MATRIX_4X4:
     98         mTypeBits = 16 * 32;
     99         rsAssert(mVectorSize == 1);
    100         rsAssert(mNormalized == false);
    101         rsAssert(mKind == RS_KIND_USER);
    102         break;
    103     case RS_TYPE_MATRIX_3X3:
    104         mTypeBits = 9 * 32;
    105         rsAssert(mVectorSize == 1);
    106         rsAssert(mNormalized == false);
    107         rsAssert(mKind == RS_KIND_USER);
    108         break;
    109     case RS_TYPE_MATRIX_2X2:
    110         mTypeBits = 4 * 32;
    111         rsAssert(mVectorSize == 1);
    112         rsAssert(mNormalized == false);
    113         rsAssert(mKind == RS_KIND_USER);
    114         break;
    115 
    116     case RS_TYPE_ELEMENT:
    117     case RS_TYPE_TYPE:
    118     case RS_TYPE_ALLOCATION:
    119     case RS_TYPE_SAMPLER:
    120     case RS_TYPE_SCRIPT:
    121     case RS_TYPE_MESH:
    122     case RS_TYPE_PROGRAM_FRAGMENT:
    123     case RS_TYPE_PROGRAM_VERTEX:
    124     case RS_TYPE_PROGRAM_RASTER:
    125     case RS_TYPE_PROGRAM_STORE:
    126     case RS_TYPE_FONT:
    127         rsAssert(mVectorSize == 1);
    128         rsAssert(mNormalized == false);
    129         rsAssert(mKind == RS_KIND_USER);
    130 #ifdef __LP64__
    131         // Large object pointers on 64-bit targets.
    132         mBits = 256;
    133         mTypeBits = 256;
    134 #else
    135         // Single pointer objects on 32-bit targets.
    136         mBits = 32;
    137         mTypeBits = 32;
    138 #endif  // __LP64__
    139         return;
    140 
    141     case RS_TYPE_FLOAT_16:
    142         mTypeBits = 16;
    143         mIsFloat = true;
    144         break;
    145     case RS_TYPE_FLOAT_32:
    146         mTypeBits = 32;
    147         mIsFloat = true;
    148         break;
    149     case RS_TYPE_FLOAT_64:
    150         mTypeBits = 64;
    151         mIsFloat = true;
    152         break;
    153     case RS_TYPE_SIGNED_8:
    154         mTypeBits = 8;
    155         mIsSigned = true;
    156         break;
    157     case RS_TYPE_SIGNED_16:
    158         mTypeBits = 16;
    159         mIsSigned = true;
    160         break;
    161     case RS_TYPE_SIGNED_32:
    162         mTypeBits = 32;
    163         mIsSigned = true;
    164         break;
    165     case RS_TYPE_SIGNED_64:
    166         mTypeBits = 64;
    167         mIsSigned = true;
    168         break;
    169     case RS_TYPE_UNSIGNED_8:
    170         mTypeBits = 8;
    171         break;
    172     case RS_TYPE_UNSIGNED_16:
    173         mTypeBits = 16;
    174         break;
    175     case RS_TYPE_UNSIGNED_32:
    176         mTypeBits = 32;
    177         break;
    178     case RS_TYPE_UNSIGNED_64:
    179         mTypeBits = 64;
    180         break;
    181 
    182     case RS_TYPE_BOOLEAN:
    183         mTypeBits = 8;
    184         break;
    185     default:
    186         rsAssert(mType != RS_TYPE_INVALID);
    187         rsAssert(0);
    188         break;
    189     }
    190 
    191     mBitsUnpadded = mTypeBits * mVectorSize;
    192     mBits = mTypeBits * rsHigherPow2(mVectorSize);
    193 }
    194 
    195 bool Component::isReference() const {
    196     return (mType >= RS_TYPE_ELEMENT);
    197 }
    198 
    199 static const char * gTypeBasicStrings[] = {
    200     "NONE",
    201     "F16",
    202     "F32",
    203     "F64",
    204     "S8",
    205     "S16",
    206     "S32",
    207     "S64",
    208     "U8",
    209     "U16",
    210     "U32",
    211     "U64",
    212     "BOOLEAN",
    213     "UP_565",
    214     "UP_5551",
    215     "UP_4444",
    216     "MATRIX_4X4",
    217     "MATRIX_3X3",
    218     "MATRIX_2X2",
    219 };
    220 
    221 static const char * gTypeObjStrings[] = {
    222     "ELEMENT",
    223     "TYPE",
    224     "ALLOCATION",
    225     "SAMPLER",
    226     "SCRIPT",
    227     "MESH",
    228     "PROGRAM_FRAGMENT",
    229     "PROGRAM_VERTEX",
    230     "PROGRAM_RASTER",
    231     "PROGRAM_STORE",
    232 };
    233 
    234 static const char * gKindStrings[] = {
    235     "USER",
    236     "COLOR",
    237     "POSITION",
    238     "TEXTURE",
    239     "NORMAL",
    240     "INDEX",
    241     "POINT_SIZE",
    242     "PIXEL_L",
    243     "PIXEL_A",
    244     "PIXEL_LA",
    245     "PIXEL_RGB",
    246     "PIXEL_RGBA",
    247 };
    248 
    249 void Component::dumpLOGV(const char *prefix) const {
    250     if (mType >= RS_TYPE_ELEMENT) {
    251         ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
    252              prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
    253     } else {
    254         ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
    255              prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
    256     }
    257 }
    258 
    259 void Component::serialize(OStream *stream) const {
    260     stream->addU8((uint8_t)mType);
    261     stream->addU8((uint8_t)mKind);
    262     stream->addU8((uint8_t)(mNormalized ? 1 : 0));
    263     stream->addU32(mVectorSize);
    264 }
    265 
    266 void Component::loadFromStream(IStream *stream) {
    267     mType = (RsDataType)stream->loadU8();
    268     mKind = (RsDataKind)stream->loadU8();
    269     uint8_t temp = stream->loadU8();
    270     mNormalized = temp != 0;
    271     mVectorSize = stream->loadU32();
    272 
    273     set(mType, mKind, mNormalized, mVectorSize);
    274 }
    275 
    276 } // namespace renderscript
    277 } // namespace android
    278