blob: 98f4eea7b76be39378c809f5c70f0dfd1e230291 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
#include "base/rand_util.h"
#include "base/time/default_tick_clock.h"
#include "base/trace_event/trace_event.h"
namespace viz {
constexpr LocalSurfaceIdAllocation g_invalid_local_surface_id_allocation;
ParentLocalSurfaceIdAllocator::ParentLocalSurfaceIdAllocator(
const base::TickClock* tick_clock)
: current_local_surface_id_allocation_(
LocalSurfaceId(kInvalidParentSequenceNumber,
kInitialChildSequenceNumber,
base::UnguessableToken::Create()),
base::TimeTicks()),
tick_clock_(tick_clock) {}
ParentLocalSurfaceIdAllocator::ParentLocalSurfaceIdAllocator()
: ParentLocalSurfaceIdAllocator(base::DefaultTickClock::GetInstance()) {}
bool ParentLocalSurfaceIdAllocator::UpdateFromChild(
const LocalSurfaceIdAllocation& child_local_surface_id_allocation) {
const LocalSurfaceId& current_local_surface_id =
current_local_surface_id_allocation_.local_surface_id_;
const LocalSurfaceId& child_allocated_local_surface_id =
child_local_surface_id_allocation.local_surface_id();
// If the child has not incremented its child sequence number then there is
// nothing to do here. This allocator already has the latest LocalSurfaceId.
if (current_local_surface_id.child_sequence_number() >=
child_allocated_local_surface_id.child_sequence_number()) {
return false;
}
is_invalid_ = false;
if (current_local_surface_id.parent_sequence_number() >
child_allocated_local_surface_id.parent_sequence_number()) {
// If the current LocalSurfaceId has a newer parent sequence number
// than the one provided by the child, then the merged LocalSurfaceId
// is actually a new LocalSurfaceId and so we report its allocation time
// as now.
TRACE_EVENT2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"ParentLocalSurfaceIdAllocator::UpdateFromChild New Allocation",
"current", current_local_surface_id_allocation_.ToString(), "child",
child_local_surface_id_allocation.ToString());
current_local_surface_id_allocation_.allocation_time_ =
tick_clock_->NowTicks();
} else {
TRACE_EVENT2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"ParentLocalSurfaceIdAllocator::UpdateFromChild Synchronization",
"current", current_local_surface_id_allocation_.ToString(), "child",
child_local_surface_id_allocation.ToString());
current_local_surface_id_allocation_.allocation_time_ =
child_local_surface_id_allocation.allocation_time();
}
current_local_surface_id_allocation_.local_surface_id_
.child_sequence_number_ =
child_allocated_local_surface_id.child_sequence_number_;
TRACE_EVENT_WITH_FLOW2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"LocalSurfaceId.Embed.Flow",
TRACE_ID_GLOBAL(current_local_surface_id_allocation_.local_surface_id_
.embed_trace_id()),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"UpdateFromChild", "local_surface_id",
current_local_surface_id_allocation_.local_surface_id_.ToString());
return true;
}
void ParentLocalSurfaceIdAllocator::Reset(
const LocalSurfaceId& local_surface_id) {
is_invalid_ = false;
current_local_surface_id_allocation_.local_surface_id_ = local_surface_id;
current_local_surface_id_allocation_.allocation_time_ =
tick_clock_->NowTicks();
}
void ParentLocalSurfaceIdAllocator::Invalidate() {
is_invalid_ = true;
}
void ParentLocalSurfaceIdAllocator::GenerateId() {
if (is_allocation_suppressed_)
return;
is_invalid_ = false;
++current_local_surface_id_allocation_.local_surface_id_.parent_component_
.sequence_number;
current_local_surface_id_allocation_.allocation_time_ =
tick_clock_->NowTicks();
TRACE_EVENT_WITH_FLOW2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"LocalSurfaceId.Embed.Flow",
TRACE_ID_GLOBAL(current_local_surface_id_allocation_.local_surface_id_
.embed_trace_id()),
TRACE_EVENT_FLAG_FLOW_OUT, "step",
"ParentLocalSurfaceIdAllocator::GenerateId", "local_surface_id",
current_local_surface_id_allocation_.local_surface_id_.ToString());
TRACE_EVENT_WITH_FLOW2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"LocalSurfaceId.Submission.Flow",
TRACE_ID_GLOBAL(current_local_surface_id_allocation_.local_surface_id_
.submission_trace_id()),
TRACE_EVENT_FLAG_FLOW_OUT, "step",
"ParentLocalSurfaceIdAllocator::GenerateId", "local_surface_id",
current_local_surface_id_allocation_.local_surface_id_.ToString());
}
const LocalSurfaceIdAllocation&
ParentLocalSurfaceIdAllocator::GetCurrentLocalSurfaceIdAllocation() const {
if (is_invalid_)
return g_invalid_local_surface_id_allocation;
return current_local_surface_id_allocation_;
}
bool ParentLocalSurfaceIdAllocator::HasValidLocalSurfaceIdAllocation() const {
return !is_invalid_ && current_local_surface_id_allocation_.IsValid();
}
// static
const LocalSurfaceIdAllocation&
ParentLocalSurfaceIdAllocator::InvalidLocalSurfaceIdAllocation() {
return g_invalid_local_surface_id_allocation;
}
} // namespace viz