Optimize ValidateDrawAttribs: Part 3.
This is a small optimization for the WebGL compatibility mode.
Instead of scanning the list of attributes for a Transform feedback
conflict, it can quickly check a cached mask. This should save a lot
of cycles on the fast path.
Bug: angleproject:1391
Change-Id: Icb8d095493a629dbff0e93872357e5bf7c7458ae
Reviewed-on: https://chromium-review.googlesource.com/1011236
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 4227a3e..163f732 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -45,10 +45,10 @@
BufferBinding target)
{
if (binding->get())
- (*binding)->onBindingChanged(false, target);
+ (*binding)->onBindingChanged(context, false, target);
binding->set(context, buffer);
if (binding->get())
- (*binding)->onBindingChanged(true, target);
+ (*binding)->onBindingChanged(context, true, target);
}
void UpdateBufferBinding(const Context *context,
@@ -59,10 +59,10 @@
GLsizeiptr size)
{
if (binding->get())
- (*binding)->onBindingChanged(false, target);
+ (*binding)->onBindingChanged(context, false, target);
binding->set(context, buffer, offset, size);
if (binding->get())
- (*binding)->onBindingChanged(true, target);
+ (*binding)->onBindingChanged(context, true, target);
}
State::State()
@@ -291,7 +291,7 @@
mProgramPipeline.set(context, nullptr);
if (mTransformFeedback.get())
- mTransformFeedback->onBindingChanged(false);
+ mTransformFeedback->onBindingChanged(context, false);
mTransformFeedback.set(context, nullptr);
for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
@@ -1165,15 +1165,15 @@
return false;
}
-void State::setVertexArrayBinding(VertexArray *vertexArray)
+void State::setVertexArrayBinding(const Context *context, VertexArray *vertexArray)
{
if (mVertexArray == vertexArray)
return;
if (mVertexArray)
- mVertexArray->onBindingChanged(false);
+ mVertexArray->onBindingChanged(context, false);
mVertexArray = vertexArray;
if (vertexArray)
- vertexArray->onBindingChanged(true);
+ vertexArray->onBindingChanged(context, true);
mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
if (mVertexArray && mVertexArray->hasAnyDirtyBit())
@@ -1194,11 +1194,11 @@
return mVertexArray;
}
-bool State::removeVertexArrayBinding(GLuint vertexArray)
+bool State::removeVertexArrayBinding(const Context *context, GLuint vertexArray)
{
if (mVertexArray && mVertexArray->id() == vertexArray)
{
- mVertexArray->onBindingChanged(false);
+ mVertexArray->onBindingChanged(context, false);
mVertexArray = nullptr;
mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
@@ -1274,10 +1274,10 @@
if (transformFeedback == mTransformFeedback.get())
return;
if (mTransformFeedback.get())
- mTransformFeedback->onBindingChanged(false);
+ mTransformFeedback->onBindingChanged(context, false);
mTransformFeedback.set(context, transformFeedback);
if (mTransformFeedback.get())
- mTransformFeedback->onBindingChanged(true);
+ mTransformFeedback->onBindingChanged(context, true);
mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
}
@@ -1298,7 +1298,7 @@
if (mTransformFeedback.id() == transformFeedback)
{
if (mTransformFeedback.get())
- mTransformFeedback->onBindingChanged(false);
+ mTransformFeedback->onBindingChanged(context, false);
mTransformFeedback.set(context, nullptr);
return true;
}