Cache common DrawElements states.
Similar to how we cache the base common draw states. This will improve
DrawElements performance. Several state checks are optimized into a
single 'if' check of a cached value.
Also includes a regression test for mapping the element array buffer.
Bug: angleproject:2966
Change-Id: Ia6e524a58ad6b7df2e455d67733e15d324b1b893
Reviewed-on: https://chromium-review.googlesource.com/c/1357150
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index b24823f..ec13562 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -8191,7 +8191,8 @@
: mCachedHasAnyEnabledClientAttrib(false),
mCachedNonInstancedVertexElementLimit(0),
mCachedInstancedVertexElementLimit(0),
- mCachedBasicDrawStatesError(kInvalidPointer)
+ mCachedBasicDrawStatesError(kInvalidPointer),
+ mCachedBasicDrawElementsError(kInvalidPointer)
{}
StateCache::~StateCache() = default;
@@ -8201,6 +8202,8 @@
updateValidDrawModes(context);
updateValidBindTextureTypes(context);
updateValidDrawElementsTypes(context);
+ updateBasicDrawStatesError();
+ updateBasicDrawElementsError();
}
void StateCache::updateActiveAttribsMask(Context *context)
@@ -8277,6 +8280,11 @@
mCachedBasicDrawStatesError = kInvalidPointer;
}
+void StateCache::updateBasicDrawElementsError()
+{
+ mCachedBasicDrawElementsError = kInvalidPointer;
+}
+
intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
{
ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
@@ -8284,6 +8292,13 @@
return mCachedBasicDrawStatesError;
}
+intptr_t StateCache::getBasicDrawElementsErrorImpl(Context *context) const
+{
+ ASSERT(mCachedBasicDrawElementsError == kInvalidPointer);
+ mCachedBasicDrawElementsError = reinterpret_cast<intptr_t>(ValidateDrawElementsStates(context));
+ return mCachedBasicDrawElementsError;
+}
+
void StateCache::onVertexArrayBindingChange(Context *context)
{
updateActiveAttribsMask(context);
@@ -8320,6 +8335,7 @@
void StateCache::onVertexArrayBufferStateChange(Context *context)
{
updateBasicDrawStatesError();
+ updateBasicDrawElementsError();
}
void StateCache::onGLES1ClientStateChange(Context *context)
@@ -8360,6 +8376,7 @@
void StateCache::onActiveTransformFeedbackChange(Context *context)
{
updateBasicDrawStatesError();
+ updateBasicDrawElementsError();
updateValidDrawModes(context);
}
@@ -8371,6 +8388,7 @@
void StateCache::onBufferBindingChange(Context *context)
{
updateBasicDrawStatesError();
+ updateBasicDrawElementsError();
}
void StateCache::setValidDrawModes(bool pointsOK,