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