• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "rsDefines.h"
23 #include "rsObjectBase.h"
24 
25 // ---------------------------------------------------------------------------
26 namespace android {
27 namespace renderscript {
28 /*****************************************************************************
29  * CAUTION
30  *
31  * Any layout changes for this class may require a corresponding change to be
32  * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
33  * a partial copy of the information below.
34  *
35  *****************************************************************************/
36 // An element is a group of Components that occupies one cell in a structure.
37 class Element : public ObjectBase {
38 public:
39     struct Hal {
40         mutable void *drv;
41 
42         struct State {
43             RsDataType dataType;
44             RsDataKind dataKind;
45             uint32_t vectorSize;
46             uint32_t elementSizeBytes;
47 
48             // Subelements
49             const Element **fields;
50             uint32_t *fieldArraySizes;
51             const char **fieldNames;
52             uint32_t *fieldNameLengths;
53             uint32_t *fieldOffsetBytes;
54             uint32_t fieldsCount;
55         };
56         State state;
57     };
58     Hal mHal;
59 
60     class Builder {
61     public:
62         Builder();
63         void add(const Element *e, const char *nameStr, uint32_t arraySize);
64         ObjectBaseRef<const Element> create(Context *rsc);
65     private:
66         Vector<ObjectBaseRef<const Element> > mBuilderElementRefs;
67         Vector<const Element *> mBuilderElements;
68         Vector<const char*> mBuilderNameStrings;
69         Vector<size_t> mBuilderNameLengths;
70         Vector<uint32_t> mBuilderArrays;
71     };
72     uint32_t getGLType() const;
73     uint32_t getGLFormat() const;
74 
75     size_t getSizeBitsUnpadded() const;
getSizeBytesUnpadded()76     size_t getSizeBytesUnpadded() const {
77         return (getSizeBitsUnpadded() + 7) >> 3;
78     }
79 
80     size_t getSizeBits() const;
getSizeBytes()81     size_t getSizeBytes() const {
82         return (getSizeBits() + 7) >> 3;
83     }
84 
getFieldOffsetBits(uint32_t componentNumber)85     size_t getFieldOffsetBits(uint32_t componentNumber) const {
86         return mFields[componentNumber].offsetBits;
87     }
getFieldOffsetBytes(uint32_t componentNumber)88     size_t getFieldOffsetBytes(uint32_t componentNumber) const {
89         return mFields[componentNumber].offsetBits >> 3;
90     }
91 
getFieldOffsetBytesUnpadded(uint32_t componentNumber)92     size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const {
93         return mFields[componentNumber].offsetBitsUnpadded >> 3;
94     }
95 
getFieldCount()96     uint32_t getFieldCount() const {return mFieldCount;}
getField(uint32_t idx)97     const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
getFieldName(uint32_t idx)98     const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
getFieldArraySize(uint32_t idx)99     uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;}
100 
getComponent()101     const Component & getComponent() const {return mComponent;}
getType()102     RsDataType getType() const {return mComponent.getType();}
getKind()103     RsDataKind getKind() const {return mComponent.getKind();}
getBits()104     uint32_t getBits() const {return mBits;}
getBitsUnpadded()105     uint32_t getBitsUnpadded() const {return mBitsUnpadded;}
getVectorSize()106     uint32_t getVectorSize() const {return mComponent.getVectorSize();}
107 
108     void dumpLOGV(const char *prefix) const;
109     virtual void serialize(Context *rsc, OStream *stream) const;
getClassId()110     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; }
111     static Element *createFromStream(Context *rsc, IStream *stream);
112 
113     static ObjectBaseRef<const Element> createRef(Context *rsc,
114                                                   RsDataType dt,
115                                                   RsDataKind dk,
116                                                   bool isNorm,
117                                                   uint32_t vecSize);
118     static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count,
119                                                   const Element **,
120                                                   const char **,
121                                                   const size_t * lengths,
122                                                   const uint32_t *asin);
123 
create(Context * rsc,RsDataType dt,RsDataKind dk,bool isNorm,uint32_t vecSize)124     static const Element* create(Context *rsc,
125                                  RsDataType dt,
126                                  RsDataKind dk,
127                                  bool isNorm,
128                                  uint32_t vecSize) {
129         ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize);
130         elem->incUserRef();
131         return elem.get();
132     }
create(Context * rsc,size_t count,const Element ** ein,const char ** nin,const size_t * lengths,const uint32_t * asin)133     static const Element* create(Context *rsc, size_t count,
134                                  const Element **ein,
135                                  const char **nin,
136                                  const size_t * lengths,
137                                  const uint32_t *asin) {
138         ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin);
139         elem->incUserRef();
140         return elem.get();
141     }
142 
143     void incRefs(const void *) const;
144     void decRefs(const void *) const;
getHasReferences()145     bool getHasReferences() const {return mHasReference;}
146 
147 protected:
148     // deallocate any components that are part of this element.
149     void clear();
150 
151     typedef struct {
152         String8 name;
153         ObjectBaseRef<const Element> e;
154         uint32_t offsetBits;
155         uint32_t offsetBitsUnpadded;
156         uint32_t arraySize;
157     } ElementField_t;
158     ElementField_t *mFields;
159     size_t mFieldCount;
160     bool mHasReference;
161 
162 
163     virtual ~Element();
164     Element(Context *);
165 
166     Component mComponent;
167     uint32_t mBitsUnpadded;
168     uint32_t mBits;
169 
170     void compute();
171 
172     virtual void preDestroy() const;
173 };
174 
175 
176 class ElementState {
177 public:
178     ElementState();
179     ~ElementState();
180 
181     // Cache of all existing elements.
182     Vector<Element *> mElements;
183 };
184 
185 
186 }
187 }
188 #endif //ANDROID_STRUCTURED_ELEMENT_H
189