1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrFakeRefObj_DEFINED 9 #define GrFakeRefObj_DEFINED 10 11 #include "SkTypes.h" 12 #include "gl/GrGLInterface.h" 13 14 //////////////////////////////////////////////////////////////////////////////// 15 // This object is used to track the OpenGL objects. We don't use real 16 // reference counting (i.e., we don't free the objects when their ref count 17 // goes to 0) so that we can detect invalid memory accesses. The refs we 18 // are tracking in this class are actually OpenGL's references to the objects 19 // not "ours" 20 // Each object also gets a unique globally identifying ID 21 class GrFakeRefObj : SkNoncopyable { 22 public: GrFakeRefObj()23 GrFakeRefObj() 24 : fRef(0) 25 , fMarkedForDeletion(false) 26 , fDeleted(false) { 27 28 // source for globally unique IDs - 0 is reserved! 29 static int fNextID = 0; 30 31 fID = ++fNextID; 32 } ~GrFakeRefObj()33 virtual ~GrFakeRefObj() {} 34 ref()35 void ref() { 36 fRef++; 37 } unref()38 void unref() { 39 fRef--; 40 GrAlwaysAssert(fRef >= 0); 41 42 // often in OpenGL a given object may still be in use when the 43 // delete call is made. In these cases the object is marked 44 // for deletion and then freed when it is no longer in use 45 if (0 == fRef && fMarkedForDeletion) { 46 this->deleteAction(); 47 } 48 } getRefCount()49 int getRefCount() const { return fRef; } 50 getID()51 GrGLuint getID() const { return fID; } 52 setMarkedForDeletion()53 void setMarkedForDeletion() { fMarkedForDeletion = true; } getMarkedForDeletion()54 bool getMarkedForDeletion() const { return fMarkedForDeletion; } 55 getDeleted()56 bool getDeleted() const { return fDeleted; } 57 58 // The deleteAction fires if the object has been marked for deletion but 59 // couldn't be deleted earlier due to refs deleteAction()60 virtual void deleteAction() { 61 this->setDeleted(); 62 } 63 64 protected: 65 private: 66 int fRef; // ref count 67 GrGLuint fID; // globally unique ID 68 bool fMarkedForDeletion; 69 // The deleted flag is only set when OpenGL thinks the object is deleted 70 // It is obviously still allocated w/in this framework 71 bool fDeleted; 72 73 // setDeleted should only ever appear in the deleteAction method! setDeleted()74 void setDeleted() { fDeleted = true; } 75 }; 76 77 //////////////////////////////////////////////////////////////////////////////// 78 // Each class derived from GrFakeRefObj should use this macro to add a 79 // factory creation entry point. This entry point is used by the GrGLDebug 80 // object to instantiate the various objects 81 // all globally unique IDs 82 #define GR_DEFINE_CREATOR(className) \ 83 public: \ 84 static GrFakeRefObj *create##className() { return new className; } 85 86 #endif // GrFakeRefObj_DEFINED 87