1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_STRUCTURED_ELEMENT_H 18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_STRUCTURED_ELEMENT_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include "rsComponent.h" 21*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h" 22*e1eccf28SAndroid Build Coastguard Worker #include "rsInternalDefines.h" 23*e1eccf28SAndroid Build Coastguard Worker #include "rsObjectBase.h" 24*e1eccf28SAndroid Build Coastguard Worker 25*e1eccf28SAndroid Build Coastguard Worker #include <vector> 26*e1eccf28SAndroid Build Coastguard Worker 27*e1eccf28SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 28*e1eccf28SAndroid Build Coastguard Worker namespace android { 29*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 30*e1eccf28SAndroid Build Coastguard Worker /***************************************************************************** 31*e1eccf28SAndroid Build Coastguard Worker * CAUTION 32*e1eccf28SAndroid Build Coastguard Worker * 33*e1eccf28SAndroid Build Coastguard Worker * Any layout changes for this class may require a corresponding change to be 34*e1eccf28SAndroid Build Coastguard Worker * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains 35*e1eccf28SAndroid Build Coastguard Worker * a partial copy of the information below. 36*e1eccf28SAndroid Build Coastguard Worker * 37*e1eccf28SAndroid Build Coastguard Worker *****************************************************************************/ 38*e1eccf28SAndroid Build Coastguard Worker // An element is a group of Components that occupies one cell in a structure. 39*e1eccf28SAndroid Build Coastguard Worker class Element : public ObjectBase { 40*e1eccf28SAndroid Build Coastguard Worker public: 41*e1eccf28SAndroid Build Coastguard Worker struct Hal { 42*e1eccf28SAndroid Build Coastguard Worker mutable void *drv; 43*e1eccf28SAndroid Build Coastguard Worker 44*e1eccf28SAndroid Build Coastguard Worker struct State { 45*e1eccf28SAndroid Build Coastguard Worker RsDataType dataType; 46*e1eccf28SAndroid Build Coastguard Worker RsDataKind dataKind; 47*e1eccf28SAndroid Build Coastguard Worker uint32_t vectorSize; 48*e1eccf28SAndroid Build Coastguard Worker uint32_t elementSizeBytes; 49*e1eccf28SAndroid Build Coastguard Worker 50*e1eccf28SAndroid Build Coastguard Worker // Subelements 51*e1eccf28SAndroid Build Coastguard Worker const Element **fields; 52*e1eccf28SAndroid Build Coastguard Worker uint32_t *fieldArraySizes; 53*e1eccf28SAndroid Build Coastguard Worker const char **fieldNames; 54*e1eccf28SAndroid Build Coastguard Worker uint32_t *fieldNameLengths; 55*e1eccf28SAndroid Build Coastguard Worker uint32_t *fieldOffsetBytes; 56*e1eccf28SAndroid Build Coastguard Worker uint32_t fieldsCount; 57*e1eccf28SAndroid Build Coastguard Worker }; 58*e1eccf28SAndroid Build Coastguard Worker State state; 59*e1eccf28SAndroid Build Coastguard Worker }; 60*e1eccf28SAndroid Build Coastguard Worker Hal mHal; 61*e1eccf28SAndroid Build Coastguard Worker 62*e1eccf28SAndroid Build Coastguard Worker void operator delete(void* ptr); 63*e1eccf28SAndroid Build Coastguard Worker 64*e1eccf28SAndroid Build Coastguard Worker uint32_t getGLType() const; 65*e1eccf28SAndroid Build Coastguard Worker uint32_t getGLFormat() const; 66*e1eccf28SAndroid Build Coastguard Worker 67*e1eccf28SAndroid Build Coastguard Worker size_t getSizeBitsUnpadded() const; getSizeBytesUnpadded()68*e1eccf28SAndroid Build Coastguard Worker size_t getSizeBytesUnpadded() const { 69*e1eccf28SAndroid Build Coastguard Worker return (getSizeBitsUnpadded() + 7) >> 3; 70*e1eccf28SAndroid Build Coastguard Worker } 71*e1eccf28SAndroid Build Coastguard Worker 72*e1eccf28SAndroid Build Coastguard Worker size_t getSizeBits() const; getSizeBytes()73*e1eccf28SAndroid Build Coastguard Worker size_t getSizeBytes() const { 74*e1eccf28SAndroid Build Coastguard Worker return (getSizeBits() + 7) >> 3; 75*e1eccf28SAndroid Build Coastguard Worker } 76*e1eccf28SAndroid Build Coastguard Worker getFieldOffsetBits(uint32_t componentNumber)77*e1eccf28SAndroid Build Coastguard Worker size_t getFieldOffsetBits(uint32_t componentNumber) const { 78*e1eccf28SAndroid Build Coastguard Worker return mFields[componentNumber].offsetBits; 79*e1eccf28SAndroid Build Coastguard Worker } getFieldOffsetBytes(uint32_t componentNumber)80*e1eccf28SAndroid Build Coastguard Worker size_t getFieldOffsetBytes(uint32_t componentNumber) const { 81*e1eccf28SAndroid Build Coastguard Worker return mFields[componentNumber].offsetBits >> 3; 82*e1eccf28SAndroid Build Coastguard Worker } 83*e1eccf28SAndroid Build Coastguard Worker getFieldOffsetBytesUnpadded(uint32_t componentNumber)84*e1eccf28SAndroid Build Coastguard Worker size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { 85*e1eccf28SAndroid Build Coastguard Worker return mFields[componentNumber].offsetBitsUnpadded >> 3; 86*e1eccf28SAndroid Build Coastguard Worker } 87*e1eccf28SAndroid Build Coastguard Worker getFieldCount()88*e1eccf28SAndroid Build Coastguard Worker uint32_t getFieldCount() const {return mFieldCount;} getField(uint32_t idx)89*e1eccf28SAndroid Build Coastguard Worker const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} getFieldName(uint32_t idx)90*e1eccf28SAndroid Build Coastguard Worker const char * getFieldName(uint32_t idx) const {return mFields[idx].name;} getFieldArraySize(uint32_t idx)91*e1eccf28SAndroid Build Coastguard Worker uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 92*e1eccf28SAndroid Build Coastguard Worker getComponent()93*e1eccf28SAndroid Build Coastguard Worker const Component & getComponent() const {return mComponent;} getType()94*e1eccf28SAndroid Build Coastguard Worker RsDataType getType() const {return mComponent.getType();} getKind()95*e1eccf28SAndroid Build Coastguard Worker RsDataKind getKind() const {return mComponent.getKind();} getBits()96*e1eccf28SAndroid Build Coastguard Worker uint32_t getBits() const {return mBits;} getBitsUnpadded()97*e1eccf28SAndroid Build Coastguard Worker uint32_t getBitsUnpadded() const {return mBitsUnpadded;} getVectorSize()98*e1eccf28SAndroid Build Coastguard Worker uint32_t getVectorSize() const {return mComponent.getVectorSize();} 99*e1eccf28SAndroid Build Coastguard Worker 100*e1eccf28SAndroid Build Coastguard Worker void dumpLOGV(const char *prefix) const; 101*e1eccf28SAndroid Build Coastguard Worker virtual void serialize(Context *rsc, OStream *stream) const; getClassId()102*e1eccf28SAndroid Build Coastguard Worker virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 103*e1eccf28SAndroid Build Coastguard Worker static Element *createFromStream(Context *rsc, IStream *stream); 104*e1eccf28SAndroid Build Coastguard Worker 105*e1eccf28SAndroid Build Coastguard Worker static ObjectBaseRef<const Element> createRef(Context *rsc, 106*e1eccf28SAndroid Build Coastguard Worker RsDataType dt, 107*e1eccf28SAndroid Build Coastguard Worker RsDataKind dk, 108*e1eccf28SAndroid Build Coastguard Worker bool isNorm, 109*e1eccf28SAndroid Build Coastguard Worker uint32_t vecSize); 110*e1eccf28SAndroid Build Coastguard Worker static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 111*e1eccf28SAndroid Build Coastguard Worker const Element **, 112*e1eccf28SAndroid Build Coastguard Worker const char **, 113*e1eccf28SAndroid Build Coastguard Worker const size_t * lengths, 114*e1eccf28SAndroid Build Coastguard Worker const uint32_t *asin); 115*e1eccf28SAndroid Build Coastguard Worker create(Context * rsc,RsDataType dt,RsDataKind dk,bool isNorm,uint32_t vecSize)116*e1eccf28SAndroid Build Coastguard Worker static const Element* create(Context *rsc, 117*e1eccf28SAndroid Build Coastguard Worker RsDataType dt, 118*e1eccf28SAndroid Build Coastguard Worker RsDataKind dk, 119*e1eccf28SAndroid Build Coastguard Worker bool isNorm, 120*e1eccf28SAndroid Build Coastguard Worker uint32_t vecSize) { 121*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 122*e1eccf28SAndroid Build Coastguard Worker elem->incUserRef(); 123*e1eccf28SAndroid Build Coastguard Worker return elem.get(); 124*e1eccf28SAndroid Build Coastguard Worker } 125*e1eccf28SAndroid Build Coastguard Worker static const Element* create(Context *rsc, size_t count, 126*e1eccf28SAndroid Build Coastguard Worker const Element **ein, 127*e1eccf28SAndroid Build Coastguard Worker const char **nin, 128*e1eccf28SAndroid Build Coastguard Worker const size_t * lengths = nullptr, 129*e1eccf28SAndroid Build Coastguard Worker const uint32_t *asin = nullptr) { 130*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 131*e1eccf28SAndroid Build Coastguard Worker elem->incUserRef(); 132*e1eccf28SAndroid Build Coastguard Worker return elem.get(); 133*e1eccf28SAndroid Build Coastguard Worker } 134*e1eccf28SAndroid Build Coastguard Worker 135*e1eccf28SAndroid Build Coastguard Worker void incRefs(const void *) const; 136*e1eccf28SAndroid Build Coastguard Worker void decRefs(const void *) const; 137*e1eccf28SAndroid Build Coastguard Worker virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const; getHasReferences()138*e1eccf28SAndroid Build Coastguard Worker bool getHasReferences() const {return mHasReference;} 139*e1eccf28SAndroid Build Coastguard Worker 140*e1eccf28SAndroid Build Coastguard Worker protected: 141*e1eccf28SAndroid Build Coastguard Worker // deallocate any components that are part of this element. 142*e1eccf28SAndroid Build Coastguard Worker void clear(); 143*e1eccf28SAndroid Build Coastguard Worker 144*e1eccf28SAndroid Build Coastguard Worker typedef struct { 145*e1eccf28SAndroid Build Coastguard Worker const char *name; 146*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<const Element> e; 147*e1eccf28SAndroid Build Coastguard Worker uint32_t offsetBits; 148*e1eccf28SAndroid Build Coastguard Worker uint32_t offsetBitsUnpadded; 149*e1eccf28SAndroid Build Coastguard Worker uint32_t arraySize; 150*e1eccf28SAndroid Build Coastguard Worker } ElementField_t; 151*e1eccf28SAndroid Build Coastguard Worker ElementField_t *mFields; 152*e1eccf28SAndroid Build Coastguard Worker size_t mFieldCount; 153*e1eccf28SAndroid Build Coastguard Worker bool mHasReference; 154*e1eccf28SAndroid Build Coastguard Worker 155*e1eccf28SAndroid Build Coastguard Worker 156*e1eccf28SAndroid Build Coastguard Worker virtual ~Element(); 157*e1eccf28SAndroid Build Coastguard Worker explicit Element(Context *); 158*e1eccf28SAndroid Build Coastguard Worker 159*e1eccf28SAndroid Build Coastguard Worker Component mComponent; 160*e1eccf28SAndroid Build Coastguard Worker uint32_t mBitsUnpadded; 161*e1eccf28SAndroid Build Coastguard Worker uint32_t mBits; 162*e1eccf28SAndroid Build Coastguard Worker 163*e1eccf28SAndroid Build Coastguard Worker void compute(); 164*e1eccf28SAndroid Build Coastguard Worker 165*e1eccf28SAndroid Build Coastguard Worker virtual void preDestroy() const; 166*e1eccf28SAndroid Build Coastguard Worker }; 167*e1eccf28SAndroid Build Coastguard Worker 168*e1eccf28SAndroid Build Coastguard Worker 169*e1eccf28SAndroid Build Coastguard Worker class ElementState { 170*e1eccf28SAndroid Build Coastguard Worker public: 171*e1eccf28SAndroid Build Coastguard Worker ElementState(); 172*e1eccf28SAndroid Build Coastguard Worker ~ElementState(); 173*e1eccf28SAndroid Build Coastguard Worker 174*e1eccf28SAndroid Build Coastguard Worker // Cache of all existing elements. 175*e1eccf28SAndroid Build Coastguard Worker std::vector<Element *> mElements; 176*e1eccf28SAndroid Build Coastguard Worker }; 177*e1eccf28SAndroid Build Coastguard Worker 178*e1eccf28SAndroid Build Coastguard Worker 179*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 180*e1eccf28SAndroid Build Coastguard Worker } // namespace android 181*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_STRUCTURED_ELEMENT_H 182