• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
id()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:
RefCountObjectBindingPointer()45     RefCountObjectBindingPointer() : mObject(NULL) { }
~RefCountObjectBindingPointer()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);
get()49     RefCountObject *get() const { return mObject; }
50 
51   public:
id()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:
set(ObjectType * newObject)63     void set(ObjectType *newObject) { RefCountObjectBindingPointer::set(newObject); }
get()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