xref: /aosp_15_r20/frameworks/rs/rsElement.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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