Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2011 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 #ifndef ANDROID_STRUCTURED_TYPE_H
     18 #define ANDROID_STRUCTURED_TYPE_H
     19 
     20 #include "rsElement.h"
     21 
     22 // ---------------------------------------------------------------------------
     23 namespace android {
     24 namespace renderscript {
     25 
     26 
     27 class Type : public ObjectBase {
     28 public:
     29     Type * createTex2D(const Element *, size_t w, size_t h, bool mip);
     30 
     31     size_t getOffsetForFace(uint32_t face) const;
     32 
     33     size_t getSizeBytes() const {return mTotalSizeBytes;}
     34     size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
     35     const Element * getElement() const {return mElement.get();}
     36 
     37     uint32_t getDimX() const {return mDimX;}
     38     uint32_t getDimY() const {return mDimY;}
     39     uint32_t getDimZ() const {return mDimZ;}
     40     uint32_t getDimLOD() const {return mDimLOD;}
     41     bool getDimFaces() const {return mFaces;}
     42 
     43     uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;}
     44     uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;}
     45     uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;}
     46 
     47     uint32_t getLODOffset(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mOffset;}
     48     uint32_t getLODOffset(uint32_t lod, uint32_t x) const;
     49     uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const;
     50     uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const;
     51 
     52     uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const;
     53 
     54     uint32_t getLODCount() const {return mLODCount;}
     55     bool getIsNp2() const;
     56 
     57     void clear();
     58     void compute();
     59 
     60     void dumpLOGV(const char *prefix) const;
     61     virtual void serialize(OStream *stream) const;
     62     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
     63     static Type *createFromStream(Context *rsc, IStream *stream);
     64 
     65     ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const;
     66     ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const;
     67 
     68     static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e,
     69                                           uint32_t dimX, uint32_t dimY, uint32_t dimZ,
     70                                           bool dimLOD, bool dimFaces);
     71 
     72     static Type* getType(Context *rsc, const Element *e,
     73                          uint32_t dimX, uint32_t dimY, uint32_t dimZ,
     74                          bool dimLOD, bool dimFaces) {
     75         ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
     76         type->incUserRef();
     77         return type.get();
     78     }
     79 
     80 protected:
     81     struct LOD {
     82         size_t mX;
     83         size_t mY;
     84         size_t mZ;
     85         size_t mOffset;
     86     };
     87 
     88     void makeLODTable();
     89 
     90     // Internal structure from most to least significant.
     91     // * Array dimensions
     92     // * Faces
     93     // * Mipmaps
     94     // * xyz
     95 
     96     ObjectBaseRef<const Element> mElement;
     97 
     98     // Size of the structure in the various dimensions.  A missing Dimension is
     99     // specified as a 0 and not a 1.
    100     size_t mDimX;
    101     size_t mDimY;
    102     size_t mDimZ;
    103     bool mDimLOD;
    104     bool mFaces;
    105 
    106     // count of mipmap levels, 0 indicates no mipmapping
    107 
    108     size_t mMipChainSizeBytes;
    109     size_t mTotalSizeBytes;
    110     LOD *mLODs;
    111     uint32_t mLODCount;
    112 
    113 protected:
    114     virtual void preDestroy() const;
    115     virtual ~Type();
    116 
    117 private:
    118     Type(Context *);
    119     Type(const Type &);
    120 };
    121 
    122 
    123 class TypeState {
    124 public:
    125     TypeState();
    126     ~TypeState();
    127 
    128     // Cache of all existing types.
    129     Vector<Type *> mTypes;
    130 };
    131 
    132 
    133 }
    134 }
    135 #endif //ANDROID_STRUCTURED_TYPE
    136