• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
getSizeBytes()33     size_t getSizeBytes() const {return mTotalSizeBytes;}
getElementSizeBytes()34     size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
getElement()35     const Element * getElement() const {return mElement.get();}
36 
getDimX()37     uint32_t getDimX() const {return mDimX;}
getDimY()38     uint32_t getDimY() const {return mDimY;}
getDimZ()39     uint32_t getDimZ() const {return mDimZ;}
getDimLOD()40     uint32_t getDimLOD() const {return mDimLOD;}
getDimFaces()41     bool getDimFaces() const {return mFaces;}
42 
getLODDimX(uint32_t lod)43     uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;}
getLODDimY(uint32_t lod)44     uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;}
getLODDimZ(uint32_t lod)45     uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;}
46 
getLODOffset(uint32_t lod)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 
getLODCount()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;
getClassId()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 
getType(Context * rsc,const Element * e,uint32_t dimX,uint32_t dimY,uint32_t dimZ,bool dimLOD,bool dimFaces)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