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);
}