Revert "Don't allocate VertexArray or TransformFeedback objects until binding."

This reverts commit 070c0124be642383220ca44f795225b89d56f13b.

Change-Id: I4ffa528f63311615bb4e22593c6e8a0ec424cd2d
Reviewed-on: https://chromium-review.googlesource.com/316780
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index c894849..ae7f928 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -144,6 +144,8 @@
         // In the initial state, a default transform feedback object is bound and treated as
         // a transform feedback object with a name of zero. That object is bound any time
         // BindTransformFeedback is called with id of zero
+        mTransformFeedbackZero.set(
+            new TransformFeedback(mRenderer->createTransformFeedback(), 0, mCaps));
         bindTransformFeedback(0);
     }
 
@@ -187,12 +189,10 @@
         SafeDelete(vertexArray.second);
     }
 
+    mTransformFeedbackZero.set(NULL);
     for (auto transformFeedback : mTransformFeedbackMap)
     {
-        if (transformFeedback.second != nullptr)
-        {
-            transformFeedback.second->release();
-        }
+        transformFeedback.second->release();
     }
 
     for (auto &zeroTexture : mZeroTextures)
@@ -324,9 +324,14 @@
 
 GLuint Context::createVertexArray()
 {
-    GLuint vertexArray           = mVertexArrayHandleAllocator.allocate();
-    mVertexArrayMap[vertexArray] = nullptr;
-    return vertexArray;
+    GLuint handle = mVertexArrayHandleAllocator.allocate();
+
+    // 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.
+    VertexArray *vertexArray = new VertexArray(mRenderer, handle, MAX_VERTEX_ATTRIBS);
+    mVertexArrayMap[handle] = vertexArray;
+    return handle;
 }
 
 GLuint Context::createSampler()
@@ -336,9 +341,11 @@
 
 GLuint Context::createTransformFeedback()
 {
-    GLuint transformFeedback                 = mTransformFeedbackAllocator.allocate();
-    mTransformFeedbackMap[transformFeedback] = nullptr;
-    return transformFeedback;
+    GLuint handle = mTransformFeedbackAllocator.allocate();
+    TransformFeedback *transformFeedback = new TransformFeedback(mRenderer->createTransformFeedback(), handle, mCaps);
+    transformFeedback->addRef();
+    mTransformFeedbackMap[handle] = transformFeedback;
+    return handle;
 }
 
 // Returns an unused framebuffer name
@@ -421,18 +428,15 @@
 
 void Context::deleteVertexArray(GLuint vertexArray)
 {
-    auto iter = mVertexArrayMap.find(vertexArray);
-    if (iter != mVertexArrayMap.end())
-    {
-        VertexArray *vertexArrayObject = iter->second;
-        if (vertexArrayObject != nullptr)
-        {
-            detachVertexArray(vertexArray);
-            delete vertexArrayObject;
-        }
+    auto vertexArrayObject = mVertexArrayMap.find(vertexArray);
 
-        mVertexArrayMap.erase(iter);
-        mVertexArrayHandleAllocator.release(vertexArray);
+    if (vertexArrayObject != mVertexArrayMap.end())
+    {
+        detachVertexArray(vertexArray);
+
+        mVertexArrayHandleAllocator.release(vertexArrayObject->first);
+        delete vertexArrayObject->second;
+        mVertexArrayMap.erase(vertexArrayObject);
     }
 }
 
@@ -451,15 +455,10 @@
     auto iter = mTransformFeedbackMap.find(transformFeedback);
     if (iter != mTransformFeedbackMap.end())
     {
-        TransformFeedback *transformFeedbackObject = iter->second;
-        if (transformFeedbackObject != nullptr)
-        {
-            detachTransformFeedback(transformFeedback);
-            transformFeedbackObject->release();
-        }
-
-        mTransformFeedbackMap.erase(iter);
+        detachTransformFeedback(transformFeedback);
         mTransformFeedbackAllocator.release(transformFeedback);
+        iter->second->release();
+        mTransformFeedbackMap.erase(iter);
     }
 }
 
@@ -554,8 +553,15 @@
 
 TransformFeedback *Context::getTransformFeedback(GLuint handle) const
 {
-    auto iter = mTransformFeedbackMap.find(handle);
-    return (iter != mTransformFeedbackMap.end()) ? iter->second : nullptr;
+    if (handle == 0)
+    {
+        return mTransformFeedbackZero.get();
+    }
+    else
+    {
+        TransformFeedbackMap::const_iterator iter = mTransformFeedbackMap.find(handle);
+        return (iter != mTransformFeedbackMap.end()) ? iter->second : NULL;
+    }
 }
 
 bool Context::isSampler(GLuint samplerName) const
@@ -625,7 +631,11 @@
 
 void Context::bindVertexArray(GLuint vertexArray)
 {
-    checkVertexArrayAllocation(vertexArray);
+    if (!getVertexArray(vertexArray))
+    {
+        VertexArray *vertexArrayObject = new VertexArray(mRenderer, vertexArray, MAX_VERTEX_ATTRIBS);
+        mVertexArrayMap[vertexArray] = vertexArrayObject;
+    }
 
     mState.setVertexArrayBinding(getVertexArray(vertexArray));
 }
@@ -701,8 +711,6 @@
 
 void Context::bindTransformFeedback(GLuint transformFeedback)
 {
-    checkTransformFeedbackAllocation(transformFeedback);
-
     mState.setTransformFeedbackBinding(getTransformFeedback(transformFeedback));
 }
 
@@ -1485,37 +1493,6 @@
     }
 }
 
-void Context::checkVertexArrayAllocation(GLuint vertexArray)
-{
-    if (!getVertexArray(vertexArray))
-    {
-        VertexArray *vertexArrayObject =
-            new VertexArray(mRenderer, vertexArray, MAX_VERTEX_ATTRIBS);
-        mVertexArrayMap[vertexArray] = vertexArrayObject;
-    }
-}
-
-void Context::checkTransformFeedbackAllocation(GLuint transformFeedback)
-{
-    if (!getTransformFeedback(transformFeedback))
-    {
-        TransformFeedback *transformFeedbackObject =
-            new TransformFeedback(mRenderer->createTransformFeedback(), transformFeedback, mCaps);
-        transformFeedbackObject->addRef();
-        mTransformFeedbackMap[transformFeedback] = transformFeedbackObject;
-    }
-}
-
-bool Context::isVertexArrayGenerated(GLuint vertexArray)
-{
-    return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
-}
-
-bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
-{
-    return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
-}
-
 void Context::detachTexture(GLuint texture)
 {
     // Simple pass-through to State's detachTexture method, as textures do not require