blob: 194a08e7be50f4de6ca595b1e47dec2cd2979f25 [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
danakj1120f4c2016-09-15 02:05:325#include "cc/surfaces/direct_compositor_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"
danakj1120f4c2016-09-15 02:05:329#include "cc/output/compositor_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"
[email protected]b95a2ee2014-06-01 12:25:3912#include "cc/surfaces/surface.h"
danakj324faea2016-06-11 01:39:3113#include "cc/surfaces/surface_id_allocator.h"
[email protected]b95a2ee2014-06-01 12:25:3914#include "cc/surfaces/surface_manager.h"
15
jbaumanf400ce532015-02-03 04:54:5916namespace cc {
[email protected]b95a2ee2014-06-01 12:25:3917
danakj1120f4c2016-09-15 02:05:3218DirectCompositorFrameSink::DirectCompositorFrameSink(
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,
23 scoped_refptr<ContextProvider> worker_context_provider)
danakj1120f4c2016-09-15 02:05:3224 : CompositorFrameSink(std::move(context_provider),
danakje41d978a2016-09-19 21:09:2825 std::move(worker_context_provider)),
fsamuelb6acafa2016-10-04 03:21:5226 frame_sink_id_(frame_sink_id),
danakj324faea2016-06-11 01:39:3127 surface_manager_(surface_manager),
danakj324faea2016-06-11 01:39:3128 display_(display),
fsamuelb6acafa2016-10-04 03:21:5229 factory_(frame_sink_id, surface_manager, this) {
danakj324faea2016-06-11 01:39:3130 DCHECK(thread_checker_.CalledOnValidThread());
jbauman9bfb1a52015-01-09 08:16:0331 capabilities_.can_force_reclaim_resources = true;
danakj1120f4c2016-09-15 02:05:3232 // Display and DirectCompositorFrameSink share a GL context, so sync
jbauman65182a32015-04-11 00:32:1233 // points aren't needed when passing resources between them.
34 capabilities_.delegated_sync_points_required = false;
danakj324faea2016-06-11 01:39:3135 factory_.set_needs_sync_points(false);
[email protected]b95a2ee2014-06-01 12:25:3936}
37
danakj1120f4c2016-09-15 02:05:3238DirectCompositorFrameSink::DirectCompositorFrameSink(
fsamuelb6acafa2016-10-04 03:21:5239 const FrameSinkId& frame_sink_id,
dyenb52ecd962016-04-20 23:23:4440 SurfaceManager* surface_manager,
danakj324faea2016-06-11 01:39:3141 Display* display,
dyenb52ecd962016-04-20 23:23:4442 scoped_refptr<VulkanContextProvider> vulkan_context_provider)
danakj1120f4c2016-09-15 02:05:3243 : CompositorFrameSink(std::move(vulkan_context_provider)),
fsamuelb6acafa2016-10-04 03:21:5244 frame_sink_id_(frame_sink_id),
danakj324faea2016-06-11 01:39:3145 surface_manager_(surface_manager),
danakj324faea2016-06-11 01:39:3146 display_(display),
fsamuelb6acafa2016-10-04 03:21:5247 factory_(frame_sink_id_, surface_manager, this) {
danakj324faea2016-06-11 01:39:3148 DCHECK(thread_checker_.CalledOnValidThread());
dyenb52ecd962016-04-20 23:23:4449 capabilities_.can_force_reclaim_resources = true;
50}
51
danakj1120f4c2016-09-15 02:05:3252DirectCompositorFrameSink::~DirectCompositorFrameSink() {
danakj324faea2016-06-11 01:39:3153 DCHECK(thread_checker_.CalledOnValidThread());
[email protected]b95a2ee2014-06-01 12:25:3954}
55
danakj1120f4c2016-09-15 02:05:3256bool DirectCompositorFrameSink::BindToClient(
57 CompositorFrameSinkClient* client) {
danakj324faea2016-06-11 01:39:3158 DCHECK(thread_checker_.CalledOnValidThread());
danakj4f26adf22016-06-16 19:38:2159
danakj1120f4c2016-09-15 02:05:3260 if (!CompositorFrameSink::BindToClient(client))
danakj324faea2016-06-11 01:39:3161 return false;
enne4e3c9d52016-03-09 00:25:1262
danakj8fa15092016-10-11 00:48:0363 surface_manager_->RegisterSurfaceFactoryClient(frame_sink_id_, this);
64
danakj324faea2016-06-11 01:39:3165 // We want the Display's output surface to hear about lost context, and since
66 // this shares a context with it, we should not be listening for lost context
67 // callbacks on the context here.
danakj8fa15092016-10-11 00:48:0368 if (auto* cp = context_provider())
69 cp->SetLostContextCallback(base::Closure());
danakj324faea2016-06-11 01:39:3170
jbaumana8c5cc92014-10-03 20:51:2371 // Avoid initializing GL context here, as this should be sharing the
72 // Display's context.
fsamuelb6acafa2016-10-04 03:21:5273 display_->Initialize(this, surface_manager_, frame_sink_id_);
danakj324faea2016-06-11 01:39:3174 return true;
jbaumana8c5cc92014-10-03 20:51:2375}
76
danakj1120f4c2016-09-15 02:05:3277void DirectCompositorFrameSink::DetachFromClient() {
enne4e3c9d52016-03-09 00:25:1278 // Unregister the SurfaceFactoryClient here instead of the dtor so that only
79 // one client is alive for this namespace at any given time.
fsamuelb6acafa2016-10-04 03:21:5280 surface_manager_->UnregisterSurfaceFactoryClient(frame_sink_id_);
fsamuel01f36202016-10-06 01:08:2881 if (!delegated_local_frame_id_.is_null())
82 factory_.Destroy(delegated_local_frame_id_);
danakj324faea2016-06-11 01:39:3183
danakj1120f4c2016-09-15 02:05:3284 CompositorFrameSink::DetachFromClient();
enne4e3c9d52016-03-09 00:25:1285}
86
danakj9d124422016-10-14 03:15:0887void DirectCompositorFrameSink::SubmitCompositorFrame(CompositorFrame frame) {
danakje41d978a2016-09-19 21:09:2888 gfx::Size frame_size =
89 frame.delegated_frame_data->render_pass_list.back()->output_rect.size();
90 if (frame_size.IsEmpty() || frame_size != last_swap_frame_size_) {
fsamuel01f36202016-10-06 01:08:2891 if (!delegated_local_frame_id_.is_null()) {
92 factory_.Destroy(delegated_local_frame_id_);
danakje41d978a2016-09-19 21:09:2893 }
fsamuel01f36202016-10-06 01:08:2894 delegated_local_frame_id_ = surface_id_allocator_.GenerateId();
95 factory_.Create(delegated_local_frame_id_);
danakje41d978a2016-09-19 21:09:2896 last_swap_frame_size_ = frame_size;
97 }
fsamuel01f36202016-10-06 01:08:2898 display_->SetSurfaceId(SurfaceId(frame_sink_id_, delegated_local_frame_id_),
danakje41d978a2016-09-19 21:09:2899 frame.metadata.device_scale_factor);
100
101 factory_.SubmitCompositorFrame(
fsamuel01f36202016-10-06 01:08:28102 delegated_local_frame_id_, std::move(frame),
danakje41d978a2016-09-19 21:09:28103 base::Bind(&DirectCompositorFrameSink::DidDrawCallback,
104 base::Unretained(this)));
danakja85bd242016-06-22 22:25:49105}
106
danakje41d978a2016-09-19 21:09:28107void DirectCompositorFrameSink::ForceReclaimResources() {
fsamuel01f36202016-10-06 01:08:28108 if (!delegated_local_frame_id_.is_null()) {
109 factory_.SubmitCompositorFrame(delegated_local_frame_id_, CompositorFrame(),
danakje41d978a2016-09-19 21:09:28110 SurfaceFactory::DrawCallback());
111 }
danakja85bd242016-06-22 22:25:49112}
113
danakj1120f4c2016-09-15 02:05:32114void DirectCompositorFrameSink::ReturnResources(
jbaumanf400ce532015-02-03 04:54:59115 const ReturnedResourceArray& resources) {
[email protected]72728b12014-07-18 03:39:17116 if (client_)
fsamuelb62b78222016-07-15 01:14:14117 client_->ReclaimResources(resources);
[email protected]387b59d2014-06-27 01:17:34118}
119
danakj1120f4c2016-09-15 02:05:32120void DirectCompositorFrameSink::SetBeginFrameSource(
brianderson877996b02015-10-20 20:35:31121 BeginFrameSource* begin_frame_source) {
enne19c108582016-04-14 03:35:32122 DCHECK(client_);
123 client_->SetBeginFrameSource(begin_frame_source);
brianderson877996b02015-10-20 20:35:31124}
125
danakj1120f4c2016-09-15 02:05:32126void DirectCompositorFrameSink::DisplayOutputSurfaceLost() {
127 is_lost_ = true;
128 client_->DidLoseCompositorFrameSink();
danakj324faea2016-06-11 01:39:31129}
130
danakj1120f4c2016-09-15 02:05:32131void DirectCompositorFrameSink::DisplayWillDrawAndSwap(
danakj014316e2016-08-04 18:40:26132 bool will_draw_and_swap,
133 const RenderPassList& render_passes) {
134 // This notification is not relevant to our client outside of tests.
135}
136
danakj1120f4c2016-09-15 02:05:32137void DirectCompositorFrameSink::DisplayDidDrawAndSwap() {
danakj014316e2016-08-04 18:40:26138 // This notification is not relevant to our client outside of tests. We
139 // unblock the client from DidDrawCallback() when the surface is going to
140 // be drawn.
141}
142
danakj1120f4c2016-09-15 02:05:32143void DirectCompositorFrameSink::DidDrawCallback() {
danakj9d124422016-10-14 03:15:08144 client_->DidReceiveCompositorFrameAck();
jbauman878e9532014-08-23 22:10:23145}
146
jbaumanf400ce532015-02-03 04:54:59147} // namespace cc