diff --git a/ash/components/fast_ink/fast_ink_view.cc b/ash/components/fast_ink/fast_ink_view.cc index d8845bf0f6f2e4..f66675761af217 100644 --- a/ash/components/fast_ink/fast_ink_view.cc +++ b/ash/components/fast_ink/fast_ink_view.cc @@ -144,10 +144,9 @@ class FastInkView::LayerTreeFrameSinkHolder // Submit an empty frame to ensure that pending release callbacks will be // processed in a finite amount of time. viz::CompositorFrame frame; - frame.metadata.begin_frame_ack.source_id = - viz::BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = - viz::BeginFrameArgs::kStartingFrameNumber; + frame.metadata.begin_frame_ack.frame_id = + viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId, + viz::BeginFrameArgs::kStartingFrameNumber); frame.metadata.begin_frame_ack.has_damage = true; frame.metadata.device_scale_factor = holder->last_frame_device_scale_factor_; diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc index 2a47a379e11460..9fec811e43dede 100644 --- a/cc/metrics/frame_sequence_tracker.cc +++ b/cc/metrics/frame_sequence_tracker.cc @@ -426,7 +426,7 @@ void FrameSequenceTracker::ReportBeginImplFrame( if (termination_status_ != TerminationStatus::kActive) return; - if (ShouldIgnoreBeginFrameSource(args.source_id)) + if (ShouldIgnoreBeginFrameSource(args.frame_id.source_id)) return; #if DCHECK_IS_ON() @@ -434,12 +434,11 @@ void FrameSequenceTracker::ReportBeginImplFrame( is_inside_frame_ = true; if (args.type == viz::BeginFrameArgs::NORMAL) - impl_frames_.insert(std::make_pair(args.source_id, args.sequence_number)); + impl_frames_.insert(args.frame_id); #endif - - TRACKER_TRACE_STREAM << "b(" << args.sequence_number << ")"; - UpdateTrackedFrameData(&begin_impl_frame_data_, args.source_id, - args.sequence_number); + TRACKER_TRACE_STREAM << "b(" << args.frame_id.sequence_number << ")"; + UpdateTrackedFrameData(&begin_impl_frame_data_, args.frame_id.source_id, + args.frame_id.sequence_number); impl_throughput().frames_expected += begin_impl_frame_data_.previous_sequence_delta; @@ -452,28 +451,26 @@ void FrameSequenceTracker::ReportBeginMainFrame( if (termination_status_ != TerminationStatus::kActive) return; - if (ShouldIgnoreBeginFrameSource(args.source_id)) + if (ShouldIgnoreBeginFrameSource(args.frame_id.source_id)) return; - if (ShouldIgnoreSequence(args.sequence_number)) + if (ShouldIgnoreSequence(args.frame_id.sequence_number)) return; #if DCHECK_IS_ON() if (args.type == viz::BeginFrameArgs::NORMAL) { - DCHECK(impl_frames_.contains( - std::make_pair(args.source_id, args.sequence_number))); + DCHECK(impl_frames_.contains(args.frame_id)); } #endif TRACKER_TRACE_STREAM << 'B'; TRACKER_TRACE_STREAM << "(" << begin_main_frame_data_.previous_sequence << "," - << args.sequence_number << ")"; - UpdateTrackedFrameData(&begin_main_frame_data_, args.source_id, - args.sequence_number); + << args.frame_id.sequence_number << ")"; + UpdateTrackedFrameData(&begin_main_frame_data_, args.frame_id.source_id, + args.frame_id.sequence_number); if (!first_received_main_sequence_ || - first_received_main_sequence_ <= last_no_main_damage_sequence_) { - first_received_main_sequence_ = args.sequence_number; - } + first_received_main_sequence_ <= last_no_main_damage_sequence_) + first_received_main_sequence_ = args.frame_id.sequence_number; main_throughput().frames_expected += begin_main_frame_data_.previous_sequence_delta; } @@ -484,8 +481,8 @@ void FrameSequenceTracker::ReportSubmitFrame( const viz::BeginFrameAck& ack, const viz::BeginFrameArgs& origin_args) { if (termination_status_ != TerminationStatus::kActive || - ShouldIgnoreBeginFrameSource(ack.source_id) || - ShouldIgnoreSequence(ack.sequence_number)) { + ShouldIgnoreBeginFrameSource(ack.frame_id.source_id) || + ShouldIgnoreSequence(ack.frame_id.sequence_number)) { ignored_frame_tokens_.insert(frame_token); return; } @@ -500,20 +497,20 @@ void FrameSequenceTracker::ReportSubmitFrame( TRACKER_TRACE_STREAM << 's'; const bool main_changes_after_sequence_started = first_received_main_sequence_ && - origin_args.sequence_number >= first_received_main_sequence_; + origin_args.frame_id.sequence_number >= first_received_main_sequence_; const bool main_changes_include_new_changes = last_submitted_main_sequence_ == 0 || - origin_args.sequence_number > last_submitted_main_sequence_; + origin_args.frame_id.sequence_number > last_submitted_main_sequence_; const bool main_change_had_no_damage = last_no_main_damage_sequence_ != 0 && - origin_args.sequence_number == last_no_main_damage_sequence_; + origin_args.frame_id.sequence_number == last_no_main_damage_sequence_; - if (!ShouldIgnoreBeginFrameSource(origin_args.source_id) && + if (!ShouldIgnoreBeginFrameSource(origin_args.frame_id.source_id) && main_changes_after_sequence_started && main_changes_include_new_changes && !main_change_had_no_damage) { TRACKER_TRACE_STREAM << 'S'; - last_submitted_main_sequence_ = origin_args.sequence_number; + last_submitted_main_sequence_ = origin_args.frame_id.sequence_number; main_frames_.push_back(frame_token); DCHECK_GE(main_throughput().frames_expected, main_frames_.size()) << TRACKER_DCHECK_MSG; @@ -529,15 +526,15 @@ void FrameSequenceTracker::ReportFrameEnd(const viz::BeginFrameArgs& args) { if (termination_status_ != TerminationStatus::kActive) return; - if (ShouldIgnoreBeginFrameSource(args.source_id)) + if (ShouldIgnoreBeginFrameSource(args.frame_id.source_id)) return; - if (ShouldIgnoreSequence(args.sequence_number)) { + if (ShouldIgnoreSequence(args.frame_id.sequence_number)) { is_inside_frame_ = false; return; } - TRACKER_TRACE_STREAM << "e(" << args.sequence_number << ")"; + TRACKER_TRACE_STREAM << "e(" << args.frame_id.sequence_number << ")"; DCHECK(is_inside_frame_) << TRACKER_DCHECK_MSG; is_inside_frame_ = false; #endif @@ -635,12 +632,12 @@ void FrameSequenceTracker::ReportImplFrameCausedNoDamage( if (termination_status_ != TerminationStatus::kActive) return; - if (ShouldIgnoreBeginFrameSource(ack.source_id)) + if (ShouldIgnoreBeginFrameSource(ack.frame_id.source_id)) return; // It is possible that this is called before a begin-impl-frame has been // dispatched for this frame-sequence. In such cases, ignore this call. - if (ShouldIgnoreSequence(ack.sequence_number)) + if (ShouldIgnoreSequence(ack.frame_id.sequence_number)) return; TRACKER_TRACE_STREAM << 'n'; @@ -650,7 +647,7 @@ void FrameSequenceTracker::ReportImplFrameCausedNoDamage( << TRACKER_DCHECK_MSG; --impl_throughput().frames_expected; - if (begin_impl_frame_data_.previous_sequence == ack.sequence_number) + if (begin_impl_frame_data_.previous_sequence == ack.frame_id.sequence_number) begin_impl_frame_data_.previous_sequence = 0; } @@ -659,25 +656,25 @@ void FrameSequenceTracker::ReportMainFrameCausedNoDamage( if (termination_status_ != TerminationStatus::kActive) return; - if (ShouldIgnoreBeginFrameSource(args.source_id)) + if (ShouldIgnoreBeginFrameSource(args.frame_id.source_id)) return; - if (ShouldIgnoreSequence(args.sequence_number)) + if (ShouldIgnoreSequence(args.frame_id.sequence_number)) return; TRACKER_TRACE_STREAM << 'N'; TRACKER_TRACE_STREAM << "(" << begin_main_frame_data_.previous_sequence << "," - << args.sequence_number << ")"; + << args.frame_id.sequence_number << ")"; DCHECK_GT(main_throughput().frames_expected, 0u) << TRACKER_DCHECK_MSG; DCHECK_GT(main_throughput().frames_expected, main_throughput().frames_produced) << TRACKER_DCHECK_MSG; - last_no_main_damage_sequence_ = args.sequence_number; + last_no_main_damage_sequence_ = args.frame_id.sequence_number; --main_throughput().frames_expected; DCHECK_GE(main_throughput().frames_expected, main_frames_.size()) << TRACKER_DCHECK_MSG; - if (begin_main_frame_data_.previous_sequence == args.sequence_number) + if (begin_main_frame_data_.previous_sequence == args.frame_id.sequence_number) begin_main_frame_data_.previous_sequence = 0; } diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h index 976e389242c938..7e7aa3e6eb1499 100644 --- a/cc/metrics/frame_sequence_tracker.h +++ b/cc/metrics/frame_sequence_tracker.h @@ -27,6 +27,7 @@ struct PresentationFeedback; namespace viz { struct BeginFrameAck; struct BeginFrameArgs; +struct BeginFrameId; } // namespace viz namespace cc { @@ -395,7 +396,7 @@ class CC_EXPORT FrameSequenceTracker { // If ReportBeginImplFrame is never called on a arg, then ReportBeginMainFrame // should ignore that arg. - base::flat_set> impl_frames_; + base::flat_set impl_frames_; #endif }; diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.cc b/cc/mojo_embedder/async_layer_tree_frame_sink.cc index 401958e0bcb759..a4d9f97ba9cdf8 100644 --- a/cc/mojo_embedder/async_layer_tree_frame_sink.cc +++ b/cc/mojo_embedder/async_layer_tree_frame_sink.cc @@ -160,8 +160,7 @@ void AsyncLayerTreeFrameSink::SubmitCompositorFrame( DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(compositor_frame_sink_ptr_); DCHECK(frame.metadata.begin_frame_ack.has_damage); - DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, - frame.metadata.begin_frame_ack.sequence_number); + DCHECK(frame.metadata.begin_frame_ack.frame_id.IsSequenceValid()); // It's possible to request an immediate composite from cc which will bypass // BeginFrame. In that case, we cannot collect full graphics pipeline data. @@ -247,7 +246,7 @@ void AsyncLayerTreeFrameSink::DidNotProduceFrame( const viz::BeginFrameAck& ack) { DCHECK(compositor_frame_sink_ptr_); DCHECK(!ack.has_damage); - DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); + DCHECK(ack.frame_id.IsSequenceValid()); // TODO(yiyix): Remove duplicated calls of DidNotProduceFrame from the same // BeginFrames. https://crbug.com/881949 diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index 494df8b07e35b4..2bbadb67b283e3 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc @@ -595,8 +595,7 @@ void Scheduler::FinishImplFrame() { void Scheduler::SendDidNotProduceFrame(const viz::BeginFrameArgs& args, FrameSkippedReason reason) { - if (last_begin_frame_ack_.source_id == args.source_id && - last_begin_frame_ack_.sequence_number == args.sequence_number) + if (last_begin_frame_ack_.frame_id == args.frame_id) return; last_begin_frame_ack_ = viz::BeginFrameAck(args, false /* has_damage */); client_->DidNotProduceFrame(last_begin_frame_ack_, reason); @@ -617,8 +616,7 @@ void Scheduler::BeginImplFrame(const viz::BeginFrameArgs& args, base::AutoReset mark_inside(&inside_scheduled_action_, true); begin_impl_frame_tracker_.Start(args); - state_machine_.OnBeginImplFrame(args.source_id, args.sequence_number, - args.animate_only); + state_machine_.OnBeginImplFrame(args.frame_id, args.animate_only); devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); compositor_timing_history_->WillBeginImplFrame( args, state_machine_.NewActiveTreeLikely(), now); diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 042772481bd4d1..687b49749c9b7b 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -1133,8 +1133,7 @@ bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { return false; } -void SchedulerStateMachine::OnBeginImplFrame(uint64_t source_id, - uint64_t sequence_number, +void SchedulerStateMachine::OnBeginImplFrame(const viz::BeginFrameId& frame_id, bool animate_only) { begin_impl_frame_state_ = BeginImplFrameState::INSIDE_BEGIN_FRAME; current_frame_number_++; diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h index 0ba35b5b044f9e..25b6b5f8ed6f1e 100644 --- a/cc/scheduler/scheduler_state_machine.h +++ b/cc/scheduler/scheduler_state_machine.h @@ -172,9 +172,7 @@ class CC_EXPORT SchedulerStateMachine { // Indicates that the system has entered and left a BeginImplFrame callback. // The scheduler will not draw more than once in a given BeginImplFrame // callback nor send more than one BeginMainFrame message. - void OnBeginImplFrame(uint64_t source_id, - uint64_t sequence_number, - bool animate_only); + void OnBeginImplFrame(const viz::BeginFrameId& frame_id, bool animate_only); // Indicates that the scheduler has entered the draw phase. The scheduler // will not draw more than once in a single draw phase. // TODO(sunnyps): Rename OnBeginImplFrameDeadline to OnDraw or similar. diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index ec84d72a39814e..13fc6d4669aeb0 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc @@ -150,7 +150,8 @@ class StateMachine : public SchedulerStateMachine { } void IssueNextBeginImplFrame() { - OnBeginImplFrame(0, next_begin_frame_number_++, kAnimateOnly); + OnBeginImplFrame(viz::BeginFrameId(0, next_begin_frame_number_++), + kAnimateOnly); } void SetBeginMainFrameState(BeginMainFrameState cs) { @@ -1129,9 +1130,9 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { // Start clean and set commit. state.SetNeedsBeginMainFrame(); - + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); // Make a main frame, commit and activate it. But don't draw it. - state.OnBeginImplFrame(0, 10, kAnimateOnly); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); @@ -1142,7 +1143,8 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) { // Try to make a new main frame before drawing, but since we would clobber the // active tree, we will not do so. state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 11, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); } @@ -1209,7 +1211,8 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { state.SetNeedsBeginMainFrame(); // Begin the frame. - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BeginMainFrameState::SENT); @@ -1235,7 +1238,8 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { // Can't BeginMainFrame yet since last commit hasn't been drawn yet. state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 11, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); // Now call ready to draw which will allow the draw to happen and @@ -1248,7 +1252,8 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); // Can't BeginMainFrame yet since we're submit-frame throttled. - state.OnBeginImplFrame(0, 12, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); // CompositorFrameAck unblocks BeginMainFrame. @@ -1269,7 +1274,8 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) { // When commits are deferred, we don't block the deadline. state.SetDeferBeginMainFrame(true); - state.OnBeginImplFrame(0, 13, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_NE(SchedulerStateMachine::BeginImplFrameDeadlineMode::BLOCKED, state.CurrentBeginImplFrameDeadlineMode()); } @@ -1650,7 +1656,8 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { // Set damage and expect a draw. state.SetNeedsRedraw(true); - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); @@ -1684,7 +1691,8 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { EXPECT_ACTION( SchedulerStateMachine::Action::BEGIN_LAYER_TREE_FRAME_SINK_CREATION); - state.OnBeginImplFrame(0, 11, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_IMPL_FRAME_STATE( SchedulerStateMachine::BeginImplFrameState::INSIDE_BEGIN_FRAME); EXPECT_ACTION(SchedulerStateMachine::Action::NONE); @@ -2597,7 +2605,8 @@ TEST(SchedulerStateMachineTest, TestFullPipelineMode) { state.SetCanDraw(false); // Begin the frame. - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_EQ(SchedulerStateMachine::BeginImplFrameDeadlineMode::BLOCKED, state.CurrentBeginImplFrameDeadlineMode()); @@ -2670,7 +2679,8 @@ TEST(SchedulerStateMachineTest, TestFullPipelineMode) { // Redraw should happen immediately since there is no pending tree and active // tree is ready to draw. - state.OnBeginImplFrame(0, 11, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); EXPECT_EQ(SchedulerStateMachine::BeginImplFrameDeadlineMode::IMMEDIATE, state.CurrentBeginImplFrameDeadlineMode()); @@ -2690,7 +2700,8 @@ TEST(SchedulerStateMachineTest, TestFullPipelineMode) { state.SetNeedsRedraw(true); state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 12, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::NONE); @@ -2723,7 +2734,8 @@ TEST(SchedulerStateMachineTest, AllowSkippingActiveTreeFirstDraws) { // drawn in this frame. bool needs_first_draw_on_activation = false; state.SetNeedsImplSideInvalidation(needs_first_draw_on_activation); - state.OnBeginImplFrame(0, 1, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 1); + state.OnBeginImplFrame(frame_id, kAnimateOnly); state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::PERFORM_IMPL_SIDE_INVALIDATION); @@ -2733,7 +2745,8 @@ TEST(SchedulerStateMachineTest, AllowSkippingActiveTreeFirstDraws) { // Now we have a main frame. state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 2, kAnimateOnly); + frame_id.sequence_number++; + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); @@ -2752,7 +2765,8 @@ TEST(SchedulerStateMachineTest, DelayDrawIfAnimationWorkletsPending) { // This test verifies that having pending mutations from Animation Worklets on // the active tree will not trigger the deadline early. state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); @@ -2816,7 +2830,8 @@ TEST(SchedulerStateMachineTest, BlockActivationIfAnimationWorkletsPending) { // Verify that pending mutations from Animation Worklets block activation. state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); @@ -2838,7 +2853,8 @@ TEST(SchedulerStateMachineTest, BlockActivationIfPaintWorkletsPending) { SET_UP_STATE(state); state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); @@ -2865,7 +2881,8 @@ TEST(SchedulerStateMachineTest, SET_UP_STATE(state); state.SetNeedsBeginMainFrame(); - state.OnBeginImplFrame(0, 10, kAnimateOnly); + viz::BeginFrameId frame_id = viz::BeginFrameId(0, 10); + state.OnBeginImplFrame(frame_id, kAnimateOnly); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); state.NotifyReadyToCommit(); diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index 5d3abf03e4a656..0318035a791dfe 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc @@ -4252,8 +4252,8 @@ TEST_F(SchedulerTest, SendEarlyDidNotProduceFrameIfIdle) { EXPECT_SCOPED(AdvanceFrame()); EXPECT_ACTIONS("WillBeginImplFrame", "ScheduledActionSendBeginMainFrame"); auto begin_main_frame_args = client_->last_begin_main_frame_args(); - EXPECT_NE(client_->last_begin_frame_ack().sequence_number, - begin_main_frame_args.sequence_number); + EXPECT_NE(client_->last_begin_frame_ack().frame_id.sequence_number, + begin_main_frame_args.frame_id.sequence_number); client_->Reset(); scheduler_->NotifyBeginMainFrameStarted(task_runner_->NowTicks()); @@ -4261,8 +4261,8 @@ TEST_F(SchedulerTest, SendEarlyDidNotProduceFrameIfIdle) { // seen in certain OOPIF renderers. scheduler_->SetNeedsBeginMainFrame(); scheduler_->BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); - EXPECT_EQ(client_->last_begin_frame_ack().sequence_number, - begin_main_frame_args.sequence_number); + EXPECT_EQ(client_->last_begin_frame_ack().frame_id.sequence_number, + begin_main_frame_args.frame_id.sequence_number); } } // namespace diff --git a/cc/test/test_layer_tree_frame_sink.cc b/cc/test/test_layer_tree_frame_sink.cc index ea34d4cc26b42c..f2079772a51b62 100644 --- a/cc/test/test_layer_tree_frame_sink.cc +++ b/cc/test/test_layer_tree_frame_sink.cc @@ -159,8 +159,7 @@ void TestLayerTreeFrameSink::SubmitCompositorFrame(viz::CompositorFrame frame, bool hit_test_data_changed, bool show_hit_test_borders) { DCHECK(frame.metadata.begin_frame_ack.has_damage); - DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, - frame.metadata.begin_frame_ack.sequence_number); + DCHECK(frame.metadata.begin_frame_ack.frame_id.IsSequenceValid()); test_client_->DisplayReceivedCompositorFrame(frame); gfx::Size frame_size = frame.size_in_pixels(); @@ -196,7 +195,7 @@ void TestLayerTreeFrameSink::SubmitCompositorFrame(viz::CompositorFrame frame, void TestLayerTreeFrameSink::DidNotProduceFrame(const viz::BeginFrameAck& ack) { DCHECK(!ack.has_damage); - DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); + DCHECK(ack.frame_id.IsSequenceValid()); support_->DidNotProduceFrame(ack); } diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index a8352b83ddcf99..4c0130537ccccf 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -2299,8 +2299,7 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { // check in that case. const auto& bfargs = current_begin_frame_tracker_.Current(); const auto& ack = compositor_frame.metadata.begin_frame_ack; - DCHECK_EQ(bfargs.source_id, ack.source_id); - DCHECK_EQ(bfargs.sequence_number, ack.sequence_number); + DCHECK_EQ(bfargs.frame_id, ack.frame_id); } #endif @@ -2457,8 +2456,7 @@ viz::CompositorFrame LayerTreeHostImpl::GenerateCompositorFrame( } } - DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, - frame->begin_frame_ack.sequence_number); + DCHECK(frame->begin_frame_ack.frame_id.IsSequenceValid()); metadata.begin_frame_ack = frame->begin_frame_ack; viz::CompositorFrame compositor_frame; @@ -2743,8 +2741,7 @@ void LayerTreeHostImpl::DidNotProduceFrame(const viz::BeginFrameAck& ack, // Notify the trackers only when this is *not* the case (since the trackers // are not notified about the start of the future frame either). const auto& args = current_begin_frame_tracker_.Current(); - if (args.source_id == ack.source_id && - args.sequence_number == ack.sequence_number) { + if (args.frame_id == ack.frame_id) { frame_trackers_.NotifyImplFrameCausedNoDamage(ack); if (begin_main_frame_sent_during_impl_) frame_trackers_.NotifyMainFrameCausedNoDamage(args); diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 594bdde8c0b6d6..1643de67635394 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -3175,7 +3175,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3185,7 +3185,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3196,7 +3196,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_next_frame_ = false; did_request_commit_ = false; begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_commit_); @@ -3230,7 +3230,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_request_redraw_); @@ -3240,7 +3240,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_request_redraw_); @@ -3251,7 +3251,7 @@ TEST_F(LayerTreeHostImplTest, PinchZoomTriggersPageScaleAnimation) { did_request_next_frame_ = false; did_request_commit_ = false; begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_request_commit_); @@ -3304,7 +3304,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3314,7 +3314,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3325,7 +3325,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { did_request_next_frame_ = false; did_request_commit_ = false; begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_commit_); @@ -3365,7 +3365,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3376,7 +3376,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { did_request_commit_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3425,20 +3425,20 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationNoOp) { new PendingPageScaleAnimation(gfx::Vector2d(), true, 1, duration))); host_impl_->ActivateSyncTree(); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->DidFinishImplFrame(); begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); host_impl_->DidFinishImplFrame(); begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_commit_); @@ -3503,7 +3503,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { std::unique_ptr(new PendingPageScaleAnimation( gfx::Vector2d(), false, target_scale, duration))); begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_request_next_frame_); @@ -3527,7 +3527,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3537,7 +3537,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = third_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3550,7 +3550,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { did_request_redraw_ = false; did_request_next_frame_ = false; begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_redraw_); @@ -3561,7 +3561,7 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { did_request_next_frame_ = false; did_request_commit_ = false; begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_request_commit_); @@ -3603,21 +3603,21 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationCompletedNotification) { new PendingPageScaleAnimation(gfx::Vector2d(), false, 2, duration))); host_impl_->ActivateSyncTree(); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_complete_page_scale_animation_); host_impl_->DidFinishImplFrame(); begin_frame_args.frame_time = halfway_through_animation; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_FALSE(did_complete_page_scale_animation_); host_impl_->DidFinishImplFrame(); begin_frame_args.frame_time = end_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_TRUE(did_complete_page_scale_animation_); @@ -6158,7 +6158,7 @@ TEST_F(LayerTreeHostImplBrowserControlsTest, // the animation. { begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6172,7 +6172,7 @@ TEST_F(LayerTreeHostImplBrowserControlsTest, { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(50); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6199,7 +6199,7 @@ TEST_F(LayerTreeHostImplBrowserControlsTest, { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6613,7 +6613,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedLatchToChild) { host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, -100)).thread); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6624,7 +6624,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedLatchToChild) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6642,7 +6642,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedLatchToChild) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -6650,7 +6650,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedLatchToChild) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(450); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -10215,7 +10215,7 @@ TEST_F(LayerTreeHostImplWithBrowserControlsTest, host_impl_->browser_controls_manager()->ControlsTopOffset(); begin_frame_args.frame_time += base::TimeDelta::FromMilliseconds(5); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); EXPECT_EQ(gfx::Vector2dF().ToString(), @@ -10301,7 +10301,7 @@ TEST_F(LayerTreeHostImplWithBrowserControlsTest, host_impl_->browser_controls_manager()->ControlsTopOffset(); begin_frame_args.frame_time += base::TimeDelta::FromMilliseconds(5); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); @@ -11001,7 +11001,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimated) { host_impl_->CurrentlyScrollingNode()->id); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11011,7 +11011,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(50); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11041,7 +11041,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11054,7 +11054,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11112,7 +11112,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimatedWhileZoomed) { // Tick a frame to get the animation started. { begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11126,7 +11126,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimatedWhileZoomed) { { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(1000); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11180,7 +11180,7 @@ TEST_F(LayerTreeHostImplTest, SingleGSUForScrollbarThumbDragPerFrame) { viz::BeginFrameArgs begin_frame_args = viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); // MouseDown on the thumb should not produce a scroll. @@ -11205,7 +11205,7 @@ TEST_F(LayerTreeHostImplTest, SingleGSUForScrollbarThumbDragPerFrame) { // ------------------------- Start frame 1 ------------------------- begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); // MouseMove for a new frame gets processed as usual. @@ -11255,7 +11255,7 @@ TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) { viz::BeginFrameArgs begin_frame_args = viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); host_impl_->DidFinishImplFrame(); @@ -11272,7 +11272,7 @@ TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; // This is when the animation above gets promoted to STARTING. host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); @@ -11280,7 +11280,7 @@ TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(300); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; // This is when the animation above gets ticked. host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); @@ -11320,7 +11320,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimatedWithDelay) { // First tick, animation is started. begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); EXPECT_NE(gfx::ScrollOffset(), scrolling_layer->CurrentScrollOffset()); @@ -11332,7 +11332,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimatedWithDelay) { base::TimeTicks half_way_time = start_time - begin_frame_args.interval + base::TimeDelta::FromMilliseconds(50); begin_frame_args.frame_time = half_way_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); EXPECT_EQ(50, scrolling_layer->CurrentScrollOffset().y()); @@ -11349,7 +11349,7 @@ TEST_F(LayerTreeHostImplTest, ScrollAnimatedWithDelay) { // target was called with a large value of jank. begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(100); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->UpdateAnimationState(true); EXPECT_LT(100, scrolling_layer->CurrentScrollOffset().y()); @@ -11380,7 +11380,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedAborted) { host_impl_->CurrentlyScrollingNode()->id); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11393,7 +11393,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedAborted) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(50); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11449,7 +11449,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimated) { host_impl_->CurrentlyScrollingNode()->id); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11459,7 +11459,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(50); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11475,7 +11475,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11488,7 +11488,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimated) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11531,7 +11531,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimated) { EXPECT_EQ(inner_scroll_layer->scroll_tree_index(), host_impl_->CurrentlyScrollingNode()->id); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate(begin_frame_args, start_time); EXPECT_VECTOR_EQ(gfx::Vector2dF(5, 10), inner_scroll_layer->CurrentScrollOffset()); @@ -11549,7 +11549,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimated) { EXPECT_EQ(inner_scroll_layer->scroll_tree_index(), host_impl_->CurrentlyScrollingNode()->id); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate(begin_frame_args, start_time + base::TimeDelta::FromMilliseconds(350)); EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 50), @@ -11567,7 +11567,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimated) { EXPECT_EQ(outer_scroll_layer->scroll_tree_index(), host_impl_->CurrentlyScrollingNode()->id); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate(begin_frame_args, start_time + base::TimeDelta::FromMilliseconds(850)); EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 50), @@ -11585,7 +11585,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimated) { EXPECT_EQ(inner_scroll_layer->scroll_tree_index(), host_impl_->CurrentlyScrollingNode()->id); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate( begin_frame_args, start_time + base::TimeDelta::FromMilliseconds(1200)); EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 0), @@ -11624,7 +11624,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimatedUpdate) { EXPECT_EQ(inner_scroll_layer->scroll_tree_index(), host_impl_->CurrentlyScrollingNode()->id); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate(begin_frame_args, start_time); float inner_x = inner_scroll_layer->CurrentScrollOffset().x(); float inner_y = inner_scroll_layer->CurrentScrollOffset().y(); @@ -11644,7 +11644,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ImplPinchZoomScrollAnimatedUpdate) { // Verify that all the delta is applied to the inner viewport and nothing is // carried forward. - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; BeginImplFrameAndAnimate(begin_frame_args, start_time + base::TimeDelta::FromMilliseconds(350)); EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 50), @@ -11681,7 +11681,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedNotUserScrollable) { host_impl_->CurrentlyScrollingNode()->id); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11691,7 +11691,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedNotUserScrollable) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(50); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11709,7 +11709,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedNotUserScrollable) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11722,7 +11722,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedNotUserScrollable) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(250); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11756,7 +11756,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedChangingBounds) { host_impl_->CurrentlyScrollingNode()->id); begin_frame_args.frame_time = start_time; - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); @@ -11768,7 +11768,7 @@ TEST_F(LayerTreeHostImplTimelinesTest, ScrollAnimatedChangingBounds) { begin_frame_args.frame_time = start_time + base::TimeDelta::FromMilliseconds(200); - begin_frame_args.sequence_number++; + begin_frame_args.frame_id.sequence_number++; host_impl_->WillBeginImplFrame(begin_frame_args); host_impl_->Animate(); host_impl_->UpdateAnimationState(true); diff --git a/chromecast/graphics/cast_external_begin_frame_source.cc b/chromecast/graphics/cast_external_begin_frame_source.cc index f38ecccf60d460..72400c40fc775b 100644 --- a/chromecast/graphics/cast_external_begin_frame_source.cc +++ b/chromecast/graphics/cast_external_begin_frame_source.cc @@ -27,7 +27,7 @@ CastExternalBeginFrameSource::~CastExternalBeginFrameSource() {} void CastExternalBeginFrameSource::OnFrameComplete( const viz::BeginFrameAck& ack) { - DCHECK_EQ(kSourceId, ack.source_id); + DCHECK_EQ(kSourceId, ack.frame_id.source_id); timer_.Start( FROM_HERE, kFrameInterval, base::BindOnce(&CastExternalBeginFrameSource::IssueExternalBeginFrame, diff --git a/components/exo/buffer_unittest.cc b/components/exo/buffer_unittest.cc index 79b2c9f945ad43..8485e1021d8560 100644 --- a/components/exo/buffer_unittest.cc +++ b/components/exo/buffer_unittest.cc @@ -190,9 +190,9 @@ TEST_F(BufferTest, SurfaceTreeHostDestruction) { // Submit frame with resource. { viz::CompositorFrame frame; - frame.metadata.begin_frame_ack.source_id = + frame.metadata.begin_frame_ack.frame_id.source_id = viz::BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = + frame.metadata.begin_frame_ack.frame_id.sequence_number = viz::BeginFrameArgs::kStartingFrameNumber; frame.metadata.begin_frame_ack.has_damage = true; frame.metadata.frame_token = 1; @@ -243,10 +243,9 @@ TEST_F(BufferTest, SurfaceTreeHostLastFrame) { // Submit frame with resource. { viz::CompositorFrame frame; - frame.metadata.begin_frame_ack.source_id = - viz::BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = - viz::BeginFrameArgs::kStartingFrameNumber; + frame.metadata.begin_frame_ack.frame_id = + viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId, + viz::BeginFrameArgs::kStartingFrameNumber); frame.metadata.begin_frame_ack.has_damage = true; frame.metadata.frame_token = 1; frame.metadata.device_scale_factor = 1; @@ -279,10 +278,9 @@ TEST_F(BufferTest, SurfaceTreeHostLastFrame) { // Submit frame without resource. This should cause buffer to be released. { viz::CompositorFrame frame; - frame.metadata.begin_frame_ack.source_id = - viz::BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = - viz::BeginFrameArgs::kStartingFrameNumber; + frame.metadata.begin_frame_ack.frame_id = + viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId, + viz::BeginFrameArgs::kStartingFrameNumber); frame.metadata.begin_frame_ack.has_damage = true; frame.metadata.frame_token = 1; frame.metadata.device_scale_factor = 1; diff --git a/components/exo/layer_tree_frame_sink_holder.cc b/components/exo/layer_tree_frame_sink_holder.cc index ad8437f60263bc..9b7acd9b9ff172 100644 --- a/components/exo/layer_tree_frame_sink_holder.cc +++ b/components/exo/layer_tree_frame_sink_holder.cc @@ -49,10 +49,9 @@ void LayerTreeFrameSinkHolder::DeleteWhenLastResourceHasBeenReclaimed( // Submit an empty frame to ensure that pending release callbacks will be // processed in a finite amount of time. viz::CompositorFrame frame; - frame.metadata.begin_frame_ack.source_id = - viz::BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = - viz::BeginFrameArgs::kStartingFrameNumber; + frame.metadata.begin_frame_ack.frame_id = + viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId, + viz::BeginFrameArgs::kStartingFrameNumber); frame.metadata.begin_frame_ack.has_damage = true; frame.metadata.frame_token = ++holder->next_frame_token_; frame.metadata.device_scale_factor = holder->last_frame_device_scale_factor_; diff --git a/components/ui_devtools/viz/frame_sink_element.cc b/components/ui_devtools/viz/frame_sink_element.cc index 5447cf124a08bb..3e0a570a21c0c9 100644 --- a/components/ui_devtools/viz/frame_sink_element.cc +++ b/components/ui_devtools/viz/frame_sink_element.cc @@ -50,9 +50,10 @@ FrameSinkElement::GetCustomPropertiesForMatchedStyle() const { const viz::BeginFrameArgs args = static_cast(support) ->LastUsedBeginFrameArgs(); - properties.emplace_back("SourceId", base::NumberToString(args.source_id)); - properties.emplace_back("SequenceNumber", - base::NumberToString(args.sequence_number)); + properties.emplace_back("SourceId", + base::NumberToString(args.frame_id.source_id)); + properties.emplace_back( + "SequenceNumber", base::NumberToString(args.frame_id.sequence_number)); properties.emplace_back( "FrameType", std::string(viz::BeginFrameArgs::TypeToString(args.type))); } diff --git a/components/viz/common/frame_sinks/begin_frame_args.cc b/components/viz/common/frame_sinks/begin_frame_args.cc index ce395d0f85cd12..279011f0f7a725 100644 --- a/components/viz/common/frame_sinks/begin_frame_args.cc +++ b/components/viz/common/frame_sinks/begin_frame_args.cc @@ -45,12 +45,50 @@ TypeToProtozeroEnum(BeginFrameArgs::BeginFrameArgsType type) { constexpr uint64_t BeginFrameArgs::kInvalidFrameNumber; constexpr uint64_t BeginFrameArgs::kStartingFrameNumber; +BeginFrameId::BeginFrameId() + : source_id(0), sequence_number(BeginFrameArgs::kInvalidFrameNumber) {} + +BeginFrameId::BeginFrameId(const BeginFrameId& id) = default; +BeginFrameId& BeginFrameId::operator=(const BeginFrameId& id) = default; + +BeginFrameId::BeginFrameId(uint64_t source_id, uint64_t sequence_number) + : source_id(source_id), sequence_number(sequence_number) {} + +bool BeginFrameId::operator<(const BeginFrameId& other) const { + if (source_id == other.source_id) + return (sequence_number < other.sequence_number); + return (source_id < other.source_id); +} + +bool BeginFrameId::operator==(const BeginFrameId& other) const { + return (source_id == other.source_id && + sequence_number == other.sequence_number); +} +bool BeginFrameId::operator!=(const BeginFrameId& other) const { + return !(*this == other); +} + +bool BeginFrameId::IsNextInSequenceTo(const BeginFrameId& previous) const { + return (source_id == previous.source_id && + sequence_number > previous.sequence_number); +} + +bool BeginFrameId::IsSequenceValid() const { + return (BeginFrameArgs::kInvalidFrameNumber != sequence_number); +} + +std::string BeginFrameId::ToString() const { + base::trace_event::TracedValueJSON value; + value.SetInteger("source_id", source_id); + value.SetInteger("sequence_number", sequence_number); + return value.ToJSON(); +} + BeginFrameArgs::BeginFrameArgs() : frame_time(base::TimeTicks::Min()), deadline(base::TimeTicks::Min()), interval(base::TimeDelta::FromMicroseconds(-1)), - source_id(0), - sequence_number(kInvalidFrameNumber), + frame_id(BeginFrameId(0, kInvalidFrameNumber)), type(BeginFrameArgs::INVALID), on_critical_path(true), animate_only(false) {} @@ -64,8 +102,7 @@ BeginFrameArgs::BeginFrameArgs(uint64_t source_id, : frame_time(frame_time), deadline(deadline), interval(interval), - source_id(source_id), - sequence_number(sequence_number), + frame_id(BeginFrameId(source_id, sequence_number)), type(type), on_critical_path(true), animate_only(false) { @@ -105,8 +142,8 @@ BeginFrameArgs::AsValue() const { void BeginFrameArgs::AsValueInto(base::trace_event::TracedValue* state) const { state->SetString("type", "BeginFrameArgs"); state->SetString("subtype", TypeToString(type)); - state->SetInteger("source_id", source_id); - state->SetInteger("sequence_number", sequence_number); + state->SetInteger("source_id", frame_id.source_id); + state->SetInteger("sequence_number", frame_id.sequence_number); state->SetDouble("frame_time_us", frame_time.since_origin().InMicroseconds()); state->SetDouble("deadline_us", deadline.since_origin().InMicroseconds()); state->SetDouble("interval_us", interval.InMicroseconds()); @@ -120,8 +157,8 @@ void BeginFrameArgs::AsValueInto(base::trace_event::TracedValue* state) const { void BeginFrameArgs::AsProtozeroInto( perfetto::protos::pbzero::BeginFrameArgs* state) const { state->set_type(TypeToProtozeroEnum(type)); - state->set_source_id(source_id); - state->set_sequence_number(sequence_number); + state->set_source_id(frame_id.source_id); + state->set_sequence_number(frame_id.sequence_number); state->set_frame_time_us(frame_time.since_origin().InMicroseconds()); state->set_deadline_us(deadline.since_origin().InMicroseconds()); state->set_interval_delta_us(interval.InMicroseconds()); @@ -147,14 +184,11 @@ std::string BeginFrameArgs::ToString() const { return value.ToJSON(); } -BeginFrameAck::BeginFrameAck() - : source_id(0), - sequence_number(BeginFrameArgs::kInvalidFrameNumber), - has_damage(false) {} +BeginFrameAck::BeginFrameAck() : has_damage(false) {} BeginFrameAck::BeginFrameAck(const BeginFrameArgs& args, bool has_damage) - : BeginFrameAck(args.source_id, - args.sequence_number, + : BeginFrameAck(args.frame_id.source_id, + args.frame_id.sequence_number, has_damage, args.trace_id) {} @@ -162,11 +196,10 @@ BeginFrameAck::BeginFrameAck(uint64_t source_id, uint64_t sequence_number, bool has_damage, int64_t trace_id) - : source_id(source_id), - sequence_number(sequence_number), + : frame_id(BeginFrameId(source_id, sequence_number)), trace_id(trace_id), has_damage(has_damage) { - DCHECK_LT(BeginFrameArgs::kInvalidFrameNumber, sequence_number); + DCHECK(frame_id.IsSequenceValid()); } // static diff --git a/components/viz/common/frame_sinks/begin_frame_args.h b/components/viz/common/frame_sinks/begin_frame_args.h index 7e7681745f310e..d0bd81bce33c86 100644 --- a/components/viz/common/frame_sinks/begin_frame_args.h +++ b/components/viz/common/frame_sinks/begin_frame_args.h @@ -47,6 +47,28 @@ class TracedValue; namespace viz { +struct VIZ_COMMON_EXPORT BeginFrameId { + // |source_id| and |sequence_number| identify a BeginFrame. These are set by + // the original BeginFrameSource that created the BeginFrameArgs. When + // |source_id| of consecutive BeginFrameArgs changes, observers should expect + // the continuity of |sequence_number| to break. + uint64_t source_id = 0; + uint64_t sequence_number = 0; + + // Creates an invalid set of values. + BeginFrameId(); + BeginFrameId(const BeginFrameId& id); + BeginFrameId(uint64_t source_id, uint64_t sequence_number); + + bool operator<(const BeginFrameId& other) const; + bool operator==(const BeginFrameId& other) const; + bool operator!=(const BeginFrameId& other) const; + bool IsNextInSequenceTo(const BeginFrameId& previous) const; + bool IsSequenceValid() const; + BeginFrameId& operator=(const BeginFrameId& id); + std::string ToString() const; +}; + struct VIZ_COMMON_EXPORT BeginFrameArgs { enum BeginFrameArgsType { INVALID, @@ -132,12 +154,7 @@ struct VIZ_COMMON_EXPORT BeginFrameArgs { // The inverse of the desired frame rate. base::TimeDelta interval; - // |source_id| and |sequence_number| identify a BeginFrame within a single - // process and are set by the original BeginFrameSource that created the - // BeginFrameArgs. When |source_id| of consecutive BeginFrameArgs changes, - // observers should expect the continuity of |sequence_number| to break. - uint64_t source_id; - uint64_t sequence_number; + BeginFrameId frame_id; // |trace_id| is used as the id for the trace-events associated with this // begin-frame. The trace-id is set by the service, and can be used by both @@ -186,15 +203,12 @@ struct VIZ_COMMON_EXPORT BeginFrameAck { // a CompositorFrame without prior BeginFrame, e.g. for synchronous drawing. static BeginFrameAck CreateManualAckWithDamage(); - // Source identifier of the BeginFrame that is acknowledged. The - // BeginFrameSource that receives the acknowledgment uses this to discard - // BeginFrameAcks for BeginFrames sent by a different source. Such a situation - // may occur when the BeginFrameSource of the observer changes while a - // BeginFrame from the old source is still in flight. - uint64_t source_id; - - // Sequence number of the BeginFrame that is acknowledged. - uint64_t sequence_number; + // Source identifier and Sequence number of the BeginFrame that is + // acknowledged. The BeginFrameSource that receives the acknowledgment uses + // this to discard BeginFrameAcks for BeginFrames sent by a different source. + // Such a situation may occur when the BeginFrameSource of the observer + // changes while a BeginFrame from the old source is still in flight. + BeginFrameId frame_id; // The |trace_id| of the BeginFrame that is acknowledged. int64_t trace_id = -1; diff --git a/components/viz/common/frame_sinks/begin_frame_args_unittest.cc b/components/viz/common/frame_sinks/begin_frame_args_unittest.cc index eb6457af15ef59..e5126fa53fdeb9 100644 --- a/components/viz/common/frame_sinks/begin_frame_args_unittest.cc +++ b/components/viz/common/frame_sinks/begin_frame_args_unittest.cc @@ -29,8 +29,8 @@ TEST(BeginFrameArgsTest, Helpers) { BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 123, 10, 1, 2, 3); EXPECT_TRUE(args2.IsValid()) << args2; - EXPECT_EQ(123u, args2.source_id); - EXPECT_EQ(10u, args2.sequence_number); + EXPECT_EQ(123u, args2.frame_id.source_id); + EXPECT_EQ(10u, args2.frame_id.sequence_number); EXPECT_EQ(k1Usec, args2.frame_time.since_origin()); EXPECT_EQ(k2Usec, args2.deadline.since_origin()); EXPECT_EQ(k3Usec, args2.interval); @@ -39,8 +39,8 @@ TEST(BeginFrameArgsTest, Helpers) { BeginFrameArgs args4 = CreateBeginFrameArgsForTesting( BEGINFRAME_FROM_HERE, 234, 20, 1, 2, 3, BeginFrameArgs::MISSED); EXPECT_TRUE(args4.IsValid()) << args4; - EXPECT_EQ(234u, args4.source_id); - EXPECT_EQ(20u, args4.sequence_number); + EXPECT_EQ(234u, args4.frame_id.source_id); + EXPECT_EQ(20u, args4.frame_id.sequence_number); EXPECT_EQ(k1Usec, args4.frame_time.since_origin()); EXPECT_EQ(k2Usec, args4.deadline.since_origin()); EXPECT_EQ(k3Usec, args4.interval); @@ -107,8 +107,8 @@ TEST(BeginFrameArgsTest, Create) { EXPECT_TRUE(args2.IsValid()) << args2; EXPECT_TRUE(args2.on_critical_path); EXPECT_FALSE(args2.animate_only); - EXPECT_EQ(123u, args2.source_id) << args2; - EXPECT_EQ(10u, args2.sequence_number) << args2; + EXPECT_EQ(123u, args2.frame_id.source_id) << args2; + EXPECT_EQ(10u, args2.frame_id.sequence_number) << args2; EXPECT_EQ(k1Usec, args2.frame_time.since_origin()) << args2; EXPECT_EQ(k2Usec, args2.deadline.since_origin()) << args2; EXPECT_EQ(k3Usec, args2.interval) << args2; diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/components/viz/common/frame_sinks/begin_frame_source.cc index ece9dcc4c027f4..9dace7e2c53543 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.cc +++ b/components/viz/common/frame_sinks/begin_frame_source.cc @@ -55,8 +55,7 @@ bool CheckBeginFrameContinuity(BeginFrameObserver* observer, const BeginFrameArgs& args) { const BeginFrameArgs& last_args = observer->LastUsedBeginFrameArgs(); if (!last_args.IsValid() || (args.frame_time > last_args.frame_time)) { - DCHECK((args.source_id != last_args.source_id) || - (args.sequence_number > last_args.sequence_number)) + DCHECK(!last_args.frame_id.IsNextInSequenceTo(args.frame_id)) << "current " << args.ToString() << ", last " << last_args.ToString(); return true; } @@ -85,8 +84,7 @@ bool BeginFrameObserverBase::WantsAnimateOnlyBeginFrames() const { void BeginFrameObserverBase::OnBeginFrame(const BeginFrameArgs& args) { DCHECK(args.IsValid()); DCHECK_GE(args.frame_time, last_begin_frame_args_.frame_time); - DCHECK(args.sequence_number > last_begin_frame_args_.sequence_number || - args.source_id != last_begin_frame_args_.source_id) + DCHECK(!last_begin_frame_args_.frame_id.IsNextInSequenceTo(args.frame_id)) << "current " << args.ToString() << ", last " << last_begin_frame_args_.ToString(); bool used = OnBeginFrameDerivedImpl(args); @@ -356,8 +354,7 @@ void DelayBasedBeginFrameSource::IssueBeginFrameToObserver( (args.frame_time > last_args.frame_time + args.interval / kDoubleTickDivisor)) { if (args.type == BeginFrameArgs::MISSED) { - DCHECK(args.sequence_number > last_args.sequence_number || - args.source_id != last_args.source_id) + DCHECK(!last_args.frame_id.IsNextInSequenceTo(args.frame_id)) << "missed " << args.ToString() << ", last " << last_args.ToString(); } FilterAndIssueBeginFrame(obs, args); @@ -435,8 +432,9 @@ void ExternalBeginFrameSource::OnBeginFrame(const BeginFrameArgs& args) { // recreated. if (last_begin_frame_args_.IsValid() && (args.frame_time <= last_begin_frame_args_.frame_time || - (args.source_id == last_begin_frame_args_.source_id && - args.sequence_number <= last_begin_frame_args_.sequence_number))) + (args.frame_id.source_id == last_begin_frame_args_.frame_id.source_id && + args.frame_id.sequence_number <= + last_begin_frame_args_.frame_id.sequence_number))) return; if (RequestCallbackOnGpuAvailable()) { diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index dccc239a65d7c9..6468a61a6cbff8 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h @@ -36,10 +36,11 @@ class VIZ_COMMON_EXPORT BeginFrameObserver { virtual ~BeginFrameObserver() {} // The |args| given to OnBeginFrame is guaranteed to have - // |args|.IsValid()==true. If |args|.source_id did not change between - // invocations, |args|.sequence_number is guaranteed to be be strictly greater - // than the previous call. Further, |args|.frame_time is guaranteed to be - // greater than or equal to the previous call even if the source_id changes. + // |args|.IsValid()==true. If |args|.frame_id.source_id did not change + // between invocations, |args|.frame_id.sequence_number is guaranteed to be + // be strictly greater than the previous call. Further, |args|.frame_time is + // guaranteed to be greater than or equal to the previous call even if the + // source_id changes. // // Side effects: This function can (and most of the time *will*) change the // return value of the LastUsedBeginFrameArgs method. See the documentation diff --git a/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc b/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc index e072576c6e3e38..acffa4b94700d2 100644 --- a/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc +++ b/components/viz/service/compositor_frame_fuzzer/compositor_frame_fuzzer_util.cc @@ -155,10 +155,8 @@ FuzzedData FuzzedCompositorFrameBuilder::Build( const proto::RenderPass& render_pass_spec) { static FrameTokenGenerator next_frame_token; - data_.frame.metadata.begin_frame_ack.source_id = - BeginFrameArgs::kManualSourceId; - data_.frame.metadata.begin_frame_ack.sequence_number = - BeginFrameArgs::kStartingFrameNumber; + data_.frame.metadata.begin_frame_ack.frame_id = BeginFrameId( + BeginFrameArgs::kManualSourceId, BeginFrameArgs::kStartingFrameNumber); data_.frame.metadata.begin_frame_ack.has_damage = true; data_.frame.metadata.frame_token = ++next_frame_token; data_.frame.metadata.device_scale_factor = 1; diff --git a/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc b/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc index 49bebee8e0c31a..5e011049514772 100644 --- a/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc +++ b/components/viz/service/compositor_frame_fuzzer/fuzzer_browser_process.cc @@ -116,9 +116,8 @@ CompositorFrame FuzzerBrowserProcess::BuildBrowserUICompositorFrame( CompositorFrame frame; frame.metadata.frame_token = ++next_frame_token_; - frame.metadata.begin_frame_ack.source_id = BeginFrameArgs::kManualSourceId; - frame.metadata.begin_frame_ack.sequence_number = - BeginFrameArgs::kStartingFrameNumber; + frame.metadata.begin_frame_ack.frame_id = BeginFrameId( + BeginFrameArgs::kManualSourceId, BeginFrameArgs::kStartingFrameNumber); frame.metadata.device_scale_factor = 1; frame.metadata.local_surface_id_allocation_time = base::TimeTicks::Now(); frame.metadata.referenced_surfaces.push_back( diff --git a/components/viz/service/display/display_damage_tracker.cc b/components/viz/service/display/display_damage_tracker.cc index 6aef5554ecdf1f..ba82fa945f1c67 100644 --- a/components/viz/service/display/display_damage_tracker.cc +++ b/components/viz/service/display/display_damage_tracker.cc @@ -76,7 +76,7 @@ void DisplayDamageTracker::ProcessSurfaceDamage(const SurfaceId& surface_id, expecting_root_surface_damage_because_of_resize_ = false; // Update surface state. - bool valid_ack = ack.sequence_number != BeginFrameArgs::kInvalidFrameNumber; + bool valid_ack = ack.frame_id.IsSequenceValid(); if (valid_ack) { auto it = surface_states_.find(surface_id); // Ignore stray acknowledgments for prior BeginFrames, to ensure we don't @@ -84,8 +84,7 @@ void DisplayDamageTracker::ProcessSurfaceDamage(const SurfaceId& surface_id, // such stray acks e.g. when a CompositorFrame activates in a later // BeginFrame than it was created. if (it != surface_states_.end() && - (it->second.last_ack.source_id != ack.source_id || - it->second.last_ack.sequence_number < ack.sequence_number)) { + !it->second.last_ack.frame_id.IsNextInSequenceTo(ack.frame_id)) { it->second.last_ack = ack; } else { valid_ack = false; @@ -117,16 +116,13 @@ bool DisplayDamageTracker::HasPendingSurfaces( // Surface is ready if it hasn't received the current BeginFrame or receives // BeginFrames from a different source and thus likely belongs to a // different surface hierarchy. - uint64_t source_id = begin_frame_args.source_id; - uint64_t sequence_number = begin_frame_args.sequence_number; - if (!state.last_args.IsValid() || state.last_args.source_id != source_id || - state.last_args.sequence_number != sequence_number) { + if (!state.last_args.IsValid() || + state.last_args.frame_id != begin_frame_args.frame_id) { continue; } // Surface is ready if it has acknowledged the current BeginFrame. - if (state.last_ack.source_id == source_id && - state.last_ack.sequence_number == sequence_number) { + if (state.last_ack.frame_id == begin_frame_args.frame_id) { continue; } diff --git a/components/viz/service/display/display_damage_tracker_unittest.cc b/components/viz/service/display/display_damage_tracker_unittest.cc index b0fded151ba728..438ccb0f4ac19b 100644 --- a/components/viz/service/display/display_damage_tracker_unittest.cc +++ b/components/viz/service/display/display_damage_tracker_unittest.cc @@ -87,8 +87,7 @@ class DisplayDamageTrackerTest : public testing::Test { pass_list.push_back(std::move(pass)); BeginFrameAck ack; - ack.source_id = args.source_id; - ack.sequence_number = args.sequence_number; + ack.frame_id = BeginFrameId(args.frame_id); ack.has_damage = true; CompositorFrame frame = CompositorFrameBuilder() diff --git a/components/viz/service/display/display_scheduler_unittest.cc b/components/viz/service/display/display_scheduler_unittest.cc index 190c91996a35ed..fc42994fccddf3 100644 --- a/components/viz/service/display/display_scheduler_unittest.cc +++ b/components/viz/service/display/display_scheduler_unittest.cc @@ -467,7 +467,7 @@ TEST_F(DisplaySchedulerWaitForAllSurfacesTest, WaitForAllSurfacesBeforeDraw) { EXPECT_GE(now_src().NowTicks(), scheduler_.DesiredBeginFrameDeadlineTimeForTest()); // Stray BeginFrameAcks for older BeginFrames are ignored. - ack.sequence_number--; + ack.frame_id.sequence_number--; damage_tracker_->SurfaceDamagedForTest(sid1, ack, false); // If the acknowledgment above was not ignored and instead updated the surface // state for sid1, the surface would become a pending surface again, and the diff --git a/components/viz/service/frame_sinks/begin_frame_tracker.cc b/components/viz/service/frame_sinks/begin_frame_tracker.cc index 87a5e0d5a58b3b..0a8bcf4f70e3ed 100644 --- a/components/viz/service/frame_sinks/begin_frame_tracker.cc +++ b/components/viz/service/frame_sinks/begin_frame_tracker.cc @@ -8,8 +8,7 @@ namespace viz { void BeginFrameTracker::SentBeginFrame(const BeginFrameArgs& args) { ++outstanding_begin_frames_; - last_source_id_ = args.source_id; - last_sequence_number_ = args.sequence_number; + last_frame_id_ = args.frame_id; } void BeginFrameTracker::ReceivedAck(const BeginFrameAck& ack) { @@ -39,8 +38,7 @@ bool BeginFrameTracker::ShouldStopBeginFrame() const { } bool BeginFrameTracker::MatchesLastSent(const BeginFrameAck& ack) { - return last_source_id_ == ack.source_id && - last_sequence_number_ == ack.sequence_number; + return last_frame_id_ == ack.frame_id; } } // namespace viz diff --git a/components/viz/service/frame_sinks/begin_frame_tracker.h b/components/viz/service/frame_sinks/begin_frame_tracker.h index 8b628d8d50dff6..6b1e77ed18ef27 100644 --- a/components/viz/service/frame_sinks/begin_frame_tracker.h +++ b/components/viz/service/frame_sinks/begin_frame_tracker.h @@ -37,8 +37,7 @@ class VIZ_SERVICE_EXPORT BeginFrameTracker { int outstanding_begin_frames_ = 0; - uint64_t last_source_id_ = 0; - uint64_t last_sequence_number_ = BeginFrameArgs::kInvalidFrameNumber; + BeginFrameId last_frame_id_; }; } // namespace viz diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index 1953148763e1cc..5781cd8be30416 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc @@ -330,9 +330,9 @@ bool CompositorFrameSinkSupport::IsRoot() const { void CompositorFrameSinkSupport::DidNotProduceFrame(const BeginFrameAck& ack) { TRACE_EVENT2("viz", "CompositorFrameSinkSupport::DidNotProduceFrame", - "ack.source_id", ack.source_id, "ack.sequence_number", - ack.sequence_number); - DCHECK_GE(ack.sequence_number, BeginFrameArgs::kStartingFrameNumber); + "ack.source_id", ack.frame_id.source_id, "ack.sequence_number", + ack.frame_id.sequence_number); + DCHECK(ack.frame_id.IsSequenceValid()); begin_frame_tracker_.ReceivedAck(ack); @@ -428,8 +428,7 @@ SubmitResult CompositorFrameSinkSupport::MaybeSubmitCompositorFrameInternal( // Override the has_damage flag (ignoring invalid data from clients). frame.metadata.begin_frame_ack.has_damage = true; - DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, - frame.metadata.begin_frame_ack.sequence_number); + DCHECK(frame.metadata.begin_frame_ack.frame_id.IsSequenceValid()); if (!ui::LatencyInfo::Verify(frame.metadata.latency_info, "RenderWidgetHostImpl::OnSwapCompositorFrame")) { diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc index 2fa23f25e40bee..f11a8887ac3baa 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc @@ -67,8 +67,7 @@ gpu::SyncToken GenTestSyncToken(int id) { bool BeginFrameArgsAreEquivalent(const BeginFrameArgs& first, const BeginFrameArgs& second) { - return first.source_id == second.source_id && - first.sequence_number == second.sequence_number; + return first.frame_id == second.frame_id; } } // namespace diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc index c891ece855a6c3..40bef5b93e6573 100644 --- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc +++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc @@ -132,8 +132,7 @@ void DirectLayerTreeFrameSink::SubmitCompositorFrame( bool hit_test_data_changed, bool show_hit_test_borders) { DCHECK(frame.metadata.begin_frame_ack.has_damage); - DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, - frame.metadata.begin_frame_ack.sequence_number); + DCHECK(frame.metadata.begin_frame_ack.frame_id.IsSequenceValid()); // It's possible to request an immediate composite from cc which will bypass // BeginFrame. In that case, we cannot collect full graphics pipeline data. @@ -189,7 +188,7 @@ void DirectLayerTreeFrameSink::SubmitCompositorFrame( void DirectLayerTreeFrameSink::DidNotProduceFrame(const BeginFrameAck& ack) { DCHECK(!ack.has_damage); - DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); + DCHECK(ack.frame_id.IsSequenceValid()); // TODO(yiyix): Remove duplicated calls of DidNotProduceFrame from the same // BeginFrames. https://crbug.com/881949 diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc index 80ebf0302bcc7a..198f2895247267 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc +++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc @@ -29,7 +29,7 @@ void ExternalBeginFrameSourceMojo::IssueExternalBeginFrame( bool force, base::OnceCallback callback) { DCHECK(!pending_frame_callback_) << "Got overlapping IssueExternalBeginFrame"; - original_source_id_ = args.source_id; + original_source_id_ = args.frame_id.source_id; OnBeginFrame(args); @@ -55,7 +55,7 @@ void ExternalBeginFrameSourceMojo::OnDestroyedCompositorFrameSink( void ExternalBeginFrameSourceMojo::OnFrameSinkDidBeginFrame( const FrameSinkId& sink_id, const BeginFrameArgs& args) { - if (args.source_id != original_source_id_) + if (args.frame_id.source_id != original_source_id_) return; pending_frame_sinks_.insert(sink_id); } @@ -63,7 +63,7 @@ void ExternalBeginFrameSourceMojo::OnFrameSinkDidBeginFrame( void ExternalBeginFrameSourceMojo::OnFrameSinkDidFinishFrame( const FrameSinkId& sink_id, const BeginFrameArgs& args) { - if (args.source_id != original_source_id_) + if (args.frame_id.source_id != original_source_id_) return; pending_frame_sinks_.erase(sink_id); MaybeProduceFrameCallback(); @@ -81,8 +81,8 @@ void ExternalBeginFrameSourceMojo::MaybeProduceFrameCallback() { // All frame sinks are done with frame, yet the root frame is still missing, // the display won't draw, so resolve callback now. - BeginFrameAck nak(last_begin_frame_args_.source_id, - last_begin_frame_args_.sequence_number, + BeginFrameAck nak(last_begin_frame_args_.frame_id.source_id, + last_begin_frame_args_.frame_id.sequence_number, /*has_damage=*/false); std::move(pending_frame_callback_).Run(nak); } diff --git a/components/viz/test/begin_frame_args_test.cc b/components/viz/test/begin_frame_args_test.cc index e7733666d3fee0..0a27262dc26901 100644 --- a/components/viz/test/begin_frame_args_test.cc +++ b/components/viz/test/begin_frame_args_test.cc @@ -77,8 +77,7 @@ BeginFrameArgs CreateBeginFrameArgsForTesting( } bool operator==(const BeginFrameArgs& lhs, const BeginFrameArgs& rhs) { - return (lhs.type == rhs.type) && (lhs.source_id == rhs.source_id) && - (lhs.sequence_number == rhs.sequence_number) && + return (lhs.type == rhs.type) && (lhs.frame_id == rhs.frame_id) && (lhs.frame_time == rhs.frame_time) && (lhs.deadline == rhs.deadline) && (lhs.interval == rhs.interval); } @@ -90,16 +89,14 @@ ::std::ostream& operator<<(::std::ostream& os, const BeginFrameArgs& args) { void PrintTo(const BeginFrameArgs& args, ::std::ostream* os) { *os << "BeginFrameArgs(" << BeginFrameArgs::TypeToString(args.type) << ", " - << args.source_id << ", " << args.sequence_number << ", " - << args.frame_time.since_origin().InMicroseconds() << ", " + << args.frame_id.source_id << ", " << args.frame_id.sequence_number + << ", " << args.frame_time.since_origin().InMicroseconds() << ", " << args.deadline.since_origin().InMicroseconds() << ", " << args.interval.InMicroseconds() << "us)"; } bool operator==(const BeginFrameAck& lhs, const BeginFrameAck& rhs) { - return (lhs.source_id == rhs.source_id) && - (lhs.sequence_number == rhs.sequence_number) && - (lhs.has_damage == rhs.has_damage); + return (lhs.frame_id == rhs.frame_id) && (lhs.has_damage == rhs.has_damage); } ::std::ostream& operator<<(::std::ostream& os, const BeginFrameAck& args) { @@ -108,8 +105,8 @@ ::std::ostream& operator<<(::std::ostream& os, const BeginFrameAck& args) { } void PrintTo(const BeginFrameAck& ack, ::std::ostream* os) { - *os << "BeginFrameAck(" << ack.source_id << ", " << ack.sequence_number - << ", " << ack.has_damage << ")"; + *os << "BeginFrameAck(" << ack.frame_id.source_id << ", " + << ack.frame_id.sequence_number << ", " << ack.has_damage << ")"; } } // namespace viz diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index b92d3836cf3a67..1e606ff66d5485 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -1578,7 +1578,7 @@ void RenderWidgetHostViewAndroid::StopObservingRootWindow() { void RenderWidgetHostViewAndroid::SendBeginFrame(viz::BeginFrameArgs args) { TRACE_EVENT2("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", - "frame_number", args.sequence_number, "frame_time_us", + "frame_number", args.frame_id.sequence_number, "frame_time_us", args.frame_time.ToInternalValue()); // Synchronous compositor does not use deadline-based scheduling. @@ -2183,8 +2183,8 @@ void RenderWidgetHostViewAndroid::OnBeginFrame( const viz::BeginFrameArgs& args) { TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame"); if (!host()) { - OnDidNotProduceFrame( - viz::BeginFrameAck(args.source_id, args.sequence_number, false)); + OnDidNotProduceFrame(viz::BeginFrameAck( + args.frame_id.source_id, args.frame_id.sequence_number, false)); return; } @@ -2192,8 +2192,8 @@ void RenderWidgetHostViewAndroid::OnBeginFrame( // SynchronousCompositorBrowserFilter::SyncStateAfterVSync will be called // during WindowAndroid::WindowBeginFrameSource::OnVSync() observer iteration. if (sync_compositor_ && args.type == viz::BeginFrameArgs::MISSED) { - OnDidNotProduceFrame( - viz::BeginFrameAck(args.source_id, args.sequence_number, false)); + OnDidNotProduceFrame(viz::BeginFrameAck( + args.frame_id.source_id, args.frame_id.sequence_number, false)); return; } @@ -2217,8 +2217,8 @@ void RenderWidgetHostViewAndroid::OnBeginFrame( ClearBeginFrameRequest(BEGIN_FRAME); SendBeginFrame(args); } else { - OnDidNotProduceFrame( - viz::BeginFrameAck(args.source_id, args.sequence_number, false)); + OnDidNotProduceFrame(viz::BeginFrameAck( + args.frame_id.source_id, args.frame_id.sequence_number, false)); } } diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc index bcc07493dead2b..2de537a858a212 100644 --- a/headless/lib/browser/headless_web_contents_impl.cc +++ b/headless/lib/browser/headless_web_contents_impl.cc @@ -190,8 +190,8 @@ class HeadlessWebContentsImpl::PendingFrame : sequence_number_(sequence_number), callback_(std::move(callback)) {} void OnFrameComplete(const viz::BeginFrameAck& ack) { - DCHECK_EQ(kBeginFrameSourceId, ack.source_id); - DCHECK_EQ(sequence_number_, ack.sequence_number); + DCHECK_EQ(kBeginFrameSourceId, ack.frame_id.source_id); + DCHECK_EQ(sequence_number_, ack.frame_id.sequence_number); has_damage_ = ack.has_damage; } diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc index f295e7283cd200..84a31fba2b82b1 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc @@ -52,8 +52,8 @@ bool StructTraits:: !data.ReadInterval(&out->interval) || !data.ReadType(&out->type)) { return false; } - out->source_id = data.source_id(); - out->sequence_number = data.sequence_number(); + out->frame_id.source_id = data.source_id(); + out->frame_id.sequence_number = data.sequence_number(); out->trace_id = data.trace_id(); out->on_critical_path = data.on_critical_path(); out->animate_only = data.animate_only(); @@ -66,8 +66,8 @@ bool StructTraits::Read( viz::BeginFrameAck* out) { if (data.sequence_number() < viz::BeginFrameArgs::kStartingFrameNumber) return false; - out->source_id = data.source_id(); - out->sequence_number = data.sequence_number(); + out->frame_id.source_id = data.source_id(); + out->frame_id.sequence_number = data.sequence_number(); out->trace_id = data.trace_id(); out->has_damage = data.has_damage(); return true; diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h index 510dfa10c5b5c5..a564efadd6b224 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h @@ -35,11 +35,11 @@ struct StructTraits { } static uint64_t sequence_number(const viz::BeginFrameArgs& args) { - return args.sequence_number; + return args.frame_id.sequence_number; } static uint64_t source_id(const viz::BeginFrameArgs& args) { - return args.source_id; + return args.frame_id.source_id; } static int64_t trace_id(const viz::BeginFrameArgs& args) { @@ -66,11 +66,11 @@ struct StructTraits { template <> struct StructTraits { static uint64_t sequence_number(const viz::BeginFrameAck& ack) { - return ack.sequence_number; + return ack.frame_id.sequence_number; } static uint64_t source_id(const viz::BeginFrameAck& ack) { - return ack.source_id; + return ack.frame_id.source_id; } static int64_t trace_id(const viz::BeginFrameAck& ack) { diff --git a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc index cc40649c776f2c..aecfe31f3850ec 100644 --- a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc +++ b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc @@ -81,8 +81,7 @@ TEST_F(StructTraitsTest, BeginFrameArgs) { const uint64_t sequence_number = 10; const bool animate_only = true; BeginFrameArgs input; - input.source_id = source_id; - input.sequence_number = sequence_number; + input.frame_id = BeginFrameId(source_id, sequence_number); input.frame_time = frame_time; input.deadline = deadline; input.interval = interval; @@ -93,8 +92,8 @@ TEST_F(StructTraitsTest, BeginFrameArgs) { BeginFrameArgs output; mojo::test::SerializeAndDeserialize(&input, &output); - EXPECT_EQ(source_id, output.source_id); - EXPECT_EQ(sequence_number, output.sequence_number); + EXPECT_EQ(source_id, output.frame_id.source_id); + EXPECT_EQ(sequence_number, output.frame_id.sequence_number); EXPECT_EQ(frame_time, output.frame_time); EXPECT_EQ(deadline, output.deadline); EXPECT_EQ(interval, output.interval); @@ -108,15 +107,14 @@ TEST_F(StructTraitsTest, BeginFrameAck) { const uint64_t sequence_number = 10; const bool has_damage = true; BeginFrameAck input; - input.source_id = source_id; - input.sequence_number = sequence_number; + input.frame_id = BeginFrameId(source_id, sequence_number); input.has_damage = has_damage; BeginFrameAck output; mojo::test::SerializeAndDeserialize(&input, &output); - EXPECT_EQ(source_id, output.source_id); - EXPECT_EQ(sequence_number, output.sequence_number); + EXPECT_EQ(source_id, output.frame_id.source_id); + EXPECT_EQ(sequence_number, output.frame_id.sequence_number); EXPECT_TRUE(output.has_damage); } @@ -659,7 +657,8 @@ TEST_F(StructTraitsTest, CompositorFrameMetadata) { input.activation_dependencies = activation_dependencies; input.deadline = frame_deadline; input.frame_token = frame_token; - input.begin_frame_ack.sequence_number = begin_frame_ack_sequence_number; + input.begin_frame_ack.frame_id.sequence_number = + begin_frame_ack_sequence_number; input.min_page_scale_factor = min_page_scale_factor; input.top_controls_visible_height.emplace(top_controls_visible_height); input.local_surface_id_allocation_time = local_surface_id_allocation_time; @@ -688,7 +687,7 @@ TEST_F(StructTraitsTest, CompositorFrameMetadata) { EXPECT_EQ(frame_deadline, output.deadline); EXPECT_EQ(frame_token, output.frame_token); EXPECT_EQ(begin_frame_ack_sequence_number, - output.begin_frame_ack.sequence_number); + output.begin_frame_ack.frame_id.sequence_number); EXPECT_EQ(min_page_scale_factor, output.min_page_scale_factor); EXPECT_EQ(*output.top_controls_visible_height, top_controls_visible_height); EXPECT_EQ(local_surface_id_allocation_time, diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc index 2758a4a7e0fda2..2e0040edaca5ac 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc @@ -216,8 +216,7 @@ bool CanvasResourceDispatcher::PrepareFrame( // TODO(crbug.com/652931): update the device_scale_factor frame->metadata.device_scale_factor = 1.0f; - if (current_begin_frame_ack_.sequence_number == - viz::BeginFrameArgs::kInvalidFrameNumber) { + if (!current_begin_frame_ack_.frame_id.IsSequenceValid()) { // TODO(eseckler): This shouldn't be necessary when OffscreenCanvas no // longer submits CompositorFrames without prior BeginFrame. current_begin_frame_ack_ = viz::BeginFrameAck::CreateManualAckWithDamage(); @@ -353,7 +352,7 @@ void CanvasResourceDispatcher::OnBeginFrame( } // TODO(fserb): Update this with the correct value if we are on RAF submit. - current_begin_frame_ack_.sequence_number = + current_begin_frame_ack_.frame_id.sequence_number = viz::BeginFrameArgs::kInvalidFrameNumber; } diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc index f48ed356728977..39bbc0d9e7d673 100644 --- a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc +++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc @@ -546,7 +546,8 @@ viz::CompositorFrame VideoFrameSubmitter::CreateCompositorFrame( frame_token_to_timestamp_map_[*next_frame_token_] = value; - if (begin_frame_ack.source_id == viz::BeginFrameArgs::kManualSourceId) + if (begin_frame_ack.frame_id.source_id == + viz::BeginFrameArgs::kManualSourceId) ignorable_submitted_frames_.insert(*next_frame_token_); UMA_HISTOGRAM_TIMES("Media.VideoFrameSubmitter.PreSubmitBuffering", diff --git a/ui/android/window_android.cc b/ui/android/window_android.cc index db967aa85543db..35b813acd5183e 100644 --- a/ui/android/window_android.cc +++ b/ui/android/window_android.cc @@ -97,9 +97,8 @@ void WindowAndroid::WindowBeginFrameSource::AddObserver( viz::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); if (!last_args.IsValid() || last_args.frame_time < last_begin_frame_args_.frame_time) { - DCHECK(last_args.sequence_number < - last_begin_frame_args_.sequence_number || - last_args.source_id != last_begin_frame_args_.source_id); + DCHECK(!last_args.frame_id.IsNextInSequenceTo( + last_begin_frame_args_.frame_id)); last_begin_frame_args_.type = viz::BeginFrameArgs::MISSED; // TODO(crbug.com/602485): A deadline doesn't make too much sense // for a missed BeginFrame (the intention rather is 'immediately'),