Home | History | Annotate | Download | only in debug
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #ifndef GrDebugGL_DEFINED
     10 #define GrDebugGL_DEFINED
     11 
     12 #include "SkTArray.h"
     13 #include "gl/GrGLInterface.h"
     14 
     15 class GrBufferObj;
     16 class GrFakeRefObj;
     17 class GrFrameBufferObj;
     18 class GrProgramObj;
     19 class GrRenderBufferObj;
     20 class GrTextureObj;
     21 class GrTextureUnitObj;
     22 class GrVertexArrayObj;
     23 
     24 ////////////////////////////////////////////////////////////////////////////////
     25 // This is the main debugging object. It is a singleton and keeps track of
     26 // all the other debug objects.
     27 class GrDebugGL {
     28 public:
     29     enum GrObjTypes {
     30         kTexture_ObjTypes = 0,
     31         kBuffer_ObjTypes,
     32         kRenderBuffer_ObjTypes,
     33         kFrameBuffer_ObjTypes,
     34         kShader_ObjTypes,
     35         kProgram_ObjTypes,
     36         kTextureUnit_ObjTypes,
     37         kVertexArray_ObjTypes,
     38         kObjTypeCount
     39     };
     40 
     41     GrFakeRefObj *createObj(GrObjTypes type) {
     42         GrFakeRefObj *temp = (*gFactoryFunc[type])();
     43 
     44         fObjects.push_back(temp);
     45 
     46         return temp;
     47     }
     48 
     49     GrFakeRefObj *findObject(GrGLuint ID, GrObjTypes type);
     50 
     51     GrGLuint getMaxTextureUnits() const { return kDefaultMaxTextureUnits; }
     52 
     53     void setCurTextureUnit(GrGLuint curTextureUnit) { fCurTextureUnit = curTextureUnit; }
     54     GrGLuint getCurTextureUnit() const { return fCurTextureUnit; }
     55 
     56     GrTextureUnitObj *getTextureUnit(int iUnit) {
     57         GrAlwaysAssert(0 <= iUnit && kDefaultMaxTextureUnits > iUnit);
     58 
     59         return fTextureUnits[iUnit];
     60     }
     61 
     62     void setArrayBuffer(GrBufferObj *arrayBuffer);
     63     GrBufferObj *getArrayBuffer()                   { return fArrayBuffer; }
     64 
     65     void setElementArrayBuffer(GrBufferObj *elementArrayBuffer);
     66     GrBufferObj *getElementArrayBuffer()                            { return fElementArrayBuffer; }
     67 
     68     void setVertexArray(GrVertexArrayObj* vertexArray);
     69     GrVertexArrayObj* getVertexArray() { return fVertexArray; }
     70 
     71     void setTexture(GrTextureObj *texture);
     72 
     73     void setFrameBuffer(GrFrameBufferObj *frameBuffer);
     74     GrFrameBufferObj *getFrameBuffer()                  { return fFrameBuffer; }
     75 
     76     void setRenderBuffer(GrRenderBufferObj *renderBuffer);
     77     GrRenderBufferObj *getRenderBuffer()                  { return fRenderBuffer; }
     78 
     79     void useProgram(GrProgramObj *program);
     80 
     81     void setPackRowLength(GrGLint packRowLength) {
     82         fPackRowLength = packRowLength;
     83     }
     84     GrGLint getPackRowLength() const { return fPackRowLength; }
     85 
     86     void setUnPackRowLength(GrGLint unPackRowLength) {
     87         fUnPackRowLength = unPackRowLength;
     88     }
     89     GrGLint getUnPackRowLength() const { return fUnPackRowLength; }
     90 
     91     static GrDebugGL *getInstance() {
     92         // someone should admit to actually using this class
     93         SkASSERT(0 < gStaticRefCount);
     94 
     95         if (NULL == gObj) {
     96             gObj = SkNEW(GrDebugGL);
     97         }
     98 
     99         return gObj;
    100     }
    101 
    102     void report() const;
    103 
    104     static void staticRef() {
    105         gStaticRefCount++;
    106     }
    107 
    108     static void staticUnRef() {
    109         SkASSERT(gStaticRefCount > 0);
    110         gStaticRefCount--;
    111         if (0 == gStaticRefCount) {
    112             SkDELETE(gObj);
    113             gObj = NULL;
    114         }
    115     }
    116 
    117 protected:
    118 
    119 private:
    120     // the OpenGLES 2.0 spec says this must be >= 2
    121     static const GrGLint kDefaultMaxTextureUnits = 8;
    122 
    123     GrGLint         fPackRowLength;
    124     GrGLint         fUnPackRowLength;
    125     GrGLuint        fCurTextureUnit;
    126     GrBufferObj*    fArrayBuffer;
    127     GrBufferObj*    fElementArrayBuffer;
    128     GrFrameBufferObj* fFrameBuffer;
    129     GrRenderBufferObj* fRenderBuffer;
    130     GrProgramObj* fProgram;
    131     GrTextureObj* fTexture;
    132     GrTextureUnitObj *fTextureUnits[kDefaultMaxTextureUnits];
    133     GrVertexArrayObj *fVertexArray;
    134 
    135     typedef GrFakeRefObj *(*Create)();
    136 
    137     static Create gFactoryFunc[kObjTypeCount];
    138 
    139     static GrDebugGL* gObj;
    140     static int gStaticRefCount;
    141 
    142     // global store of all objects
    143     SkTArray<GrFakeRefObj *> fObjects;
    144 
    145     GrDebugGL();
    146     ~GrDebugGL();
    147 };
    148 
    149 ////////////////////////////////////////////////////////////////////////////////
    150 // Helper macro to make creating an object (where you need to get back a derived
    151 // type) easier
    152 #define GR_CREATE(className, classEnum)                     \
    153     reinterpret_cast<className *>(GrDebugGL::getInstance()->createObj(classEnum))
    154 
    155 ////////////////////////////////////////////////////////////////////////////////
    156 // Helper macro to make finding objects less painful
    157 #define GR_FIND(id, className, classEnum)                   \
    158     reinterpret_cast<className *>(GrDebugGL::getInstance()->findObject(id, classEnum))
    159 
    160 #endif // GrDebugGL_DEFINED
    161