Home | History | Annotate | Download | only in libGLESv2
      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