0

[TreesInViz] Pass client BeginFrameArgs with LayerTreeUpdates.

Some cc_unittests expect to be able to draw without a valid BeginFrame,
by using faked BeginFrameArgs for testing. We need to send these
BeginFrameArgs to the LayerContextImpl too, otherwise there can be a race
where LayerContextImpl tries to draw without ever having received valid
BeginFrameArgs.

This fixes running the *RunSingleThread_DelegatingRenderer tests.

Bug: 389147356
Change-Id: I9901c654f1853524797c53fef4110e3cf341eec0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6344045
Auto-Submit: Victor Miura <vmiura@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Commit-Queue: Alex Gough <ajgo@chromium.org>
Reviewed-by: Alex Gough <ajgo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1431700}
This commit is contained in:
Victor Miura
2025-03-12 12:42:11 -07:00
committed by Chromium LUCI CQ
parent 6c54337faa
commit b89544996e
5 changed files with 10 additions and 21 deletions
cc/mojo_embedder
components/viz/service/layers
services/viz/public/mojom/compositing
testing/buildbot/filters

@ -745,6 +745,7 @@ void VizLayerContext::UpdateDisplayTreeFrom(
viz::RasterContextProvider& context_provider) {
auto& property_trees = *tree.property_trees();
auto update = viz::mojom::LayerTreeUpdate::New();
update->begin_frame_args = tree.CurrentBeginFrameArgs();
update->source_frame_number = tree.source_frame_number();
update->trace_id = tree.trace_id().value();
update->device_viewport = tree.GetDeviceViewport();

@ -875,10 +875,8 @@ LayerContextImpl::~LayerContextImpl() {
}
void LayerContextImpl::BeginFrame(const BeginFrameArgs& args) {
// TODO(rockot): Manage these flags properly.
last_begin_frame_args_ = args;
if (base::FeatureList::IsEnabled(features::kTreeAnimationsInViz)) {
// TODO(vmiura): Manage these flags properly.
const bool has_damage = true;
compositor_sink_->SetLayerContextWantsBeginFrames(false);
if (!host_impl_->CanDraw()) {
@ -1226,16 +1224,17 @@ base::expected<void, std::string> LayerContextImpl::DoUpdateDisplayTree(
compositor_sink_->SetLayerContextWantsBeginFrames(true);
} else {
if (host_impl_->CanDraw()) {
host_impl_->WillBeginImplFrame(last_begin_frame_args_);
host_impl_->WillBeginImplFrame(update->begin_frame_args);
cc::LayerTreeHostImpl::FrameData frame;
const bool has_damage = true;
frame.begin_frame_ack = BeginFrameAck(last_begin_frame_args_, has_damage);
frame.origin_begin_main_frame_args = last_begin_frame_args_;
frame.begin_frame_ack =
BeginFrameAck(update->begin_frame_args, has_damage);
frame.origin_begin_main_frame_args = update->begin_frame_args;
host_impl_->PrepareToDraw(&frame);
host_impl_->DrawLayers(&frame);
host_impl_->DidDrawAllLayers(frame);
host_impl_->DidFinishImplFrame(last_begin_frame_args_);
host_impl_->DidFinishImplFrame(update->begin_frame_args);
}
}
return base::ok();

@ -134,8 +134,6 @@ class LayerContextImpl : public cc::LayerTreeHostImplClient,
const std::unique_ptr<cc::RenderingStatsInstrumentation> rendering_stats_;
const std::unique_ptr<cc::LayerTreeHostImpl> host_impl_;
BeginFrameArgs last_begin_frame_args_;
std::vector<TransferableResource> next_frame_resources_;
raw_ptr<cc::LayerTreeFrameSinkClient> frame_sink_client_ = nullptr;

@ -29,6 +29,8 @@ import "ui/gfx/geometry/mojom/geometry.mojom";
// TODO(https://crbug.com/40902503): Split less frequently updated fields out
// into an optional substructure to reduce serialization load.
struct LayerTreeUpdate {
BeginFrameArgs begin_frame_args;
// The main frame commit whose tree is driving this update. Incremented over
// time with each client-side commit.
int32 source_frame_number;

@ -15,6 +15,7 @@
-LayerTreeHostImplViewportCoveredTest.ViewportCoveredScaled
-LayerTreeHostImplTestDrawAndTestDamage.FrameIncludesDamageRect/CommitToActiveTree
-LayerTreeHostImplTestDrawAndTestDamage.FrameIncludesDamageRect/CommitToPendingTree
-LayerTreeHostPictureTestForceRecalculateScales.RunSingleThread_DelegatingRenderer
-LayerTreeTestMaskLayerForSurfaceWithContentRectNotAtOriginWithLayerList.RunSingleThread_DelegatingRenderer
# These tests rely LayerTreeHostImpl to set certain flags in CompositorFrames
@ -61,15 +62,3 @@
# TODO(crbug.com/401568010) Investigate LayerTreeHostImplTest.LayersFreeTextures
-LayerTreeHostImplTest.LayersFreeTextures/CommitToActiveTree
-LayerTreeHostImplTest.LayersFreeTextures/CommitToPendingTree
# TODO(crbug.com/389147356): Implement single-threaded mode, which all of these
# tests operate in.
-LayerTreeHostPictureTestForceRecalculateScales.RunSingleThread_DelegatingRenderer
-LayerTreeHostScrollTestImplScrollUnderMainThreadScrollingParent.RunSingleThread_DelegatingRenderer
-LayerTreeHostScrollTestPropertyTreeUpdate.RunSingleThread_DelegatingRenderer
-LayerTreeHostScrollTestScrollNonDrawnLayer.RunSingleThread_DelegatingRenderer
-LayerTreeHostScrollTestScrollZeroMaxScrollOffset.RunSingleThread_DelegatingRenderer
-LayerTreeHostTestHudLayerWithLayerLists.RunSingleThread_DelegatingRenderer
-LayerTreeHostTestLayerListSurfaceDamage.RunSingleThread_DelegatingRenderer
-LayerTreeTestPageScaleFlags.RunSingleThread_DelegatingRenderer
-NonScrollingMainThreadScrollHitTestRegion.RunSingleThread_DelegatingRenderer