xref: /aosp_15_r20/external/angle/src/libANGLE/CLObject.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CLObject.h: Defines the cl::Object class, which is the base class of all ANGLE CL objects.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLOBJECT_H_
9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLOBJECT_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_types.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl_types.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <atomic>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace cl
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker class Object
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker   public:
22*8975f5c5SAndroid Build Coastguard Worker     Object();
23*8975f5c5SAndroid Build Coastguard Worker     virtual ~Object();
24*8975f5c5SAndroid Build Coastguard Worker 
getRefCount()25*8975f5c5SAndroid Build Coastguard Worker     cl_uint getRefCount() const noexcept { return mRefCount; }
26*8975f5c5SAndroid Build Coastguard Worker 
retain()27*8975f5c5SAndroid Build Coastguard Worker     void retain() noexcept { ++mRefCount; }
28*8975f5c5SAndroid Build Coastguard Worker 
release()29*8975f5c5SAndroid Build Coastguard Worker     bool release()
30*8975f5c5SAndroid Build Coastguard Worker     {
31*8975f5c5SAndroid Build Coastguard Worker         if (mRefCount == 0u)
32*8975f5c5SAndroid Build Coastguard Worker         {
33*8975f5c5SAndroid Build Coastguard Worker             WARN() << "Unreferenced object without references";
34*8975f5c5SAndroid Build Coastguard Worker             return true;
35*8975f5c5SAndroid Build Coastguard Worker         }
36*8975f5c5SAndroid Build Coastguard Worker         return --mRefCount == 0u;
37*8975f5c5SAndroid Build Coastguard Worker     }
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     template <typename T, typename... Args>
Create(Args &&...args)40*8975f5c5SAndroid Build Coastguard Worker     static T *Create(Args &&...args)
41*8975f5c5SAndroid Build Coastguard Worker     {
42*8975f5c5SAndroid Build Coastguard Worker         T *object = new T(std::forward<Args>(args)...);
43*8975f5c5SAndroid Build Coastguard Worker         return object;
44*8975f5c5SAndroid Build Coastguard Worker     }
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker   private:
47*8975f5c5SAndroid Build Coastguard Worker     std::atomic<cl_uint> mRefCount;
48*8975f5c5SAndroid Build Coastguard Worker };
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLCONTEXT_H_
53