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