gfx/skia/trunk/src/gpu/gl/debug/GrFakeRefObj.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  */
     8 #ifndef GrFakeRefObj_DEFINED
     9 #define GrFakeRefObj_DEFINED
    11 #include "SkTypes.h"
    12 #include "gl/GrGLInterface.h"
    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 : public SkNoncopyable {
    22 public:
    23     GrFakeRefObj()
    24         : fRef(0)
    25         , fHighRefCount(0)
    26         , fMarkedForDeletion(false)
    27         , fDeleted(false) {
    29         // source for globally unique IDs - 0 is reserved!
    30         static int fNextID = 0;
    32         fID = ++fNextID;
    33     }
    34     virtual ~GrFakeRefObj() {};
    36     void ref() {
    37         fRef++;
    38         if (fHighRefCount < fRef) {
    39             fHighRefCount = fRef;
    40         }
    41     }
    42     void unref() {
    43         fRef--;
    44         GrAlwaysAssert(fRef >= 0);
    46         // often in OpenGL a given object may still be in use when the
    47         // delete call is made. In these cases the object is marked
    48         // for deletion and then freed when it is no longer in use
    49         if (0 == fRef && fMarkedForDeletion) {
    50             this->deleteAction();
    51         }
    52     }
    53     int getRefCount() const             { return fRef; }
    54     int getHighRefCount() const         { return fHighRefCount; }
    56     GrGLuint getID() const              { return fID; }
    58     void setMarkedForDeletion()         { fMarkedForDeletion = true; }
    59     bool getMarkedForDeletion() const   { return fMarkedForDeletion; }
    61     bool getDeleted() const             { return fDeleted; }
    63     // The deleteAction fires if the object has been marked for deletion but
    64     // couldn't be deleted earlier due to refs
    65     virtual void deleteAction() {
    66         this->setDeleted();
    67     }
    69 protected:
    70 private:
    71     int         fRef;               // ref count
    72     int         fHighRefCount;      // high water mark of the ref count
    73     GrGLuint    fID;                // globally unique ID
    74     bool        fMarkedForDeletion;
    75     // The deleted flag is only set when OpenGL thinks the object is deleted
    76     // It is obviously still allocated w/in this framework
    77     bool        fDeleted;
    79     // setDeleted should only ever appear in the deleteAction method!
    80     void setDeleted()                   { fDeleted = true; }
    81 };
    83 ////////////////////////////////////////////////////////////////////////////////
    84 // Each class derived from GrFakeRefObj should use this macro to add a
    85 // factory creation entry point. This entry point is used by the GrGLDebug
    86 // object to instantiate the various objects
    87 // all globally unique IDs
    88 #define GR_DEFINE_CREATOR(className)                        \
    89     public:                                                 \
    90     static GrFakeRefObj *create ## className() {            \
    91         return SkNEW(className);                            \
    92     }
    94 #endif // GrFakeRefObj_DEFINED

mercurial