blob: ad6edffdf58a8bc8618af6e41591bd10e67267a4 [file] [log] [blame]
robertphillips@google.comdd743fe2012-04-05 14:40:53 +00001
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
bsalomon@google.comb82c3992013-03-01 15:32:49 +000015class GrBufferObj;
bsalomon@google.comecd84842013-03-01 15:36:02 +000016class GrFakeRefObj;
bsalomon@google.comb82c3992013-03-01 15:32:49 +000017class GrFrameBufferObj;
bsalomon@google.comb82c3992013-03-01 15:32:49 +000018class GrProgramObj;
bsalomon@google.comecd84842013-03-01 15:36:02 +000019class GrRenderBufferObj;
20class GrTextureObj;
21class GrTextureUnitObj;
22class GrVertexArrayObj;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +000023
24////////////////////////////////////////////////////////////////////////////////
25// This is the main debugging object. It is a singleton and keeps track of
26// all the other debug objects.
27class GrDebugGL {
28public:
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,
bsalomon@google.comecd84842013-03-01 15:36:02 +000037 kVertexArray_ObjTypes,
robertphillips@google.comdd743fe2012-04-05 14:40:53 +000038 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
bsalomon@google.comecd84842013-03-01 15:36:02 +000068 void setVertexArray(GrVertexArrayObj* vertexArray);
69 GrVertexArrayObj* getVertexArray() { return fVertexArray; }
70
robertphillips@google.comdd743fe2012-04-05 14:40:53 +000071 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
rmistry@google.comfbfcd562012-08-23 18:09:54 +000081 void setPackRowLength(GrGLint packRowLength) {
82 fPackRowLength = packRowLength;
robertphillips@google.com670ff9a2012-04-12 19:53:31 +000083 }
84 GrGLint getPackRowLength() const { return fPackRowLength; }
85
86 void setUnPackRowLength(GrGLint unPackRowLength) {
87 fUnPackRowLength = unPackRowLength;
88 }
89 GrGLint getUnPackRowLength() const { return fUnPackRowLength; }
90
robertphillips@google.comdd743fe2012-04-05 14:40:53 +000091 static GrDebugGL *getInstance() {
robertphillips@google.com622a1702012-07-31 19:23:02 +000092 // someone should admit to actually using this class
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000093 SkASSERT(0 < gStaticRefCount);
robertphillips@google.comdd743fe2012-04-05 14:40:53 +000094
robertphillips@google.com622a1702012-07-31 19:23:02 +000095 if (NULL == gObj) {
96 gObj = SkNEW(GrDebugGL);
97 }
98
99 return gObj;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000100 }
101
102 void report() const;
103
robertphillips@google.com622a1702012-07-31 19:23:02 +0000104 static void staticRef() {
105 gStaticRefCount++;
106 }
107
108 static void staticUnRef() {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000109 SkASSERT(gStaticRefCount > 0);
robertphillips@google.com622a1702012-07-31 19:23:02 +0000110 gStaticRefCount--;
111 if (0 == gStaticRefCount) {
112 SkDELETE(gObj);
113 gObj = NULL;
114 }
115 }
116
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000117protected:
118
119private:
120 // the OpenGLES 2.0 spec says this must be >= 2
121 static const GrGLint kDefaultMaxTextureUnits = 8;
122
robertphillips@google.com670ff9a2012-04-12 19:53:31 +0000123 GrGLint fPackRowLength;
124 GrGLint fUnPackRowLength;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000125 GrGLuint fCurTextureUnit;
bsalomon@google.comecd84842013-03-01 15:36:02 +0000126 GrBufferObj* fArrayBuffer;
127 GrBufferObj* fElementArrayBuffer;
128 GrFrameBufferObj* fFrameBuffer;
129 GrRenderBufferObj* fRenderBuffer;
130 GrProgramObj* fProgram;
131 GrTextureObj* fTexture;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000132 GrTextureUnitObj *fTextureUnits[kDefaultMaxTextureUnits];
bsalomon@google.comecd84842013-03-01 15:36:02 +0000133 GrVertexArrayObj *fVertexArray;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000134
135 typedef GrFakeRefObj *(*Create)();
136
137 static Create gFactoryFunc[kObjTypeCount];
138
robertphillips@google.com622a1702012-07-31 19:23:02 +0000139 static GrDebugGL* gObj;
140 static int gStaticRefCount;
robertphillips@google.comdd743fe2012-04-05 14:40:53 +0000141
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