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