Vulkan: Optimize Attribute Change Perf (5/5)

This patch series optimizes programs that use the pattern:

for (;;) {
  glVertexAttribPointer(...)
  glDraw(...)
}

Change 5: Re-check fragment opts on necessary changes.

Check on a program binding change and on a sample coverage enabled
chagne. This likely could be optimized further for program binding
changes.

In total the patch series reduces test iteration time by 25%.

Test: DrawCallPerfBenchmark.Run/vulkan_attrib_change
Bug: angleproject:5045
Bug: b/168493024
Change-Id: I5116f228d5eeef6606136a9a0cc81a4545df9d33
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2409177
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Reviewed-by: Courtney Goeltzenleuchter <courtneygo@google.com>
This commit is contained in:
Jamie Madill
2020-09-13 23:58:42 -04:00
committed by Commit Bot
parent a9dcf0ea8d
commit 57193e8bb7
2 changed files with 7 additions and 4 deletions

View File

@@ -1306,7 +1306,6 @@ angle::Result ContextVk::handleDirtyGraphicsPipeline(const gl::Context *context,
vk::CommandBuffer *commandBuffer)
{
ASSERT(mExecutable);
mExecutable->updateEarlyFragmentTestsOptimization(this);
if (!mCurrentGraphicsPipeline)
{
@@ -2790,7 +2789,8 @@ void ContextVk::invalidateProgramBindingHelper(const gl::State &glState)
angle::Result ContextVk::invalidateProgramExecutableHelper(const gl::Context *context)
{
const gl::State &glState = context->getState();
const gl::State &glState = context->getState();
const gl::ProgramExecutable *executable = glState.getProgramExecutable();
if (glState.getProgramExecutable()->isCompute())
{
@@ -2802,11 +2802,14 @@ angle::Result ContextVk::invalidateProgramExecutableHelper(const gl::Context *co
// later.
invalidateDefaultAttributes(context->getStateCache().getActiveDefaultAttribsMask());
invalidateVertexAndIndexBuffers();
bool useVertexBuffer = (glState.getProgramExecutable()->getMaxActiveAttribLocation() > 0);
bool useVertexBuffer = (executable->getMaxActiveAttribLocation() > 0);
mNonIndexedDirtyBitsMask.set(DIRTY_BIT_VERTEX_BUFFERS, useVertexBuffer);
mIndexedDirtyBitsMask.set(DIRTY_BIT_VERTEX_BUFFERS, useVertexBuffer);
mCurrentGraphicsPipeline = nullptr;
mGraphicsPipelineTransition.reset();
ASSERT(mExecutable);
mExecutable->updateEarlyFragmentTestsOptimization(this);
}
return angle::Result::Continue;

View File

@@ -621,7 +621,7 @@ void ProgramExecutableVk::updateEarlyFragmentTestsOptimization(ContextVk *contex
if (!glState.canEnableEarlyFragmentTestsOptimization())
{
ProgramVk *programVk = getShaderProgram(glState, gl::ShaderType::Fragment);
if (programVk->getState().hasEarlyFragmentTestsOptimization())
if (programVk && programVk->getState().hasEarlyFragmentTestsOptimization())
{
mTransformOptionBits[ProgramTransformOption::RemoveEarlyFragmentTestsOptimization] =
true;