Home | History | Annotate | Download | only in debug
      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 #include "GrDebugGL.h"
     10 #include "GrTextureObj.h"
     11 #include "GrBufferObj.h"
     12 #include "GrRenderBufferObj.h"
     13 #include "GrFrameBufferObj.h"
     14 #include "GrShaderObj.h"
     15 #include "GrProgramObj.h"
     16 #include "GrTextureUnitObj.h"
     17 #include "GrVertexArrayObj.h"
     18 
     19 GrDebugGL* GrDebugGL::gObj = NULL;
     20 int GrDebugGL::gStaticRefCount = 0;
     21 GrDebugGL::Create GrDebugGL::gFactoryFunc[kObjTypeCount] = {
     22     GrTextureObj::createGrTextureObj,
     23     GrBufferObj::createGrBufferObj,
     24     GrRenderBufferObj::createGrRenderBufferObj,
     25     GrFrameBufferObj::createGrFrameBufferObj,
     26     GrShaderObj::createGrShaderObj,
     27     GrProgramObj::createGrProgramObj,
     28     GrTextureUnitObj::createGrTextureUnitObj,
     29     GrVertexArrayObj::createGrVertexArrayObj,
     30 };
     31 
     32 
     33 GrDebugGL::GrDebugGL()
     34     : fPackRowLength(0)
     35     , fUnPackRowLength(0)
     36     , fCurTextureUnit(0)
     37     , fArrayBuffer(NULL)
     38     , fElementArrayBuffer(NULL)
     39     , fFrameBuffer(NULL)
     40     , fRenderBuffer(NULL)
     41     , fProgram(NULL)
     42     , fTexture(NULL)
     43     , fVertexArray(NULL)
     44     , fAbandoned(false) {
     45 
     46     for (int i = 0; i < kDefaultMaxTextureUnits; ++i) {
     47 
     48         fTextureUnits[i] = reinterpret_cast<GrTextureUnitObj *>(
     49                             createObj(GrDebugGL::kTextureUnit_ObjTypes));
     50         fTextureUnits[i]->ref();
     51 
     52         fTextureUnits[i]->setNumber(i);
     53     }
     54 }
     55 
     56 GrDebugGL::~GrDebugGL() {
     57     // unref & delete the texture units first so they don't show up on the leak report
     58     for (int i = 0; i < kDefaultMaxTextureUnits; ++i) {
     59         fTextureUnits[i]->unref();
     60         fTextureUnits[i]->deleteAction();
     61     }
     62 
     63     this->report();
     64 
     65     for (int i = 0; i < fObjects.count(); ++i) {
     66         delete fObjects[i];
     67     }
     68     fObjects.reset();
     69 
     70     fArrayBuffer = NULL;
     71     fElementArrayBuffer = NULL;
     72     fFrameBuffer = NULL;
     73     fRenderBuffer = NULL;
     74     fProgram = NULL;
     75     fTexture = NULL;
     76     fVertexArray = NULL;
     77 }
     78 
     79 GrFakeRefObj *GrDebugGL::findObject(GrGLuint ID, GrObjTypes type) {
     80     for (int i = 0; i < fObjects.count(); ++i) {
     81         if (fObjects[i]->getID() == ID) { // && fObjects[i]->getType() == type) {
     82             // The application shouldn't be accessing objects
     83             // that (as far as OpenGL knows) were already deleted
     84             GrAlwaysAssert(!fObjects[i]->getDeleted());
     85             GrAlwaysAssert(!fObjects[i]->getMarkedForDeletion());
     86             return fObjects[i];
     87         }
     88     }
     89 
     90     return NULL;
     91 }
     92 
     93 void GrDebugGL::setArrayBuffer(GrBufferObj *arrayBuffer) {
     94     if (fArrayBuffer) {
     95         // automatically break the binding of the old buffer
     96         GrAlwaysAssert(fArrayBuffer->getBound());
     97         fArrayBuffer->resetBound();
     98 
     99         GrAlwaysAssert(!fArrayBuffer->getDeleted());
    100         fArrayBuffer->unref();
    101     }
    102 
    103     fArrayBuffer = arrayBuffer;
    104 
    105     if (fArrayBuffer) {
    106         GrAlwaysAssert(!fArrayBuffer->getDeleted());
    107         fArrayBuffer->ref();
    108 
    109         GrAlwaysAssert(!fArrayBuffer->getBound());
    110         fArrayBuffer->setBound();
    111     }
    112 }
    113 
    114 void GrDebugGL::setVertexArray(GrVertexArrayObj* vertexArray) {
    115     if (vertexArray) {
    116         SkASSERT(!vertexArray->getDeleted());
    117     }
    118     SkRefCnt_SafeAssign(fVertexArray, vertexArray);
    119 }
    120 
    121 void GrDebugGL::setElementArrayBuffer(GrBufferObj *elementArrayBuffer) {
    122     if (fElementArrayBuffer) {
    123         // automatically break the binding of the old buffer
    124         GrAlwaysAssert(fElementArrayBuffer->getBound());
    125         fElementArrayBuffer->resetBound();
    126 
    127         GrAlwaysAssert(!fElementArrayBuffer->getDeleted());
    128         fElementArrayBuffer->unref();
    129     }
    130 
    131     fElementArrayBuffer = elementArrayBuffer;
    132 
    133     if (fElementArrayBuffer) {
    134         GrAlwaysAssert(!fElementArrayBuffer->getDeleted());
    135         fElementArrayBuffer->ref();
    136 
    137         GrAlwaysAssert(!fElementArrayBuffer->getBound());
    138         fElementArrayBuffer->setBound();
    139     }
    140 }
    141 
    142 void GrDebugGL::setTexture(GrTextureObj *texture)  {
    143     fTextureUnits[fCurTextureUnit]->setTexture(texture);
    144 }
    145 
    146 void GrDebugGL::setFrameBuffer(GrFrameBufferObj *frameBuffer)  {
    147     if (fFrameBuffer) {
    148         GrAlwaysAssert(fFrameBuffer->getBound());
    149         fFrameBuffer->resetBound();
    150 
    151         GrAlwaysAssert(!fFrameBuffer->getDeleted());
    152         fFrameBuffer->unref();
    153     }
    154 
    155     fFrameBuffer = frameBuffer;
    156 
    157     if (fFrameBuffer) {
    158         GrAlwaysAssert(!fFrameBuffer->getDeleted());
    159         fFrameBuffer->ref();
    160 
    161         GrAlwaysAssert(!fFrameBuffer->getBound());
    162         fFrameBuffer->setBound();
    163     }
    164 }
    165 
    166 void GrDebugGL::setRenderBuffer(GrRenderBufferObj *renderBuffer)  {
    167     if (fRenderBuffer) {
    168         GrAlwaysAssert(fRenderBuffer->getBound());
    169         fRenderBuffer->resetBound();
    170 
    171         GrAlwaysAssert(!fRenderBuffer->getDeleted());
    172         fRenderBuffer->unref();
    173     }
    174 
    175     fRenderBuffer = renderBuffer;
    176 
    177     if (fRenderBuffer) {
    178         GrAlwaysAssert(!fRenderBuffer->getDeleted());
    179         fRenderBuffer->ref();
    180 
    181         GrAlwaysAssert(!fRenderBuffer->getBound());
    182         fRenderBuffer->setBound();
    183     }
    184 }
    185 
    186 void GrDebugGL::useProgram(GrProgramObj *program) {
    187     if (fProgram) {
    188         GrAlwaysAssert(fProgram->getInUse());
    189         fProgram->resetInUse();
    190 
    191         GrAlwaysAssert(!fProgram->getDeleted());
    192         fProgram->unref();
    193     }
    194 
    195     fProgram = program;
    196 
    197     if (fProgram) {
    198         GrAlwaysAssert(!fProgram->getDeleted());
    199         fProgram->ref();
    200 
    201         GrAlwaysAssert(!fProgram->getInUse());
    202         fProgram->setInUse();
    203     }
    204 }
    205 
    206 void GrDebugGL::report() const {
    207     for (int i = 0; i < fObjects.count(); ++i) {
    208         GrAlwaysAssert(0 < fObjects[i]->getHighRefCount());
    209         if (!fAbandoned) {
    210             GrAlwaysAssert(0 == fObjects[i]->getRefCount());
    211             GrAlwaysAssert(fObjects[i]->getDeleted());
    212         }
    213     }
    214 }
    215