rsType.h revision 50bfc354e61e174a465893fd0dafe913f1954478
1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/*
2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Copyright (C) 2011 The Android Open Source Project
3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * you may not use this file except in compliance with the License.
6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * You may obtain a copy of the License at
7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * See the License for the specific language governing permissions and
14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * limitations under the License.
15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */
16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#ifndef ANDROID_STRUCTURED_TYPE_H
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define ANDROID_STRUCTURED_TYPE_H
19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
207b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "rsElement.h"
217b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
227b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala// ---------------------------------------------------------------------------
23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace renderscript {
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass Type : public ObjectBase {
28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    struct Hal {
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mutable void *drv;
31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        struct State {
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const Element * element;
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // Size of the structure in the various dimensions.  A missing Dimension is
36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // specified as a 0 and not a 1.
37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uint32_t dimX;
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uint32_t dimY;
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            uint32_t dimZ;
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            bool dimLOD;
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            bool faces;
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        };
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        State state;
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    };
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Hal mHal;
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Type * createTex2D(const Element *, size_t w, size_t h, bool mip);
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    size_t getOffsetForFace(uint32_t face) const;
50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
51e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    size_t getSizeBytes() const {return mTotalSizeBytes;}
52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const Element * getElement() const {return mElement.get();}
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getDimX() const {return mHal.state.dimX;}
56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getDimY() const {return mHal.state.dimY;}
57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getDimZ() const {return mHal.state.dimZ;}
587b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    uint32_t getDimLOD() const {return mHal.state.dimLOD;}
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    bool getDimFaces() const {return mHal.state.faces;}
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;}
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;}
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;}
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t getLODOffset(uint32_t lod) const {
6690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        rsAssert(lod < mLODCount); return mLODs[lod].mOffset;
67cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    }
68cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    uint32_t getLODOffset(uint32_t lod, uint32_t x) const;
69cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const;
7090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const;
7190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
72cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face,
73cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                              uint32_t x, uint32_t y) const;
74cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
75cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    uint32_t getLODCount() const {return mLODCount;}
76cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    bool getIsNp2() const;
77cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    void clear();
79b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    void compute();
80b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
81b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    void dumpLOGV(const char *prefix) const;
82b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    virtual void serialize(OStream *stream) const;
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static Type *createFromStream(Context *rsc, IStream *stream);
85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const;
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const;
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e,
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          uint32_t dimX, uint32_t dimY, uint32_t dimZ,
91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          bool dimLOD, bool dimFaces);
92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    static Type* getType(Context *rsc, const Element *e,
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                         uint32_t dimX, uint32_t dimY, uint32_t dimZ,
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                         bool dimLOD, bool dimFaces) {
96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        type->incUserRef();
98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return type.get();
99099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    }
100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
1012ab500c632569e2f131a1a2288459933da70c4eeZhijun Heprotected:
1022ab500c632569e2f131a1a2288459933da70c4eeZhijun He    struct LOD {
103abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        size_t mX;
104abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        size_t mY;
105cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        size_t mZ;
106cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        size_t mOffset;
107abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    };
108e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
109e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    void makeLODTable();
110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Internal structure from most to least significant.
112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // * Array dimensions
113e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // * Faces
114e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // * Mipmaps
115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // * xyz
116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
117e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ObjectBaseRef<const Element> mElement;
118e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
119e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // count of mipmap levels, 0 indicates no mipmapping
120e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
121e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    size_t mMipChainSizeBytes;
122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    size_t mTotalSizeBytes;
123e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    LOD *mLODs;
124e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t mLODCount;
125e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
126e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprotected:
127f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void preDestroy() const;
128f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual ~Type();
129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalaprivate:
131cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    Type(Context *);
132cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    Type(const Type &);
133cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei};
134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
136e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass TypeState {
137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    TypeState();
139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ~TypeState();
140cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Cache of all existing types.
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Vector<Type *> mTypes;
143f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin};
144f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
145f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#endif //ANDROID_STRUCTURED_TYPE
149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin