michael@0: // michael@0: // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // RefCountObject.h: Defines the gl::RefCountObject base class that provides michael@0: // lifecycle support for GL objects using the traditional BindObject scheme, but michael@0: // that need to be reference counted for correct cross-context deletion. michael@0: // (Concretely, textures, buffers and renderbuffers.) michael@0: michael@0: #ifndef COMMON_REFCOUNTOBJECT_H_ michael@0: #define COMMON_REFCOUNTOBJECT_H_ michael@0: michael@0: #include michael@0: michael@0: #define GL_APICALL michael@0: #include michael@0: michael@0: #include "common/debug.h" michael@0: michael@0: class RefCountObject michael@0: { michael@0: public: michael@0: explicit RefCountObject(GLuint id); michael@0: virtual ~RefCountObject(); michael@0: michael@0: virtual void addRef() const; michael@0: virtual void release() const; michael@0: michael@0: GLuint id() const { return mId; } michael@0: michael@0: private: michael@0: GLuint mId; michael@0: michael@0: mutable std::size_t mRefCount; michael@0: }; michael@0: michael@0: class RefCountObjectBindingPointer michael@0: { michael@0: protected: michael@0: RefCountObjectBindingPointer() : mObject(NULL) { } michael@0: ~RefCountObjectBindingPointer() { ASSERT(mObject == NULL); } // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up. michael@0: michael@0: void set(RefCountObject *newObject); michael@0: RefCountObject *get() const { return mObject; } michael@0: michael@0: public: michael@0: GLuint id() const { return (mObject != NULL) ? mObject->id() : 0; } michael@0: bool operator ! () const { return (get() == NULL); } michael@0: michael@0: private: michael@0: RefCountObject *mObject; michael@0: }; michael@0: michael@0: template michael@0: class BindingPointer : public RefCountObjectBindingPointer michael@0: { michael@0: public: michael@0: void set(ObjectType *newObject) { RefCountObjectBindingPointer::set(newObject); } michael@0: ObjectType *get() const { return static_cast(RefCountObjectBindingPointer::get()); } michael@0: ObjectType *operator -> () const { return get(); } michael@0: }; michael@0: michael@0: #endif // COMMON_REFCOUNTOBJECT_H_