xref: /aosp_15_r20/frameworks/rs/rsObjectBase.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_RS_OBJECT_BASE_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_OBJECT_BASE_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "rsDefines.h"
22*e1eccf28SAndroid Build Coastguard Worker #include "rsInternalDefines.h"
23*e1eccf28SAndroid Build Coastguard Worker 
24*e1eccf28SAndroid Build Coastguard Worker namespace android {
25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
26*e1eccf28SAndroid Build Coastguard Worker 
27*e1eccf28SAndroid Build Coastguard Worker class Context;
28*e1eccf28SAndroid Build Coastguard Worker class OStream;
29*e1eccf28SAndroid Build Coastguard Worker 
30*e1eccf28SAndroid Build Coastguard Worker // An element is a group of Components that occupies one cell in a structure.
31*e1eccf28SAndroid Build Coastguard Worker class ObjectBase {
32*e1eccf28SAndroid Build Coastguard Worker public:
33*e1eccf28SAndroid Build Coastguard Worker     static const bool gDebugStacks = false;
34*e1eccf28SAndroid Build Coastguard Worker     static const bool gDebugReferences = false;
35*e1eccf28SAndroid Build Coastguard Worker     static const bool gDebugLeaks = false;
36*e1eccf28SAndroid Build Coastguard Worker     static const bool gDebugLifetime = false;
37*e1eccf28SAndroid Build Coastguard Worker 
38*e1eccf28SAndroid Build Coastguard Worker     ObjectBase(Context *rsc);  // NOLINT, implicit
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker     void incSysRef() const;
41*e1eccf28SAndroid Build Coastguard Worker     bool decSysRef() const;
42*e1eccf28SAndroid Build Coastguard Worker 
43*e1eccf28SAndroid Build Coastguard Worker     void incUserRef() const;
44*e1eccf28SAndroid Build Coastguard Worker     bool decUserRef() const;
45*e1eccf28SAndroid Build Coastguard Worker     bool zeroUserRef() const;
46*e1eccf28SAndroid Build Coastguard Worker 
47*e1eccf28SAndroid Build Coastguard Worker     static bool checkDelete(const ObjectBase *);
48*e1eccf28SAndroid Build Coastguard Worker 
getName()49*e1eccf28SAndroid Build Coastguard Worker     const char * getName() const {
50*e1eccf28SAndroid Build Coastguard Worker         return mName;
51*e1eccf28SAndroid Build Coastguard Worker     }
assignName(const char * s)52*e1eccf28SAndroid Build Coastguard Worker     void assignName(const char *s) {mName = s;}
53*e1eccf28SAndroid Build Coastguard Worker     void setName(const char *);
54*e1eccf28SAndroid Build Coastguard Worker     void setName(const char *, uint32_t len);
55*e1eccf28SAndroid Build Coastguard Worker 
getContext()56*e1eccf28SAndroid Build Coastguard Worker     Context * getContext() const {return mRSC;}
57*e1eccf28SAndroid Build Coastguard Worker     virtual bool freeChildren();
58*e1eccf28SAndroid Build Coastguard Worker 
59*e1eccf28SAndroid Build Coastguard Worker     static void zeroAllUserRef(Context *rsc);
60*e1eccf28SAndroid Build Coastguard Worker     static void freeAllChildren(Context *rsc);
61*e1eccf28SAndroid Build Coastguard Worker     static void dumpAll(Context *rsc);
62*e1eccf28SAndroid Build Coastguard Worker 
63*e1eccf28SAndroid Build Coastguard Worker     virtual void dumpLOGV(const char *prefix) const;
64*e1eccf28SAndroid Build Coastguard Worker     virtual void serialize(Context *rsc, OStream *stream) const = 0;
65*e1eccf28SAndroid Build Coastguard Worker     virtual RsA3DClassID getClassId() const = 0;
66*e1eccf28SAndroid Build Coastguard Worker 
67*e1eccf28SAndroid Build Coastguard Worker     static bool isValid(const Context *rsc, const ObjectBase *obj);
68*e1eccf28SAndroid Build Coastguard Worker 
69*e1eccf28SAndroid Build Coastguard Worker     // The async lock is taken during object creation in non-rs threads
70*e1eccf28SAndroid Build Coastguard Worker     // and object deletion in the rs thread.
71*e1eccf28SAndroid Build Coastguard Worker     static void asyncLock();
72*e1eccf28SAndroid Build Coastguard Worker     static void asyncUnlock();
73*e1eccf28SAndroid Build Coastguard Worker 
74*e1eccf28SAndroid Build Coastguard Worker     virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const;
75*e1eccf28SAndroid Build Coastguard Worker 
76*e1eccf28SAndroid Build Coastguard Worker protected:
77*e1eccf28SAndroid Build Coastguard Worker     // Called inside the async lock for any object list management that is
78*e1eccf28SAndroid Build Coastguard Worker     // necessary in derived classes.
79*e1eccf28SAndroid Build Coastguard Worker     virtual void preDestroy() const;
80*e1eccf28SAndroid Build Coastguard Worker 
81*e1eccf28SAndroid Build Coastguard Worker     Context *mRSC;
82*e1eccf28SAndroid Build Coastguard Worker     virtual ~ObjectBase();
83*e1eccf28SAndroid Build Coastguard Worker 
84*e1eccf28SAndroid Build Coastguard Worker private:
85*e1eccf28SAndroid Build Coastguard Worker     static pthread_mutex_t gObjectInitMutex;
86*e1eccf28SAndroid Build Coastguard Worker 
87*e1eccf28SAndroid Build Coastguard Worker     void add() const;
88*e1eccf28SAndroid Build Coastguard Worker     void remove() const;
89*e1eccf28SAndroid Build Coastguard Worker 
90*e1eccf28SAndroid Build Coastguard Worker     const char* mName;
91*e1eccf28SAndroid Build Coastguard Worker     mutable int32_t mSysRefCount;
92*e1eccf28SAndroid Build Coastguard Worker     mutable int32_t mUserRefCount;
93*e1eccf28SAndroid Build Coastguard Worker 
94*e1eccf28SAndroid Build Coastguard Worker     mutable const ObjectBase * mPrev;
95*e1eccf28SAndroid Build Coastguard Worker     mutable const ObjectBase * mNext;
96*e1eccf28SAndroid Build Coastguard Worker 
97*e1eccf28SAndroid Build Coastguard Worker     class DebugHelper *mDH;
98*e1eccf28SAndroid Build Coastguard Worker };
99*e1eccf28SAndroid Build Coastguard Worker 
100*e1eccf28SAndroid Build Coastguard Worker template<class T>
101*e1eccf28SAndroid Build Coastguard Worker class ObjectBaseRef {
102*e1eccf28SAndroid Build Coastguard Worker public:
ObjectBaseRef()103*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef() {
104*e1eccf28SAndroid Build Coastguard Worker         mRef = nullptr;
105*e1eccf28SAndroid Build Coastguard Worker     }
106*e1eccf28SAndroid Build Coastguard Worker 
ObjectBaseRef(const ObjectBaseRef & ref)107*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef(const ObjectBaseRef &ref) {
108*e1eccf28SAndroid Build Coastguard Worker         mRef = ref.get();
109*e1eccf28SAndroid Build Coastguard Worker         if (mRef) {
110*e1eccf28SAndroid Build Coastguard Worker             mRef->incSysRef();
111*e1eccf28SAndroid Build Coastguard Worker         }
112*e1eccf28SAndroid Build Coastguard Worker     }
113*e1eccf28SAndroid Build Coastguard Worker 
ObjectBaseRef(T * ref)114*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef(T *ref) {  // NOLINT, implicit
115*e1eccf28SAndroid Build Coastguard Worker         mRef = ref;
116*e1eccf28SAndroid Build Coastguard Worker         if (mRef) {
117*e1eccf28SAndroid Build Coastguard Worker             ref->incSysRef();
118*e1eccf28SAndroid Build Coastguard Worker         }
119*e1eccf28SAndroid Build Coastguard Worker     }
120*e1eccf28SAndroid Build Coastguard Worker 
121*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef & operator= (const ObjectBaseRef &ref) {
122*e1eccf28SAndroid Build Coastguard Worker         if (&ref != this) {
123*e1eccf28SAndroid Build Coastguard Worker             set(ref);
124*e1eccf28SAndroid Build Coastguard Worker         }
125*e1eccf28SAndroid Build Coastguard Worker         return *this;
126*e1eccf28SAndroid Build Coastguard Worker     }
127*e1eccf28SAndroid Build Coastguard Worker 
~ObjectBaseRef()128*e1eccf28SAndroid Build Coastguard Worker     ~ObjectBaseRef() {
129*e1eccf28SAndroid Build Coastguard Worker         clear();
130*e1eccf28SAndroid Build Coastguard Worker     }
131*e1eccf28SAndroid Build Coastguard Worker 
set(T * ref)132*e1eccf28SAndroid Build Coastguard Worker     void set(T *ref) {
133*e1eccf28SAndroid Build Coastguard Worker         if (mRef != ref) {
134*e1eccf28SAndroid Build Coastguard Worker             clear();
135*e1eccf28SAndroid Build Coastguard Worker             mRef = ref;
136*e1eccf28SAndroid Build Coastguard Worker             if (mRef) {
137*e1eccf28SAndroid Build Coastguard Worker                 ref->incSysRef();
138*e1eccf28SAndroid Build Coastguard Worker             }
139*e1eccf28SAndroid Build Coastguard Worker         }
140*e1eccf28SAndroid Build Coastguard Worker     }
141*e1eccf28SAndroid Build Coastguard Worker 
set(const ObjectBaseRef & ref)142*e1eccf28SAndroid Build Coastguard Worker     void set(const ObjectBaseRef &ref) {
143*e1eccf28SAndroid Build Coastguard Worker         set(ref.mRef);
144*e1eccf28SAndroid Build Coastguard Worker     }
145*e1eccf28SAndroid Build Coastguard Worker 
clear()146*e1eccf28SAndroid Build Coastguard Worker     void clear() {
147*e1eccf28SAndroid Build Coastguard Worker         if (mRef) {
148*e1eccf28SAndroid Build Coastguard Worker             mRef->decSysRef();
149*e1eccf28SAndroid Build Coastguard Worker         }
150*e1eccf28SAndroid Build Coastguard Worker         mRef = nullptr;
151*e1eccf28SAndroid Build Coastguard Worker     }
152*e1eccf28SAndroid Build Coastguard Worker 
get()153*e1eccf28SAndroid Build Coastguard Worker     inline T * get() const {
154*e1eccf28SAndroid Build Coastguard Worker         return mRef;
155*e1eccf28SAndroid Build Coastguard Worker     }
156*e1eccf28SAndroid Build Coastguard Worker 
157*e1eccf28SAndroid Build Coastguard Worker     inline T * operator-> () const {
158*e1eccf28SAndroid Build Coastguard Worker         return mRef;
159*e1eccf28SAndroid Build Coastguard Worker     }
160*e1eccf28SAndroid Build Coastguard Worker 
161*e1eccf28SAndroid Build Coastguard Worker protected:
162*e1eccf28SAndroid Build Coastguard Worker     T * mRef;
163*e1eccf28SAndroid Build Coastguard Worker };
164*e1eccf28SAndroid Build Coastguard Worker 
165*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
166*e1eccf28SAndroid Build Coastguard Worker } // namespace android
167*e1eccf28SAndroid Build Coastguard Worker 
168*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_OBJECT_BASE_H
169*e1eccf28SAndroid Build Coastguard Worker 
170