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