OLD | NEW |
| (Empty) |
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 = curTextu
reUnit; } | |
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 fEl
ementArrayBuffer; } | |
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 (nullptr == gObj) { | |
96 gObj = new 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 delete gObj; | |
113 gObj = nullptr; | |
114 } | |
115 } | |
116 | |
117 static void abandon() { | |
118 SkASSERT(gStaticRefCount > 0); | |
119 gObj->fAbandoned = true; | |
120 } | |
121 | |
122 protected: | |
123 | |
124 private: | |
125 // the OpenGLES 2.0 spec says this must be >= 2 | |
126 static const GrGLint kDefaultMaxTextureUnits = 8; | |
127 | |
128 GrGLint fPackRowLength; | |
129 GrGLint fUnPackRowLength; | |
130 GrGLuint fCurTextureUnit; | |
131 GrBufferObj* fArrayBuffer; | |
132 GrBufferObj* fElementArrayBuffer; | |
133 GrFrameBufferObj* fFrameBuffer; | |
134 GrRenderBufferObj* fRenderBuffer; | |
135 GrProgramObj* fProgram; | |
136 GrTextureObj* fTexture; | |
137 GrTextureUnitObj *fTextureUnits[kDefaultMaxTextureUnits]; | |
138 GrVertexArrayObj *fVertexArray; | |
139 | |
140 bool fAbandoned; | |
141 | |
142 typedef GrFakeRefObj *(*Create)(); | |
143 | |
144 static Create gFactoryFunc[kObjTypeCount]; | |
145 | |
146 static GrDebugGL* gObj; | |
147 static int gStaticRefCount; | |
148 | |
149 // global store of all objects | |
150 SkTArray<GrFakeRefObj *> fObjects; | |
151 | |
152 GrDebugGL(); | |
153 ~GrDebugGL(); | |
154 }; | |
155 | |
156 //////////////////////////////////////////////////////////////////////////////// | |
157 // Helper macro to make creating an object (where you need to get back a derived | |
158 // type) easier | |
159 #define GR_CREATE(className, classEnum) \ | |
160 reinterpret_cast<className *>(GrDebugGL::getInstance()->createObj(classEnum)
) | |
161 | |
162 //////////////////////////////////////////////////////////////////////////////// | |
163 // Helper macro to make finding objects less painful | |
164 #define GR_FIND(id, className, classEnum) \ | |
165 reinterpret_cast<className *>(GrDebugGL::getInstance()->findObject(id, class
Enum)) | |
166 | |
167 #endif // GrDebugGL_DEFINED | |
OLD | NEW |