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