blob: 8a3bee47e1b3245c547f4372f12add4f36ad91ee [file] [log] [blame]
[email protected]b95a2ee2014-06-01 12:25:391// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakjc7afae52017-06-20 21:12:415#include "cc/surfaces/direct_layer_tree_frame_sink.h"
[email protected]b95a2ee2014-06-01 12:25:396
jamesr9b8fda32015-03-16 19:11:057#include "base/bind.h"
[email protected]b95a2ee2014-06-01 12:25:398#include "cc/output/compositor_frame.h"
danakjc7afae52017-06-20 21:12:419#include "cc/output/layer_tree_frame_sink_client.h"
[email protected]b95a2ee2014-06-01 12:25:3910#include "cc/surfaces/display.h"
fsamuelb6acafa2016-10-04 03:21:5211#include "cc/surfaces/frame_sink_id.h"
xing.xu1a9aa94c2017-02-23 21:04:3212#include "cc/surfaces/local_surface_id_allocator.h"
[email protected]b95a2ee2014-06-01 12:25:3913#include "cc/surfaces/surface.h"
14#include "cc/surfaces/surface_manager.h"
15
jbaumanf400ce532015-02-03 04:54:5916namespace cc {
[email protected]b95a2ee2014-06-01 12:25:3917
danakjc7afae52017-06-20 21:12:4118DirectLayerTreeFrameSink::DirectLayerTreeFrameSink(
fsamuelb6acafa2016-10-04 03:21:5219 const FrameSinkId& frame_sink_id,
jbaumanf400ce532015-02-03 04:54:5920 SurfaceManager* surface_manager,
danakj324faea2016-06-11 01:39:3121 Display* display,
vmpstr4065174a2016-03-16 20:44:0222 scoped_refptr<ContextProvider> context_provider,
pimanc44437a22016-10-29 00:09:2223 scoped_refptr<ContextProvider> worker_context_provider,
24 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
25 SharedBitmapManager* shared_bitmap_manager)
danakjc7afae52017-06-20 21:12:4126 : LayerTreeFrameSink(std::move(context_provider),
27 std::move(worker_context_provider),
28 gpu_memory_buffer_manager,
29 shared_bitmap_manager),
fsamuelb6acafa2016-10-04 03:21:5230 frame_sink_id_(frame_sink_id),
danakj324faea2016-06-11 01:39:3131 surface_manager_(surface_manager),
staraz9d4e3df2017-02-18 15:16:3932 display_(display) {
danakj324faea2016-06-11 01:39:3133 DCHECK(thread_checker_.CalledOnValidThread());
kylecharcf88963a82017-04-26 21:08:5734 capabilities_.must_always_swap = true;
danakjc7afae52017-06-20 21:12:4135 // Display and DirectLayerTreeFrameSink share a GL context, so sync
jbauman65182a32015-04-11 00:32:1236 // points aren't needed when passing resources between them.
37 capabilities_.delegated_sync_points_required = false;
[email protected]b95a2ee2014-06-01 12:25:3938}
39
danakjc7afae52017-06-20 21:12:4140DirectLayerTreeFrameSink::DirectLayerTreeFrameSink(
fsamuelb6acafa2016-10-04 03:21:5241 const FrameSinkId& frame_sink_id,
dyenb52ecd962016-04-20 23:23:4442 SurfaceManager* surface_manager,
danakj324faea2016-06-11 01:39:3143 Display* display,
dyenb52ecd962016-04-20 23:23:4444 scoped_refptr<VulkanContextProvider> vulkan_context_provider)
danakjc7afae52017-06-20 21:12:4145 : LayerTreeFrameSink(std::move(vulkan_context_provider)),
fsamuelb6acafa2016-10-04 03:21:5246 frame_sink_id_(frame_sink_id),
danakj324faea2016-06-11 01:39:3147 surface_manager_(surface_manager),
staraz9d4e3df2017-02-18 15:16:3948 display_(display) {
danakj324faea2016-06-11 01:39:3149 DCHECK(thread_checker_.CalledOnValidThread());
kylecharcf88963a82017-04-26 21:08:5750 capabilities_.must_always_swap = true;
dyenb52ecd962016-04-20 23:23:4451}
52
danakjc7afae52017-06-20 21:12:4153DirectLayerTreeFrameSink::~DirectLayerTreeFrameSink() {
danakj324faea2016-06-11 01:39:3154 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]b95a2ee2014-06-01 12:25:3955}
56
danakjc7afae52017-06-20 21:12:4157bool DirectLayerTreeFrameSink::BindToClient(LayerTreeFrameSinkClient* client) {
danakj324faea2016-06-11 01:39:3158 DCHECK(thread_checker_.CalledOnValidThread());
danakj4f26adf22016-06-16 19:38:2159
danakjc7afae52017-06-20 21:12:4160 if (!LayerTreeFrameSink::BindToClient(client))
danakj324faea2016-06-11 01:39:3161 return false;
enne4e3c9d52016-03-09 00:25:1262
danakj324faea2016-06-11 01:39:3163 // We want the Display's output surface to hear about lost context, and since
64 // this shares a context with it, we should not be listening for lost context
65 // callbacks on the context here.
danakj8fa15092016-10-11 00:48:0366 if (auto* cp = context_provider())
67 cp->SetLostContextCallback(base::Closure());
danakj324faea2016-06-11 01:39:3168
staraz9d4e3df2017-02-18 15:16:3969 constexpr bool is_root = true;
70 constexpr bool handles_frame_sink_id_invalidation = false;
staraz962f61092017-04-12 00:13:5371 support_ = CompositorFrameSinkSupport::Create(
staraz9d4e3df2017-02-18 15:16:3972 this, surface_manager_, frame_sink_id_, is_root,
73 handles_frame_sink_id_invalidation,
74 capabilities_.delegated_sync_points_required);
75 begin_frame_source_ = base::MakeUnique<ExternalBeginFrameSource>(this);
76 client_->SetBeginFrameSource(begin_frame_source_.get());
77
jbaumana8c5cc92014-10-03 20:51:2378 // Avoid initializing GL context here, as this should be sharing the
79 // Display's context.
jam5dc5c672017-02-08 23:19:2380 display_->Initialize(this, surface_manager_);
danakj324faea2016-06-11 01:39:3181 return true;
jbaumana8c5cc92014-10-03 20:51:2382}
83
danakjc7afae52017-06-20 21:12:4184void DirectLayerTreeFrameSink::DetachFromClient() {
staraz9d4e3df2017-02-18 15:16:3985 client_->SetBeginFrameSource(nullptr);
86 begin_frame_source_.reset();
87
jam5dc5c672017-02-08 23:19:2388 // Unregister the SurfaceFactoryClient here instead of the dtor so that only
89 // one client is alive for this namespace at any given time.
staraz9d4e3df2017-02-18 15:16:3990 support_.reset();
jam5dc5c672017-02-08 23:19:2391
danakjc7afae52017-06-20 21:12:4192 LayerTreeFrameSink::DetachFromClient();
enne4e3c9d52016-03-09 00:25:1293}
94
danakjc7afae52017-06-20 21:12:4195void DirectLayerTreeFrameSink::SubmitCompositorFrame(CompositorFrame frame) {
eseckler6a9efe9b2017-03-24 16:29:5696 DCHECK(frame.metadata.begin_frame_ack.has_damage);
97 DCHECK_LE(BeginFrameArgs::kStartingFrameNumber,
98 frame.metadata.begin_frame_ack.sequence_number);
99
samansce5c3c32016-11-18 13:47:34100 gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size();
samanscf887b6f2017-05-24 18:14:29101 if (!local_surface_id_.is_valid() || frame_size != last_swap_frame_size_ ||
102 frame.metadata.device_scale_factor != device_scale_factor_) {
103 local_surface_id_ = local_surface_id_allocator_.GenerateId();
danakje41d978a2016-09-19 21:09:28104 last_swap_frame_size_ = frame_size;
samanscf887b6f2017-05-24 18:14:29105 device_scale_factor_ = frame.metadata.device_scale_factor;
106 display_->SetLocalSurfaceId(local_surface_id_, device_scale_factor_);
danakje41d978a2016-09-19 21:09:28107 }
jam5dc5c672017-02-08 23:19:23108
samanscf887b6f2017-05-24 18:14:29109 bool result =
110 support_->SubmitCompositorFrame(local_surface_id_, std::move(frame));
111 DCHECK(result);
danakja85bd242016-06-22 22:25:49112}
113
danakjc7afae52017-06-20 21:12:41114void DirectLayerTreeFrameSink::DidNotProduceFrame(const BeginFrameAck& ack) {
eseckler9404a232017-05-22 14:49:43115 DCHECK(!ack.has_damage);
116 DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
117 support_->DidNotProduceFrame(ack);
118}
119
danakjc7afae52017-06-20 21:12:41120void DirectLayerTreeFrameSink::DisplayOutputSurfaceLost() {
danakj1120f4c2016-09-15 02:05:32121 is_lost_ = true;
danakjc7afae52017-06-20 21:12:41122 client_->DidLoseLayerTreeFrameSink();
danakj324faea2016-06-11 01:39:31123}
124
danakjc7afae52017-06-20 21:12:41125void DirectLayerTreeFrameSink::DisplayWillDrawAndSwap(
danakj014316e2016-08-04 18:40:26126 bool will_draw_and_swap,
127 const RenderPassList& render_passes) {
128 // This notification is not relevant to our client outside of tests.
129}
130
danakjc7afae52017-06-20 21:12:41131void DirectLayerTreeFrameSink::DisplayDidDrawAndSwap() {
danakj014316e2016-08-04 18:40:26132 // This notification is not relevant to our client outside of tests. We
133 // unblock the client from DidDrawCallback() when the surface is going to
134 // be drawn.
135}
136
danakjc7afae52017-06-20 21:12:41137void DirectLayerTreeFrameSink::DidReceiveCompositorFrameAck(
danakj30464ba12017-06-29 21:26:45138 const std::vector<ReturnedResource>& resources) {
samans8d3604f2017-04-11 22:15:30139 client_->ReclaimResources(resources);
danakj9d124422016-10-14 03:15:08140 client_->DidReceiveCompositorFrameAck();
jbauman878e9532014-08-23 22:10:23141}
142
danakjc7afae52017-06-20 21:12:41143void DirectLayerTreeFrameSink::OnBeginFrame(const BeginFrameArgs& args) {
staraz9d4e3df2017-02-18 15:16:39144 begin_frame_source_->OnBeginFrame(args);
145}
146
danakjc7afae52017-06-20 21:12:41147void DirectLayerTreeFrameSink::ReclaimResources(
danakj30464ba12017-06-29 21:26:45148 const std::vector<ReturnedResource>& resources) {
staraz9d4e3df2017-02-18 15:16:39149 client_->ReclaimResources(resources);
150}
151
danakjc7afae52017-06-20 21:12:41152void DirectLayerTreeFrameSink::WillDrawSurface(
staraz9d4e3df2017-02-18 15:16:39153 const LocalSurfaceId& local_surface_id,
154 const gfx::Rect& damage_rect) {
155 // TODO(staraz): Implement this.
156}
157
danakjc7afae52017-06-20 21:12:41158void DirectLayerTreeFrameSink::OnNeedsBeginFrames(bool needs_begin_frame) {
staraz9d4e3df2017-02-18 15:16:39159 support_->SetNeedsBeginFrame(needs_begin_frame);
160}
161
jbaumanf400ce532015-02-03 04:54:59162} // namespace cc