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
15class GrBufferObj;
16class GrFakeRefObj;
17class GrFrameBufferObj;
18class GrProgramObj;
19class GrRenderBufferObj;
20class GrTextureObj;
21class GrTextureUnitObj;
22class GrVertexArrayObj;
23
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,
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    static void abandon() {
118        SkASSERT(gStaticRefCount > 0);
119        gObj->fAbandoned = true;
120    }
121
122protected:
123
124private:
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, classEnum))
166
167#endif // GrDebugGL_DEFINED
168