Add GrResource base class for ibs, texs, vbs, etc.
Add lostContext() to GrContext.

Review URL: http://codereview.appspot.com/4328044/



git-svn-id: http://skia.googlecode.com/svn/trunk@1026 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGLVertexBuffer.cpp b/gpu/src/GrGLVertexBuffer.cpp
index f96f90e..3fa1425 100644
--- a/gpu/src/GrGLVertexBuffer.cpp
+++ b/gpu/src/GrGLVertexBuffer.cpp
@@ -18,42 +18,45 @@
 #include "GrGLVertexBuffer.h"
 #include "GrGpuGL.h"
 
-GrGLVertexBuffer::GrGLVertexBuffer(GrGLuint id, GrGpuGL* gl, size_t sizeInBytes,
-                                   bool dynamic) :
-                                   INHERITED(sizeInBytes, dynamic),
-                                   fGL(gl),
-                                   fBufferID(id),
-                                   fLockPtr(NULL) {
+#define GPUGL static_cast<GrGpuGL*>(getGpu())
+
+GrGLVertexBuffer::GrGLVertexBuffer(GrGpuGL* gpu,
+                                   GrGLuint id,
+                                   size_t sizeInBytes,
+                                   bool dynamic)
+    : INHERITED(gpu, sizeInBytes, dynamic)
+    , fBufferID(id)
+    , fLockPtr(NULL) {
 }
 
-GrGLVertexBuffer::~GrGLVertexBuffer() {
+void GrGLVertexBuffer::onRelease() {
     // make sure we've not been abandoned
     if (fBufferID) {
-        fGL->notifyVertexBufferDelete(this);
+        GPUGL->notifyVertexBufferDelete(this);
         GR_GL(DeleteBuffers(1, &fBufferID));
+        fBufferID = 0;
     }
 }
 
+void GrGLVertexBuffer::onAbandon() {
+    fBufferID = 0;
+    fLockPtr = NULL;
+}
+
 void GrGLVertexBuffer::bind() const {
     GR_GL(BindBuffer(GR_GL_ARRAY_BUFFER, fBufferID));
-    fGL->notifyVertexBufferBind(this);
+    GPUGL->notifyVertexBufferBind(this);
 }
 
 GrGLuint GrGLVertexBuffer::bufferID() const {
     return fBufferID;
 }
 
-void GrGLVertexBuffer::abandon() {
-    fBufferID = 0;
-    fGL = NULL;
-    fLockPtr = NULL;
-}
-
 void* GrGLVertexBuffer::lock() {
     GrAssert(fBufferID);
     GrAssert(!isLocked());
-    if (fGL->supportsBufferLocking()) {
-        bind();
+    if (GPUGL->supportsBufferLocking()) {
+        this->bind();
         // Let driver know it can discard the old data
         GR_GL(BufferData(GR_GL_ARRAY_BUFFER, size(), NULL,
                          dynamic() ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW));
@@ -68,21 +71,22 @@
 }
 
 void GrGLVertexBuffer::unlock() {
+
     GrAssert(fBufferID);
     GrAssert(isLocked());
-    GrAssert(fGL->supportsBufferLocking());
+    GrAssert(GPUGL->supportsBufferLocking());
 
-    bind();
+    this->bind();
     GR_GL(UnmapBuffer(GR_GL_ARRAY_BUFFER));
     fLockPtr = NULL;
 }
 
 bool GrGLVertexBuffer::isLocked() const {
-    GrAssert(fBufferID);
+    GrAssert(!this->isValid() || fBufferID);
 #if GR_DEBUG
-    if (fGL->supportsBufferLocking()) {
+    if (this->isValid() && GPUGL->supportsBufferLocking()) {
         GrGLint mapped;
-        bind();
+        this->bind();
         GR_GL(GetBufferParameteriv(GR_GL_ARRAY_BUFFER, GR_GL_BUFFER_MAPPED, &mapped));
         GrAssert(!!mapped == !!fLockPtr);
     }
@@ -96,7 +100,7 @@
     if (srcSizeInBytes > size()) {
         return false;
     }
-    bind();
+    this->bind();
     GrGLenum usage = dynamic() ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW;
     if (size() == srcSizeInBytes) {
         GR_GL(BufferData(GR_GL_ARRAY_BUFFER, srcSizeInBytes, src, usage));
@@ -115,7 +119,7 @@
     if (srcSizeInBytes + offset > size()) {
         return false;
     }
-    bind();
+    this->bind();
     GR_GL(BufferSubData(GR_GL_ARRAY_BUFFER, offset, srcSizeInBytes, src));
     return true;
 }