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)
{
mCachedActiveBufferedAttribsMask = AttributesMask();
mCachedActiveClientAttribsMask = AttributesMask();
mCachedActiveDefaultAttribsMask = AttributesMask();
return;
}
......@@ -7762,6 +7763,7 @@ void StateCache::updateActiveAttribsMask(Context *context)
mCachedActiveClientAttribsMask = activeAttribs & clientAttribs;
mCachedActiveBufferedAttribsMask = activeAttribs & ~clientAttribs;
mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
}
......
......@@ -96,6 +96,7 @@ class StateCache final : angle::NonCopyable
// 4. onGLES1ClientStateChange.
AttributesMask getActiveBufferedAttribsMask() const { return mCachedActiveBufferedAttribsMask; }
AttributesMask getActiveClientAttribsMask() const { return mCachedActiveClientAttribsMask; }
AttributesMask getActiveDefaultAttribsMask() const { return mCachedActiveDefaultAttribsMask; }
bool hasAnyEnabledClientAttrib() const { return mCachedHasAnyEnabledClientAttrib; }
// Places that can trigger updateVertexElementLimits:
......@@ -123,6 +124,7 @@ class StateCache final : angle::NonCopyable
AttributesMask mCachedActiveBufferedAttribsMask;
AttributesMask mCachedActiveClientAttribsMask;
AttributesMask mCachedActiveDefaultAttribsMask;
bool mCachedHasAnyEnabledClientAttrib;
GLint64 mCachedNonInstancedVertexElementLimit;
GLint64 mCachedInstancedVertexElementLimit;
......
......@@ -627,10 +627,7 @@ gl::Error ContextVk::syncState(const gl::Context *context, const gl::State::Dirt
case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
{
mVertexArrayBindingHasChanged = true;
// 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();
mDirtyDefaultAttribs = context->getStateCache().getActiveDefaultAttribsMask();
break;
}
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
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
{
dirtyTextures = true;
// No additional work is needed here. We will update the pipeline desc later.
mDirtyDefaultAttribs = context->getStateCache().getActiveDefaultAttribsMask();
break;
}
case gl::State::DIRTY_BIT_TEXTURE_BINDINGS:
......@@ -1011,18 +1010,12 @@ angle::Result ContextVk::updateDefaultAttributes()
{
ASSERT(mDirtyDefaultAttribs.any());
const gl::Program *program = mState.getState().getProgram();
ASSERT(program);
const gl::AttributesMask &programAttribs = program->getActiveAttribLocationsMask();
const gl::AttributesMask &attribsToUpdate = (programAttribs & mDirtyDefaultAttribs);
for (size_t attribIndex : attribsToUpdate)
for (size_t attribIndex : mDirtyDefaultAttribs)
{
ANGLE_TRY(updateDefaultAttribute(attribIndex))
}
mDirtyDefaultAttribs &= ~attribsToUpdate;
mDirtyDefaultAttribs.reset();
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