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