Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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 */
9 #ifndef GrDebugGL_DEFINED
10 #define GrDebugGL_DEFINED
12 #include "SkTArray.h"
13 #include "gl/GrGLInterface.h"
15 class GrBufferObj;
16 class GrFakeRefObj;
17 class GrFrameBufferObj;
18 class GrProgramObj;
19 class GrRenderBufferObj;
20 class GrTextureObj;
21 class GrTextureUnitObj;
22 class GrVertexArrayObj;
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 };
41 GrFakeRefObj *createObj(GrObjTypes type) {
42 GrFakeRefObj *temp = (*gFactoryFunc[type])();
44 fObjects.push_back(temp);
46 return temp;
47 }
49 GrFakeRefObj *findObject(GrGLuint ID, GrObjTypes type);
51 GrGLuint getMaxTextureUnits() const { return kDefaultMaxTextureUnits; }
53 void setCurTextureUnit(GrGLuint curTextureUnit) { fCurTextureUnit = curTextureUnit; }
54 GrGLuint getCurTextureUnit() const { return fCurTextureUnit; }
56 GrTextureUnitObj *getTextureUnit(int iUnit) {
57 GrAlwaysAssert(0 <= iUnit && kDefaultMaxTextureUnits > iUnit);
59 return fTextureUnits[iUnit];
60 }
62 void setArrayBuffer(GrBufferObj *arrayBuffer);
63 GrBufferObj *getArrayBuffer() { return fArrayBuffer; }
65 void setElementArrayBuffer(GrBufferObj *elementArrayBuffer);
66 GrBufferObj *getElementArrayBuffer() { return fElementArrayBuffer; }
68 void setVertexArray(GrVertexArrayObj* vertexArray);
69 GrVertexArrayObj* getVertexArray() { return fVertexArray; }
71 void setTexture(GrTextureObj *texture);
73 void setFrameBuffer(GrFrameBufferObj *frameBuffer);
74 GrFrameBufferObj *getFrameBuffer() { return fFrameBuffer; }
76 void setRenderBuffer(GrRenderBufferObj *renderBuffer);
77 GrRenderBufferObj *getRenderBuffer() { return fRenderBuffer; }
79 void useProgram(GrProgramObj *program);
81 void setPackRowLength(GrGLint packRowLength) {
82 fPackRowLength = packRowLength;
83 }
84 GrGLint getPackRowLength() const { return fPackRowLength; }
86 void setUnPackRowLength(GrGLint unPackRowLength) {
87 fUnPackRowLength = unPackRowLength;
88 }
89 GrGLint getUnPackRowLength() const { return fUnPackRowLength; }
91 static GrDebugGL *getInstance() {
92 // someone should admit to actually using this class
93 SkASSERT(0 < gStaticRefCount);
95 if (NULL == gObj) {
96 gObj = SkNEW(GrDebugGL);
97 }
99 return gObj;
100 }
102 void report() const;
104 static void staticRef() {
105 gStaticRefCount++;
106 }
108 static void staticUnRef() {
109 SkASSERT(gStaticRefCount > 0);
110 gStaticRefCount--;
111 if (0 == gStaticRefCount) {
112 SkDELETE(gObj);
113 gObj = NULL;
114 }
115 }
117 protected:
119 private:
120 // the OpenGLES 2.0 spec says this must be >= 2
121 static const GrGLint kDefaultMaxTextureUnits = 8;
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;
135 typedef GrFakeRefObj *(*Create)();
137 static Create gFactoryFunc[kObjTypeCount];
139 static GrDebugGL* gObj;
140 static int gStaticRefCount;
142 // global store of all objects
143 SkTArray<GrFakeRefObj *> fObjects;
145 GrDebugGL();
146 ~GrDebugGL();
147 };
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))
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))
160 #endif // GrDebugGL_DEFINED