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 #include "GrDebugGL.h" 10 #include "GrTextureObj.h" 11 #include "GrBufferObj.h" 12 #include "GrRenderBufferObj.h" 13 #include "GrFrameBufferObj.h" 14 #include "GrShaderObj.h" 15 #include "GrProgramObj.h" 16 #include "GrTextureUnitObj.h" 17 #include "GrVertexArrayObj.h" 18 19 GrDebugGL* GrDebugGL::gObj = NULL; 20 int GrDebugGL::gStaticRefCount = 0; 21 GrDebugGL::Create GrDebugGL::gFactoryFunc[kObjTypeCount] = { 22 GrTextureObj::createGrTextureObj, 23 GrBufferObj::createGrBufferObj, 24 GrRenderBufferObj::createGrRenderBufferObj, 25 GrFrameBufferObj::createGrFrameBufferObj, 26 GrShaderObj::createGrShaderObj, 27 GrProgramObj::createGrProgramObj, 28 GrTextureUnitObj::createGrTextureUnitObj, 29 GrVertexArrayObj::createGrVertexArrayObj, 30 }; 31 32 33 GrDebugGL::GrDebugGL() 34 : fPackRowLength(0) 35 , fUnPackRowLength(0) 36 , fCurTextureUnit(0) 37 , fArrayBuffer(NULL) 38 , fElementArrayBuffer(NULL) 39 , fFrameBuffer(NULL) 40 , fRenderBuffer(NULL) 41 , fProgram(NULL) 42 , fTexture(NULL) 43 , fVertexArray(NULL) 44 , fAbandoned(false) { 45 46 for (int i = 0; i < kDefaultMaxTextureUnits; ++i) { 47 48 fTextureUnits[i] = reinterpret_cast<GrTextureUnitObj *>( 49 createObj(GrDebugGL::kTextureUnit_ObjTypes)); 50 fTextureUnits[i]->ref(); 51 52 fTextureUnits[i]->setNumber(i); 53 } 54 } 55 56 GrDebugGL::~GrDebugGL() { 57 // unref & delete the texture units first so they don't show up on the leak report 58 for (int i = 0; i < kDefaultMaxTextureUnits; ++i) { 59 fTextureUnits[i]->unref(); 60 fTextureUnits[i]->deleteAction(); 61 } 62 63 this->report(); 64 65 for (int i = 0; i < fObjects.count(); ++i) { 66 delete fObjects[i]; 67 } 68 fObjects.reset(); 69 70 fArrayBuffer = NULL; 71 fElementArrayBuffer = NULL; 72 fFrameBuffer = NULL; 73 fRenderBuffer = NULL; 74 fProgram = NULL; 75 fTexture = NULL; 76 fVertexArray = NULL; 77 } 78 79 GrFakeRefObj *GrDebugGL::findObject(GrGLuint ID, GrObjTypes type) { 80 for (int i = 0; i < fObjects.count(); ++i) { 81 if (fObjects[i]->getID() == ID) { // && fObjects[i]->getType() == type) { 82 // The application shouldn't be accessing objects 83 // that (as far as OpenGL knows) were already deleted 84 GrAlwaysAssert(!fObjects[i]->getDeleted()); 85 GrAlwaysAssert(!fObjects[i]->getMarkedForDeletion()); 86 return fObjects[i]; 87 } 88 } 89 90 return NULL; 91 } 92 93 void GrDebugGL::setArrayBuffer(GrBufferObj *arrayBuffer) { 94 if (fArrayBuffer) { 95 // automatically break the binding of the old buffer 96 GrAlwaysAssert(fArrayBuffer->getBound()); 97 fArrayBuffer->resetBound(); 98 99 GrAlwaysAssert(!fArrayBuffer->getDeleted()); 100 fArrayBuffer->unref(); 101 } 102 103 fArrayBuffer = arrayBuffer; 104 105 if (fArrayBuffer) { 106 GrAlwaysAssert(!fArrayBuffer->getDeleted()); 107 fArrayBuffer->ref(); 108 109 GrAlwaysAssert(!fArrayBuffer->getBound()); 110 fArrayBuffer->setBound(); 111 } 112 } 113 114 void GrDebugGL::setVertexArray(GrVertexArrayObj* vertexArray) { 115 if (vertexArray) { 116 SkASSERT(!vertexArray->getDeleted()); 117 } 118 SkRefCnt_SafeAssign(fVertexArray, vertexArray); 119 } 120 121 void GrDebugGL::setElementArrayBuffer(GrBufferObj *elementArrayBuffer) { 122 if (fElementArrayBuffer) { 123 // automatically break the binding of the old buffer 124 GrAlwaysAssert(fElementArrayBuffer->getBound()); 125 fElementArrayBuffer->resetBound(); 126 127 GrAlwaysAssert(!fElementArrayBuffer->getDeleted()); 128 fElementArrayBuffer->unref(); 129 } 130 131 fElementArrayBuffer = elementArrayBuffer; 132 133 if (fElementArrayBuffer) { 134 GrAlwaysAssert(!fElementArrayBuffer->getDeleted()); 135 fElementArrayBuffer->ref(); 136 137 GrAlwaysAssert(!fElementArrayBuffer->getBound()); 138 fElementArrayBuffer->setBound(); 139 } 140 } 141 142 void GrDebugGL::setTexture(GrTextureObj *texture) { 143 fTextureUnits[fCurTextureUnit]->setTexture(texture); 144 } 145 146 void GrDebugGL::setFrameBuffer(GrFrameBufferObj *frameBuffer) { 147 if (fFrameBuffer) { 148 GrAlwaysAssert(fFrameBuffer->getBound()); 149 fFrameBuffer->resetBound(); 150 151 GrAlwaysAssert(!fFrameBuffer->getDeleted()); 152 fFrameBuffer->unref(); 153 } 154 155 fFrameBuffer = frameBuffer; 156 157 if (fFrameBuffer) { 158 GrAlwaysAssert(!fFrameBuffer->getDeleted()); 159 fFrameBuffer->ref(); 160 161 GrAlwaysAssert(!fFrameBuffer->getBound()); 162 fFrameBuffer->setBound(); 163 } 164 } 165 166 void GrDebugGL::setRenderBuffer(GrRenderBufferObj *renderBuffer) { 167 if (fRenderBuffer) { 168 GrAlwaysAssert(fRenderBuffer->getBound()); 169 fRenderBuffer->resetBound(); 170 171 GrAlwaysAssert(!fRenderBuffer->getDeleted()); 172 fRenderBuffer->unref(); 173 } 174 175 fRenderBuffer = renderBuffer; 176 177 if (fRenderBuffer) { 178 GrAlwaysAssert(!fRenderBuffer->getDeleted()); 179 fRenderBuffer->ref(); 180 181 GrAlwaysAssert(!fRenderBuffer->getBound()); 182 fRenderBuffer->setBound(); 183 } 184 } 185 186 void GrDebugGL::useProgram(GrProgramObj *program) { 187 if (fProgram) { 188 GrAlwaysAssert(fProgram->getInUse()); 189 fProgram->resetInUse(); 190 191 GrAlwaysAssert(!fProgram->getDeleted()); 192 fProgram->unref(); 193 } 194 195 fProgram = program; 196 197 if (fProgram) { 198 GrAlwaysAssert(!fProgram->getDeleted()); 199 fProgram->ref(); 200 201 GrAlwaysAssert(!fProgram->getInUse()); 202 fProgram->setInUse(); 203 } 204 } 205 206 void GrDebugGL::report() const { 207 for (int i = 0; i < fObjects.count(); ++i) { 208 if (!fAbandoned) { 209 GrAlwaysAssert(0 == fObjects[i]->getRefCount()); 210 GrAlwaysAssert(fObjects[i]->getDeleted()); 211 } 212 } 213 } 214