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