|
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 |