mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-07 06:09:57 +03:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user