1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_STRUCTURED_ELEMENT_H 18 #define ANDROID_STRUCTURED_ELEMENT_H 19 20 #include "rsComponent.h" 21 #include "rsUtils.h" 22 #include "rsObjectBase.h" 23 24 // --------------------------------------------------------------------------- 25 namespace android { 26 namespace renderscript { 27 28 // An element is a group of Components that occupies one cell in a structure. 29 class Element : public ObjectBase { 30 public: 31 class Builder { 32 public: 33 Builder(); 34 void add(const Element *e, const char *nameStr, uint32_t arraySize); 35 ObjectBaseRef<const Element> create(Context *rsc); 36 private: 37 Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; 38 Vector<const Element *> mBuilderElements; 39 Vector<const char*> mBuilderNameStrings; 40 Vector<size_t> mBuilderNameLengths; 41 Vector<uint32_t> mBuilderArrays; 42 }; 43 uint32_t getGLType() const; 44 uint32_t getGLFormat() const; 45 46 size_t getSizeBits() const; getSizeBytes()47 size_t getSizeBytes() const { 48 return (getSizeBits() + 7) >> 3; 49 } 50 getFieldOffsetBits(uint32_t componentNumber)51 size_t getFieldOffsetBits(uint32_t componentNumber) const { 52 return mFields[componentNumber].offsetBits; 53 } getFieldOffsetBytes(uint32_t componentNumber)54 size_t getFieldOffsetBytes(uint32_t componentNumber) const { 55 return mFields[componentNumber].offsetBits >> 3; 56 } 57 getFieldCount()58 uint32_t getFieldCount() const {return mFieldCount;} getField(uint32_t idx)59 const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} getFieldName(uint32_t idx)60 const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();} getFieldArraySize(uint32_t idx)61 uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} 62 getComponent()63 const Component & getComponent() const {return mComponent;} getType()64 RsDataType getType() const {return mComponent.getType();} getKind()65 RsDataKind getKind() const {return mComponent.getKind();} getBits()66 uint32_t getBits() const {return mBits;} 67 68 void dumpLOGV(const char *prefix) const; 69 virtual void serialize(OStream *stream) const; getClassId()70 virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } 71 static Element *createFromStream(Context *rsc, IStream *stream); 72 73 static ObjectBaseRef<const Element> createRef(Context *rsc, 74 RsDataType dt, 75 RsDataKind dk, 76 bool isNorm, 77 uint32_t vecSize); 78 static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, 79 const Element **, 80 const char **, 81 const size_t * lengths, 82 const uint32_t *asin); 83 create(Context * rsc,RsDataType dt,RsDataKind dk,bool isNorm,uint32_t vecSize)84 static const Element* create(Context *rsc, 85 RsDataType dt, 86 RsDataKind dk, 87 bool isNorm, 88 uint32_t vecSize) { 89 ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); 90 elem->incUserRef(); 91 return elem.get(); 92 } create(Context * rsc,size_t count,const Element ** ein,const char ** nin,const size_t * lengths,const uint32_t * asin)93 static const Element* create(Context *rsc, size_t count, 94 const Element **ein, 95 const char **nin, 96 const size_t * lengths, 97 const uint32_t *asin) { 98 ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); 99 elem->incUserRef(); 100 return elem.get(); 101 } 102 103 void incRefs(const void *) const; 104 void decRefs(const void *) const; getHasReferences()105 bool getHasReferences() const {return mHasReference;} 106 107 protected: 108 // deallocate any components that are part of this element. 109 void clear(); 110 111 typedef struct { 112 String8 name; 113 ObjectBaseRef<const Element> e; 114 uint32_t offsetBits; 115 uint32_t arraySize; 116 } ElementField_t; 117 ElementField_t *mFields; 118 size_t mFieldCount; 119 bool mHasReference; 120 121 122 virtual ~Element(); 123 Element(Context *); 124 125 Component mComponent; 126 uint32_t mBits; 127 128 void compute(); 129 130 virtual void preDestroy() const; 131 }; 132 133 134 class ElementState { 135 public: 136 ElementState(); 137 ~ElementState(); 138 139 // Cache of all existing elements. 140 Vector<Element *> mElements; 141 }; 142 143 144 } 145 } 146 #endif //ANDROID_STRUCTURED_ELEMENT_H 147