10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2011 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_STRUCTURED_TYPE_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_STRUCTURED_TYPE_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsElement.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*****************************************************************************
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * CAUTION
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Any layout changes for this class may require a corresponding change to be
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * a partial copy of the information below.
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *****************************************************************************/
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Type : public ObjectBase {
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct Hal {
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mutable void *drv;
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        struct State {
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const Element * element;
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // Size of the structure in the various dimensions.  A missing Dimension is
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // specified as a 0 and not a 1.
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimX;
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimY;
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimZ;
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t *lodDimX;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t *lodDimY;
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t *lodDimZ;
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t *lodOffset;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t lodCount;
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            bool faces;
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        };
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        State state;
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    };
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Hal mHal;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Type * createTex2D(const Element *, size_t w, size_t h, bool mip);
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t getOffsetForFace(uint32_t face) const;
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t getSizeBytes() const {return mTotalSizeBytes;}
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const Element * getElement() const {return mElement.get();}
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getDimX() const {return mHal.state.dimX;}
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getDimY() const {return mHal.state.dimY;}
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getDimZ() const {return mHal.state.dimZ;}
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getDimLOD() const {return mDimLOD;}
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getDimFaces() const {return mHal.state.faces;}
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODDimX(uint32_t lod) const {
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        rsAssert(lod < mHal.state.lodCount);
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mHal.state.lodDimX[lod];
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODDimY(uint32_t lod) const {
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        rsAssert(lod < mHal.state.lodCount);
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mHal.state.lodDimY[lod];
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODDimZ(uint32_t lod) const {
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        rsAssert(lod < mHal.state.lodCount);
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mHal.state.lodDimZ[lod];
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODOffset(uint32_t lod) const {
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        rsAssert(lod < mHal.state.lodCount);
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mHal.state.lodOffset[lod];
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODOffset(uint32_t lod, uint32_t x) const;
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const;
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const;
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face,
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              uint32_t x, uint32_t y) const;
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getLODCount() const {return mHal.state.lodCount;}
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getIsNp2() const;
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void clear();
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void compute();
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void dumpLOGV(const char *prefix) const;
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void serialize(Context *rsc, OStream *stream) const;
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Type *createFromStream(Context *rsc, IStream *stream);
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const;
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const;
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e,
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          uint32_t dimX, uint32_t dimY, uint32_t dimZ,
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                          bool dimLOD, bool dimFaces);
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Type* getType(Context *rsc, const Element *e,
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                         uint32_t dimX, uint32_t dimY, uint32_t dimZ,
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                         bool dimLOD, bool dimFaces) {
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        type->incUserRef();
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return type.get();
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void makeLODTable();
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool mDimLOD;
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Internal structure from most to least significant.
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // * Array dimensions
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // * Faces
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // * Mipmaps
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // * xyz
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<const Element> mElement;
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // count of mipmap levels, 0 indicates no mipmapping
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t mMipChainSizeBytes;
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t mTotalSizeBytes;
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void preDestroy() const;
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual ~Type();
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprivate:
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Type(Context *);
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Type(const Type &);
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass TypeState {
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    TypeState();
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ~TypeState();
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Cache of all existing types.
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Vector<Type *> mTypes;
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif //ANDROID_STRUCTURED_TYPE
163