/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrDebugGL_DEFINED #define GrDebugGL_DEFINED #include "SkTArray.h" #include "gl/GrGLInterface.h" class GrBufferObj; class GrFakeRefObj; class GrFrameBufferObj; class GrProgramObj; class GrRenderBufferObj; class GrTextureObj; class GrTextureUnitObj; class GrVertexArrayObj; //////////////////////////////////////////////////////////////////////////////// // This is the main debugging object. It is a singleton and keeps track of // all the other debug objects. class GrDebugGL { public: enum GrObjTypes { kTexture_ObjTypes = 0, kBuffer_ObjTypes, kRenderBuffer_ObjTypes, kFrameBuffer_ObjTypes, kShader_ObjTypes, kProgram_ObjTypes, kTextureUnit_ObjTypes, kVertexArray_ObjTypes, kObjTypeCount }; GrFakeRefObj *createObj(GrObjTypes type) { GrFakeRefObj *temp = (*gFactoryFunc[type])(); fObjects.push_back(temp); return temp; } GrFakeRefObj *findObject(GrGLuint ID, GrObjTypes type); GrGLuint getMaxTextureUnits() const { return kDefaultMaxTextureUnits; } void setCurTextureUnit(GrGLuint curTextureUnit) { fCurTextureUnit = curTextureUnit; } GrGLuint getCurTextureUnit() const { return fCurTextureUnit; } GrTextureUnitObj *getTextureUnit(int iUnit) { GrAlwaysAssert(0 <= iUnit && kDefaultMaxTextureUnits > iUnit); return fTextureUnits[iUnit]; } void setArrayBuffer(GrBufferObj *arrayBuffer); GrBufferObj *getArrayBuffer() { return fArrayBuffer; } void setElementArrayBuffer(GrBufferObj *elementArrayBuffer); GrBufferObj *getElementArrayBuffer() { return fElementArrayBuffer; } void setVertexArray(GrVertexArrayObj* vertexArray); GrVertexArrayObj* getVertexArray() { return fVertexArray; } void setTexture(GrTextureObj *texture); void setFrameBuffer(GrFrameBufferObj *frameBuffer); GrFrameBufferObj *getFrameBuffer() { return fFrameBuffer; } void setRenderBuffer(GrRenderBufferObj *renderBuffer); GrRenderBufferObj *getRenderBuffer() { return fRenderBuffer; } void useProgram(GrProgramObj *program); void setPackRowLength(GrGLint packRowLength) { fPackRowLength = packRowLength; } GrGLint getPackRowLength() const { return fPackRowLength; } void setUnPackRowLength(GrGLint unPackRowLength) { fUnPackRowLength = unPackRowLength; } GrGLint getUnPackRowLength() const { return fUnPackRowLength; } static GrDebugGL *getInstance() { // someone should admit to actually using this class SkASSERT(0 < gStaticRefCount); if (nullptr == gObj) { gObj = new GrDebugGL; } return gObj; } void report() const; static void staticRef() { gStaticRefCount++; } static void staticUnRef() { SkASSERT(gStaticRefCount > 0); gStaticRefCount--; if (0 == gStaticRefCount) { delete gObj; gObj = nullptr; } } static void abandon() { SkASSERT(gStaticRefCount > 0); gObj->fAbandoned = true; } protected: private: // the OpenGLES 2.0 spec says this must be >= 2 static const GrGLint kDefaultMaxTextureUnits = 8; GrGLint fPackRowLength; GrGLint fUnPackRowLength; GrGLuint fCurTextureUnit; GrBufferObj* fArrayBuffer; GrBufferObj* fElementArrayBuffer; GrFrameBufferObj* fFrameBuffer; GrRenderBufferObj* fRenderBuffer; GrProgramObj* fProgram; GrTextureObj* fTexture; GrTextureUnitObj *fTextureUnits[kDefaultMaxTextureUnits]; GrVertexArrayObj *fVertexArray; bool fAbandoned; typedef GrFakeRefObj *(*Create)(); static Create gFactoryFunc[kObjTypeCount]; static GrDebugGL* gObj; static int gStaticRefCount; // global store of all objects SkTArray<GrFakeRefObj *> fObjects; GrDebugGL(); ~GrDebugGL(); }; //////////////////////////////////////////////////////////////////////////////// // Helper macro to make creating an object (where you need to get back a derived // type) easier #define GR_CREATE(className, classEnum) \ reinterpret_cast<className *>(GrDebugGL::getInstance()->createObj(classEnum)) //////////////////////////////////////////////////////////////////////////////// // Helper macro to make finding objects less painful #define GR_FIND(id, className, classEnum) \ reinterpret_cast<className *>(GrDebugGL::getInstance()->findObject(id, classEnum)) #endif // GrDebugGL_DEFINED