Cache bound FBO and VAO objects themselves in State

BUG=angle:685

Change-Id: I19ae6752d1a7490122dd9ca076efb08564e1901d
Reviewed-on: https://chromium-review.googlesource.com/205835
Tested-by: Shannon Woods <shannonwoods@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 5712c52..e410f18 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -698,12 +698,12 @@
 
 GLuint Context::getReadFramebufferHandle() const
 {
-    return mState.readFramebuffer;
+    return mState.readFramebuffer->id();
 }
 
 GLuint Context::getDrawFramebufferHandle() const
 {
-    return mState.drawFramebuffer;
+    return mState.drawFramebuffer->id();
 }
 
 GLuint Context::getRenderbufferHandle() const
@@ -713,7 +713,7 @@
 
 GLuint Context::getVertexArrayHandle() const
 {
-    return mState.vertexArray;
+    return mState.vertexArray->id();
 }
 
 GLuint Context::getSamplerHandle(GLuint textureUnit) const
@@ -871,8 +871,8 @@
     // Although the spec states VAO state is not initialized until the object is bound,
     // we create it immediately. The resulting behaviour is transparent to the application,
     // since it's not currently possible to access the state until the object is bound.
-    mVertexArrayMap[handle] = new VertexArray(mRenderer->createVertexArray(), handle, MAX_VERTEX_ATTRIBS);
-
+    VertexArray *vertexArray = new VertexArray(mRenderer->createVertexArray(), handle, MAX_VERTEX_ATTRIBS);
+    mVertexArrayMap[handle] = vertexArray;
     return handle;
 }
 
@@ -1108,24 +1108,23 @@
 
 Framebuffer *Context::getReadFramebuffer() const
 {
-    return getFramebuffer(mState.readFramebuffer);
+    return mState.readFramebuffer;
 }
 
 Framebuffer *Context::getDrawFramebuffer()
 {
-    return mBoundDrawFramebuffer;
+    return mState.drawFramebuffer;
 }
 
 const Framebuffer *Context::getDrawFramebuffer() const
 {
-    return mBoundDrawFramebuffer;
+    return mState.drawFramebuffer;
 }
 
 VertexArray *Context::getCurrentVertexArray() const
 {
-    VertexArray *vao = getVertexArray(mState.vertexArray);
-    ASSERT(vao != NULL);
-    return vao;
+    ASSERT(mState.vertexArray != NULL);
+    return mState.vertexArray;
 }
 
 TransformFeedback *Context::getCurrentTransformFeedback() const
@@ -1184,22 +1183,20 @@
 {
     if (!getFramebuffer(framebuffer))
     {
-        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer);
+        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer);
     }
 
-    mState.readFramebuffer = framebuffer;
+    mState.readFramebuffer = getFramebuffer(framebuffer);
 }
 
 void Context::bindDrawFramebuffer(GLuint framebuffer)
 {
     if (!getFramebuffer(framebuffer))
     {
-        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer);
+        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer);
     }
 
-    mState.drawFramebuffer = framebuffer;
-
-    mBoundDrawFramebuffer = getFramebuffer(framebuffer);
+    mState.drawFramebuffer = getFramebuffer(framebuffer);
 }
 
 void Context::bindRenderbuffer(GLuint renderbuffer)
@@ -1213,10 +1210,11 @@
 {
     if (!getVertexArray(vertexArray))
     {
-        mVertexArrayMap[vertexArray] = new VertexArray(mRenderer->createVertexArray(), vertexArray, MAX_VERTEX_ATTRIBS);
+        VertexArray *vertexArrayObject = new VertexArray(mRenderer->createVertexArray(), vertexArray, MAX_VERTEX_ATTRIBS);
+        mVertexArrayMap[vertexArray] = vertexArrayObject;
     }
 
-    mState.vertexArray = vertexArray;
+    mState.vertexArray = getVertexArray(vertexArray);
 }
 
 void Context::bindSampler(GLuint textureUnit, GLuint sampler)
@@ -1371,12 +1369,21 @@
 
 void Context::setFramebufferZero(Framebuffer *buffer)
 {
+    // First, check to see if the old default framebuffer
+    // was set for draw or read framebuffer, and change
+    // the bindings to point to the new one before deleting it.
+    if (mState.drawFramebuffer->id() == 0)
+    {
+        mState.drawFramebuffer = buffer;
+    }
+
+    if (mState.readFramebuffer->id() == 0)
+    {
+        mState.readFramebuffer = buffer;
+    }
+
     delete mFramebufferMap[0];
     mFramebufferMap[0] = buffer;
-    if (mState.drawFramebuffer == 0)
-    {
-        mBoundDrawFramebuffer = buffer;
-    }
 }
 
 void Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples)
@@ -1515,11 +1522,11 @@
 
     if (target == GL_READ_FRAMEBUFFER_ANGLE)
     {
-        return mState.readFramebuffer;
+        return mState.readFramebuffer->id();
     }
     else
     {
-        return mState.drawFramebuffer;
+        return mState.drawFramebuffer->id();
     }
 }
 
@@ -1712,10 +1719,10 @@
       case GL_ARRAY_BUFFER_BINDING:                     *params = mState.arrayBuffer.id();                              break;
       case GL_ELEMENT_ARRAY_BUFFER_BINDING:             *params = getCurrentVertexArray()->getElementArrayBufferId();   break;
       //case GL_FRAMEBUFFER_BINDING:                    // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
-      case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:           *params = mState.drawFramebuffer;                               break;
-      case GL_READ_FRAMEBUFFER_BINDING_ANGLE:           *params = mState.readFramebuffer;                               break;
+      case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:           *params = mState.drawFramebuffer->id();                         break;
+      case GL_READ_FRAMEBUFFER_BINDING_ANGLE:           *params = mState.readFramebuffer->id();                         break;
       case GL_RENDERBUFFER_BINDING:                     *params = mState.renderbuffer.id();                             break;
-      case GL_VERTEX_ARRAY_BINDING:                     *params = mState.vertexArray;                                   break;
+      case GL_VERTEX_ARRAY_BINDING:                     *params = mState.vertexArray->id();                             break;
       case GL_CURRENT_PROGRAM:                          *params = mState.currentProgram;                                break;
       case GL_PACK_ALIGNMENT:                           *params = mState.pack.alignment;                                break;
       case GL_PACK_REVERSE_ROW_ORDER_ANGLE:             *params = mState.pack.reverseRowOrder;                          break;
@@ -3209,12 +3216,12 @@
     // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
     // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
 
-    if (mState.readFramebuffer == framebuffer)
+    if (mState.readFramebuffer->id() == framebuffer)
     {
         bindReadFramebuffer(0);
     }
 
-    if (mState.drawFramebuffer == framebuffer)
+    if (mState.drawFramebuffer->id() == framebuffer)
     {
         bindDrawFramebuffer(0);
     }
@@ -3255,7 +3262,7 @@
     // [OpenGL ES 3.0.2] section 2.10 page 43:
     // If a vertex array object that is currently bound is deleted, the binding
     // for that object reverts to zero and the default vertex array becomes current.
-    if (mState.vertexArray == vertexArray)
+    if (mState.vertexArray->id() == vertexArray)
     {
         bindVertexArray(0);
     }