blob: 5b099a3500f26071df6fbb8b0984307ea7dd9867 [file] [log] [blame]
// Copyright 2014 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 "cc/layers/surface_layer.h"
#include <stdint.h>
#include "base/macros.h"
#include "base/trace_event/trace_event.h"
#include "cc/layers/surface_layer_impl.h"
#include "cc/trees/layer_tree_host.h"
namespace cc {
scoped_refptr<SurfaceLayer> SurfaceLayer::Create() {
return base::WrapRefCounted(new SurfaceLayer());
}
SurfaceLayer::SurfaceLayer() = default;
SurfaceLayer::~SurfaceLayer() {
DCHECK(!layer_tree_host());
}
void SurfaceLayer::SetPrimarySurfaceId(const viz::SurfaceId& surface_id,
const DeadlinePolicy& deadline_policy) {
if (primary_surface_id_ == surface_id &&
deadline_policy.use_existing_deadline()) {
return;
}
TRACE_EVENT_WITH_FLOW2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"LocalSurfaceId.Embed.Flow",
TRACE_ID_GLOBAL(surface_id.local_surface_id().embed_trace_id()),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SetPrimarySurfaceId", "surface_id", surface_id.ToString());
const viz::SurfaceRange old_surface_range(GetSurfaceRange());
if (layer_tree_host() && old_surface_range.IsValid())
layer_tree_host()->RemoveSurfaceRange(old_surface_range);
primary_surface_id_ = surface_id;
const viz::SurfaceRange new_surface_range(GetSurfaceRange());
if (layer_tree_host() && new_surface_range.IsValid())
layer_tree_host()->AddSurfaceRange(new_surface_range);
// We should never block or set a deadline on an invalid
// |primary_surface_id_|.
if (!primary_surface_id_.is_valid()) {
deadline_in_frames_ = 0u;
} else if (!deadline_policy.use_existing_deadline()) {
deadline_in_frames_ = deadline_policy.deadline_in_frames();
}
UpdateDrawsContent(HasDrawableContent());
SetNeedsCommit();
}
void SurfaceLayer::SetFallbackSurfaceId(const viz::SurfaceId& surface_id) {
if (fallback_surface_id_ == surface_id)
return;
TRACE_EVENT_WITH_FLOW2(
TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
"LocalSurfaceId.Submission.Flow",
TRACE_ID_GLOBAL(surface_id.local_surface_id().submission_trace_id()),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SetFallbackSurfaceId", "surface_id", surface_id.ToString());
const viz::SurfaceRange old_surface_range(GetSurfaceRange());
if (layer_tree_host() && old_surface_range.IsValid())
layer_tree_host()->RemoveSurfaceRange(old_surface_range);
fallback_surface_id_ = surface_id;
const viz::SurfaceRange new_surface_range(GetSurfaceRange());
if (layer_tree_host() && new_surface_range.IsValid())
layer_tree_host()->AddSurfaceRange(new_surface_range);
SetNeedsCommit();
}
void SurfaceLayer::SetStretchContentToFillBounds(
bool stretch_content_to_fill_bounds) {
if (stretch_content_to_fill_bounds_ == stretch_content_to_fill_bounds)
return;
stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds;
SetNeedsPushProperties();
}
void SurfaceLayer::SetSurfaceHitTestable(bool surface_hit_testable) {
if (surface_hit_testable_ == surface_hit_testable)
return;
surface_hit_testable_ = surface_hit_testable;
SetNeedsPushProperties();
}
std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(
LayerTreeImpl* tree_impl) {
return SurfaceLayerImpl::Create(tree_impl, id());
}
bool SurfaceLayer::HasDrawableContent() const {
return primary_surface_id_.is_valid() && Layer::HasDrawableContent();
}
void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
if (layer_tree_host() == host) {
return;
}
const viz::SurfaceRange old_surface_range(GetSurfaceRange());
if (layer_tree_host() && old_surface_range.IsValid())
layer_tree_host()->RemoveSurfaceRange(old_surface_range);
Layer::SetLayerTreeHost(host);
const viz::SurfaceRange new_surface_range(GetSurfaceRange());
if (layer_tree_host() && new_surface_range.IsValid())
layer_tree_host()->AddSurfaceRange(new_surface_range);
}
void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
Layer::PushPropertiesTo(layer);
TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo");
SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
layer_impl->SetPrimarySurfaceId(primary_surface_id_,
std::move(deadline_in_frames_));
// Unless the client explicitly calls SetPrimarySurfaceId again after this
// commit, don't block on |primary_surface_id_| again.
deadline_in_frames_ = 0u;
layer_impl->SetFallbackSurfaceId(fallback_surface_id_);
layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_);
layer_impl->SetSurfaceHitTestable(surface_hit_testable_);
}
viz::SurfaceRange SurfaceLayer::GetSurfaceRange() const {
return viz::SurfaceRange(
fallback_surface_id_.is_valid()
? base::Optional<viz::SurfaceId>(fallback_surface_id_)
: base::nullopt,
primary_surface_id_.is_valid() ? primary_surface_id_
: fallback_surface_id_);
}
} // namespace cc