1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // RefCountObject.h: Defines the gl::RefCountObject base class that provides 8 // lifecycle support for GL objects using the traditional BindObject scheme, but 9 // that need to be reference counted for correct cross-context deletion. 10 // (Concretely, textures, buffers and renderbuffers.) 11 12 #ifndef LIBGLESV2_REFCOUNTOBJECT_H_ 13 #define LIBGLESV2_REFCOUNTOBJECT_H_ 14 15 #include <cstddef> 16 17 #define GL_APICALL 18 #include <GLES2/gl2.h> 19 20 #include "common/debug.h" 21 22 namespace gl 23 { 24 25 class RefCountObject 26 { 27 public: 28 explicit RefCountObject(GLuint id); 29 virtual ~RefCountObject(); 30 31 virtual void addRef() const; 32 virtual void release() const; 33 34 GLuint id() const { return mId; } 35 36 private: 37 GLuint mId; 38 39 mutable std::size_t mRefCount; 40 }; 41 42 class RefCountObjectBindingPointer 43 { 44 protected: 45 RefCountObjectBindingPointer() : mObject(NULL) { } 46 ~RefCountObjectBindingPointer() { ASSERT(mObject == NULL); } // Objects have to be released before the resource manager is destroyed, so they must be explicitly cleaned up. 47 48 void set(RefCountObject *newObject); 49 RefCountObject *get() const { return mObject; } 50 51 public: 52 GLuint id() const { return (mObject != NULL) ? mObject->id() : 0; } 53 bool operator ! () const { return (get() == NULL); } 54 55 private: 56 RefCountObject *mObject; 57 }; 58 59 template <class ObjectType> 60 class BindingPointer : public RefCountObjectBindingPointer 61 { 62 public: 63 void set(ObjectType *newObject) { RefCountObjectBindingPointer::set(newObject); } 64 ObjectType *get() const { return static_cast<ObjectType*>(RefCountObjectBindingPointer::get()); } 65 ObjectType *operator -> () const { return get(); } 66 }; 67 68 } 69 70 #endif // LIBGLESV2_REFCOUNTOBJECT_H_ 71