1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License.
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License.
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#ifndef ANDROID_STRUCTURED_TYPE_H
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#define ANDROID_STRUCTURED_TYPE_H
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsElement.h"
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// ---------------------------------------------------------------------------
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
261bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
27ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass Type : public ObjectBase {
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Type * createTex2D(const Element *, size_t w, size_t h, bool mip);
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t getOffsetForFace(uint32_t face) const;
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t getSizeBytes() const {return mTotalSizeBytes;}
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    const Element * getElement() const {return mElement.get();}
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getDimX() const {return mDimX;}
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getDimY() const {return mDimY;}
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getDimZ() const {return mDimZ;}
40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getDimLOD() const {return mDimLOD;}
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool getDimFaces() const {return mFaces;}
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;}
44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;}
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;}
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
47ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams    uint32_t getLODOffset(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mOffset;}
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODOffset(uint32_t lod, uint32_t x) const;
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const;
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const;
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
52ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams    uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const;
53ef70a20a3000bd9aab0807fa1da8ca89bf648500Jason Sams
54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t getLODCount() const {return mLODCount;}
552978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    bool getIsNp2() const;
56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void clear();
58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void compute();
59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
603c0dfbab807a459622aeade4940daddf482dec66Jason Sams    void dumpLOGV(const char *prefix) const;
61aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    virtual void serialize(OStream *stream) const;
62aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
63aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    static Type *createFromStream(Context *rsc, IStream *stream);
64d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
65117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const;
66117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const;
67b89aaacb2ca9d062e0a17a32e3d4dbf3f6948a17Alex Sakhartchouk
68117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e,
69117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk                                          uint32_t dimX, uint32_t dimY, uint32_t dimZ,
70117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk                                          bool dimLOD, bool dimFaces);
715edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
72117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    static Type* getType(Context *rsc, const Element *e,
73117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk                         uint32_t dimX, uint32_t dimY, uint32_t dimZ,
74117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk                         bool dimLOD, bool dimFaces) {
75117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk        ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
76117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk        type->incUserRef();
77117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk        return type.get();
78117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    }
7931a7e42f4baa059352f0db119de38428e655eab2Jason Sams
80d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprotected:
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    struct LOD {
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        size_t mX;
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        size_t mY;
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        size_t mZ;
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        size_t mOffset;
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    };
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    void makeLODTable();
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // Internal structure from most to least significant.
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // * Array dimensions
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // * Faces
93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // * Mipmaps
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // * xyz
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ObjectBaseRef<const Element> mElement;
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // Size of the structure in the various dimensions.  A missing Dimension is
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // specified as a 0 and not a 1.
100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t mDimX;
101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t mDimY;
102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t mDimZ;
103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mDimLOD;
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    bool mFaces;
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // count of mipmap levels, 0 indicates no mipmapping
107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t mMipChainSizeBytes;
109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t mTotalSizeBytes;
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    LOD *mLODs;
111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t mLODCount;
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
113b38d534873ca514f5a5230596c838aa37eca1568Jason Samsprotected:
114117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk    virtual void preDestroy() const;
11531a7e42f4baa059352f0db119de38428e655eab2Jason Sams    virtual ~Type();
116b38d534873ca514f5a5230596c838aa37eca1568Jason Sams
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsprivate:
11831a7e42f4baa059352f0db119de38428e655eab2Jason Sams    Type(Context *);
119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Type(const Type &);
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsclass TypeState {
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic:
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState();
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    ~TypeState();
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
128e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    // Cache of all existing types.
129e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    Vector<Type *> mTypes;
130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams};
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif //ANDROID_STRUCTURED_TYPE
136