Commit 86792f44 by Jamie Madill Committed by Commit Bot

Vulkan: Optimize ContextVk::updateDefaultAttributes.

This function was getting called every time because the dirty bit mask included dirty bits for unused program attributes. Fix this by making sure we never have dirty bits set for inactive attributes. Bug: angleproject:2786 Change-Id: Icf72dadd8a853d3a448abb303119b7b71f6c8193 Reviewed-on: https://chromium-review.googlesource.com/1188951Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent a064c27c
...@@ -7746,6 +7746,7 @@ void StateCache::updateActiveAttribsMask(Context *context) ...@@ -7746,6 +7746,7 @@ void StateCache::updateActiveAttribsMask(Context *context)
{ {
mCachedActiveBufferedAttribsMask = AttributesMask(); mCachedActiveBufferedAttribsMask = AttributesMask();
mCachedActiveClientAttribsMask = AttributesMask(); mCachedActiveClientAttribsMask = AttributesMask();
mCachedActiveDefaultAttribsMask = AttributesMask();
return; return;
} }
...@@ -7762,6 +7763,7 @@ void StateCache::updateActiveAttribsMask(Context *context) ...@@ -7762,6 +7763,7 @@ void StateCache::updateActiveAttribsMask(Context *context)
mCachedActiveClientAttribsMask = activeAttribs & clientAttribs; mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs; mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any(); mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
} }
......
...@@ -96,6 +96,7 @@ class StateCache final : angle::NonCopyable ...@@ -96,6 +96,7 @@ class StateCache final : angle::NonCopyable
// 4. onGLES1ClientStateChange. // 4. onGLES1ClientStateChange.
AttributesMask getActiveBufferedAttribsMask() const { return mCachedActiveBufferedAttribsMask; } AttributesMask getActiveBufferedAttribsMask() const { return mCachedActiveBufferedAttribsMask; }
AttributesMask getActiveClientAttribsMask() const { return mCachedActiveClientAttribsMask; } AttributesMask getActiveClientAttribsMask() const { return mCachedActiveClientAttribsMask; }
AttributesMask getActiveDefaultAttribsMask() const { return mCachedActiveDefaultAttribsMask; }
bool hasAnyEnabledClientAttrib() const { return mCachedHasAnyEnabledClientAttrib; } bool hasAnyEnabledClientAttrib() const { return mCachedHasAnyEnabledClientAttrib; }
// Places that can trigger updateVertexElementLimits: // Places that can trigger updateVertexElementLimits:
...@@ -123,6 +124,7 @@ class StateCache final : angle::NonCopyable ...@@ -123,6 +124,7 @@ class StateCache final : angle::NonCopyable
AttributesMask mCachedActiveBufferedAttribsMask; AttributesMask mCachedActiveBufferedAttribsMask;
AttributesMask mCachedActiveClientAttribsMask; AttributesMask mCachedActiveClientAttribsMask;
AttributesMask mCachedActiveDefaultAttribsMask;
bool mCachedHasAnyEnabledClientAttrib; bool mCachedHasAnyEnabledClientAttrib;
GLint64 mCachedNonInstancedVertexElementLimit; GLint64 mCachedNonInstancedVertexElementLimit;
GLint64 mCachedInstancedVertexElementLimit; GLint64 mCachedInstancedVertexElementLimit;
......
...@@ -627,10 +627,7 @@ gl::Error ContextVk::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -627,10 +627,7 @@ gl::Error ContextVk::syncState(const gl::Context *context, const gl::State::Dirt
case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING: case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
{ {
mVertexArrayBindingHasChanged = true; mVertexArrayBindingHasChanged = true;
mDirtyDefaultAttribs = context->getStateCache().getActiveDefaultAttribsMask();
// Note that we should implement faster dirty bits for VAO changes in ES 3.0.
// This might require keeping separate dirty info for the data and state.
mDirtyDefaultAttribs.set();
break; break;
} }
case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING: case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
...@@ -642,7 +639,9 @@ gl::Error ContextVk::syncState(const gl::Context *context, const gl::State::Dirt ...@@ -642,7 +639,9 @@ gl::Error ContextVk::syncState(const gl::Context *context, const gl::State::Dirt
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE: case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
{ {
dirtyTextures = true; dirtyTextures = true;
// No additional work is needed here. We will update the pipeline desc later. // No additional work is needed here. We will update the pipeline desc later.
mDirtyDefaultAttribs = context->getStateCache().getActiveDefaultAttribsMask();
break; break;
} }
case gl::State::DIRTY_BIT_TEXTURE_BINDINGS: case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
...@@ -1011,18 +1010,12 @@ angle::Result ContextVk::updateDefaultAttributes() ...@@ -1011,18 +1010,12 @@ angle::Result ContextVk::updateDefaultAttributes()
{ {
ASSERT(mDirtyDefaultAttribs.any()); ASSERT(mDirtyDefaultAttribs.any());
const gl::Program *program = mState.getState().getProgram(); for (size_t attribIndex : mDirtyDefaultAttribs)
ASSERT(program);
const gl::AttributesMask &programAttribs = program->getActiveAttribLocationsMask();
const gl::AttributesMask &attribsToUpdate = (programAttribs & mDirtyDefaultAttribs);
for (size_t attribIndex : attribsToUpdate)
{ {
ANGLE_TRY(updateDefaultAttribute(attribIndex)) ANGLE_TRY(updateDefaultAttribute(attribIndex))
} }
mDirtyDefaultAttribs &= ~attribsToUpdate; mDirtyDefaultAttribs.reset();
return angle::Result::Continue(); return angle::Result::Continue();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment