Hash :
e21ecd1b
Author :
Date :
2023-05-26T14:06:46
Vulkan: Add dirty bit processing for uniform buffer change When app calls glBufferData for the uniform buffer, we may end up reallocate the storage. This will set DIRTY_BIT_UNIFORM_BUFFER_BINDINGS on the context, but the exact uniform block index gets lost along the way. This CL sets mDirtyBits on the program for the corresponding block index and then changed vulkan backend to utilize the program's mDirtyBits and only update the buffer if it is dirty, instead of always update all uniform buffers even if only one of the buffer is dirty. In order to make this work, this CL also adds the reverse tracking from buffer binding to uniform blocks. Previously we already have the tracking of which buffer binding index is used for which buffer block index. This CL adds mUniformBlockBindingMasks which is an array of BitSets. Each array element tracks all the uniform block index that is using this buffer binding index (you can have the same buffer bound to multiple uniform block index). Then when a buffer binding index is dirty, that BitSet gets added into program's uniform block dirty bits. This CL and previous CL improves GfxBench gl_driver2_off score 1.8% (from average 6797 to average 6919) on pixel 7 pro. Bug: b/282194402 Change-Id: Ic5002643a5297907276fc9b20ca7d21af9bdc4fe Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4553136 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Roman Lavrov <romanl@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ProgramPipelineImpl.h: Defines the abstract rx::ProgramPipelineImpl class.
#ifndef LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_
#define LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_
#include "common/angleutils.h"
#include "libANGLE/ProgramPipeline.h"
namespace rx
{
class ContextImpl;
class ProgramPipelineImpl : public angle::NonCopyable
{
public:
ProgramPipelineImpl(const gl::ProgramPipelineState &state) : mState(state) {}
virtual ~ProgramPipelineImpl() {}
virtual void destroy(const gl::Context *context) {}
virtual angle::Result link(const gl::Context *context,
const gl::ProgramMergedVaryings &mergedVaryings,
const gl::ProgramVaryingPacking &varyingPacking);
virtual void onProgramUniformUpdate(gl::ShaderType shaderType) {}
virtual angle::Result onLabelUpdate(const gl::Context *context);
const gl::ProgramPipelineState &getState() const { return mState; }
virtual angle::Result syncState(const gl::Context *context,
const gl::Program::DirtyBits &dirtyBits);
protected:
const gl::ProgramPipelineState &mState;
};
inline angle::Result ProgramPipelineImpl::syncState(const gl::Context *context,
const gl::Program::DirtyBits &dirtyBits)
{
return angle::Result::Continue;
}
} // namespace rx
#endif // LIBANGLE_RENDERER_PROGRAMPIPELINEIMPL_H_