joth@chromium.org | 913d99a | 2013-05-31 07:16:07 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors. All rights reserved. |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 5 | #include "content/renderer/android/synchronous_layer_tree_frame_sink.h" |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 6 | |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 7 | #include <vector> |
| 8 | |
joth@chromium.org | 3611c4b4 | 2013-06-22 07:06:14 | [diff] [blame] | 9 | #include "base/auto_reset.h" |
fdoray | 7a8954a4 | 2016-06-07 04:28:38 | [diff] [blame] | 10 | #include "base/location.h" |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 11 | #include "base/logging.h" |
avi | 1023d01 | 2015-12-25 02:39:14 | [diff] [blame] | 12 | #include "base/macros.h" |
hajimehoshi | ea85b9dc | 2016-05-25 09:52:31 | [diff] [blame] | 13 | #include "base/memory/ptr_util.h" |
fdoray | 7a8954a4 | 2016-06-07 04:28:38 | [diff] [blame] | 14 | #include "base/single_thread_task_runner.h" |
| 15 | #include "base/threading/thread_task_runner_handle.h" |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 16 | #include "cc/output/compositor_frame.h" |
boliu@chromium.org | 19e43c5 | 2013-06-08 16:46:02 | [diff] [blame] | 17 | #include "cc/output/context_provider.h" |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 18 | #include "cc/output/layer_tree_frame_sink_client.h" |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 19 | #include "cc/output/output_surface.h" |
kylechar | 5344b39e | 2016-10-06 23:51:19 | [diff] [blame] | 20 | #include "cc/output/output_surface_frame.h" |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 21 | #include "cc/output/renderer_settings.h" |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 22 | #include "cc/output/software_output_device.h" |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 23 | #include "cc/output/texture_mailbox_deleter.h" |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 24 | #include "cc/quads/render_pass.h" |
| 25 | #include "cc/quads/surface_draw_quad.h" |
samans | 923a54c | 2017-02-13 22:19:22 | [diff] [blame] | 26 | #include "cc/surfaces/compositor_frame_sink_support.h" |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 27 | #include "cc/surfaces/display.h" |
xing.xu | 1a9aa94c | 2017-02-23 21:04:32 | [diff] [blame] | 28 | #include "cc/surfaces/local_surface_id_allocator.h" |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 29 | #include "cc/surfaces/surface_manager.h" |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 30 | #include "content/common/android/sync_compositor_messages.h" |
eseckler | 9404a23 | 2017-05-22 14:49:43 | [diff] [blame] | 31 | #include "content/common/view_messages.h" |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 32 | #include "content/renderer/android/synchronous_compositor_filter.h" |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 33 | #include "content/renderer/android/synchronous_compositor_registry.h" |
mkosiba@chromium.org | 586871b | 2014-07-22 17:05:11 | [diff] [blame] | 34 | #include "content/renderer/gpu/frame_swap_message_queue.h" |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 35 | #include "content/renderer/render_thread_impl.h" |
boliu | b032a08 | 2015-06-05 20:03:15 | [diff] [blame] | 36 | #include "gpu/command_buffer/client/context_support.h" |
jamesr@chromium.org | a770f2a | 2014-01-07 22:29:23 | [diff] [blame] | 37 | #include "gpu/command_buffer/client/gles2_interface.h" |
jamesr@chromium.org | f44d555 | 2013-10-29 04:56:29 | [diff] [blame] | 38 | #include "gpu/command_buffer/common/gpu_memory_allocation.h" |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 39 | #include "ipc/ipc_message.h" |
| 40 | #include "ipc/ipc_message_macros.h" |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 41 | #include "ipc/ipc_sender.h" |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 42 | #include "third_party/skia/include/core/SkCanvas.h" |
tfarina | 3b0452d | 2014-12-31 15:20:09 | [diff] [blame] | 43 | #include "ui/gfx/geometry/rect_conversions.h" |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 44 | #include "ui/gfx/skia_util.h" |
boliu@chromium.org | a1811b891 | 2013-05-09 15:35:19 | [diff] [blame] | 45 | #include "ui/gfx/transform.h" |
boliu@chromium.org | a1811b891 | 2013-05-09 15:35:19 | [diff] [blame] | 46 | |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 47 | namespace content { |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 48 | |
boliu@chromium.org | a1811b891 | 2013-05-09 15:35:19 | [diff] [blame] | 49 | namespace { |
| 50 | |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 51 | const int64_t kFallbackTickTimeoutInMilliseconds = 100; |
samans | 46b4f407 | 2016-11-28 21:47:13 | [diff] [blame] | 52 | const cc::FrameSinkId kRootFrameSinkId(1, 1); |
| 53 | const cc::FrameSinkId kChildFrameSinkId(1, 2); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 54 | |
boliu | 77de021 | 2014-10-28 04:06:33 | [diff] [blame] | 55 | // Do not limit number of resources, so use an unrealistically high value. |
| 56 | const size_t kNumResourcesLimit = 10 * 1000 * 1000; |
| 57 | |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 58 | class SoftwareDevice : public cc::SoftwareOutputDevice { |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 59 | public: |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 60 | SoftwareDevice(SkCanvas** canvas) : canvas_(canvas) {} |
| 61 | |
danakj | 70ffc43c | 2016-10-10 21:47:30 | [diff] [blame] | 62 | void Resize(const gfx::Size& pixel_size, float device_scale_factor) override { |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 63 | // Intentional no-op: canvas size is controlled by the embedder. |
| 64 | } |
dcheng | f0217ba | 2015-02-05 19:26:33 | [diff] [blame] | 65 | SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override { |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 66 | DCHECK(*canvas_) << "BeginPaint with no canvas set"; |
| 67 | return *canvas_; |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 68 | } |
jbauman | 95f74135 | 2015-08-07 02:10:34 | [diff] [blame] | 69 | void EndPaint() override {} |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 70 | |
| 71 | private: |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 72 | SkCanvas** canvas_; |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 73 | |
| 74 | DISALLOW_COPY_AND_ASSIGN(SoftwareDevice); |
| 75 | }; |
| 76 | |
boliu | 4dae522 | 2016-07-28 00:09:45 | [diff] [blame] | 77 | } // namespace |
| 78 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 79 | class SynchronousLayerTreeFrameSink::SoftwareOutputSurface |
boliu | 4dae522 | 2016-07-28 00:09:45 | [diff] [blame] | 80 | : public cc::OutputSurface { |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 81 | public: |
| 82 | SoftwareOutputSurface(std::unique_ptr<SoftwareDevice> software_device) |
danakj | e41d978a | 2016-09-19 21:09:28 | [diff] [blame] | 83 | : cc::OutputSurface(std::move(software_device)) {} |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 84 | |
| 85 | // cc::OutputSurface implementation. |
danakj | 94486a4 | 2016-10-25 22:31:12 | [diff] [blame] | 86 | void BindToClient(cc::OutputSurfaceClient* client) override {} |
danakj | 1c77b83 | 2016-09-26 21:26:09 | [diff] [blame] | 87 | void EnsureBackbuffer() override {} |
| 88 | void DiscardBackbuffer() override {} |
| 89 | void BindFramebuffer() override {} |
jbauman | 2a2ad22 | 2017-03-02 00:35:13 | [diff] [blame] | 90 | void SetDrawRectangle(const gfx::Rect& rect) override {} |
kylechar | 5344b39e | 2016-10-06 23:51:19 | [diff] [blame] | 91 | void SwapBuffers(cc::OutputSurfaceFrame frame) override {} |
boliu | 4dae522 | 2016-07-28 00:09:45 | [diff] [blame] | 92 | void Reshape(const gfx::Size& size, |
| 93 | float scale_factor, |
| 94 | const gfx::ColorSpace& color_space, |
reveman | 9413cff | 2017-01-18 03:05:48 | [diff] [blame] | 95 | bool has_alpha, |
| 96 | bool use_stencil) override {} |
danakj | 1c77b83 | 2016-09-26 21:26:09 | [diff] [blame] | 97 | uint32_t GetFramebufferCopyTextureFormat() override { return 0; } |
| 98 | cc::OverlayCandidateValidator* GetOverlayCandidateValidator() const override { |
| 99 | return nullptr; |
| 100 | } |
| 101 | bool IsDisplayedAsOverlayPlane() const override { return false; } |
| 102 | unsigned GetOverlayTextureId() const override { return 0; } |
| 103 | bool SurfaceIsSuspendForRecycle() const override { return false; } |
| 104 | bool HasExternalStencilTest() const override { return false; } |
| 105 | void ApplyExternalStencil() override {} |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 106 | }; |
| 107 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 108 | SynchronousLayerTreeFrameSink::SynchronousLayerTreeFrameSink( |
hajimehoshi | ea85b9dc | 2016-05-25 09:52:31 | [diff] [blame] | 109 | scoped_refptr<cc::ContextProvider> context_provider, |
| 110 | scoped_refptr<cc::ContextProvider> worker_context_provider, |
piman | c44437a2 | 2016-10-29 00:09:22 | [diff] [blame] | 111 | gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
danakj | e9cf581 | 2017-02-16 22:22:55 | [diff] [blame] | 112 | cc::SharedBitmapManager* shared_bitmap_manager, |
mkosiba@chromium.org | 586871b | 2014-07-22 17:05:11 | [diff] [blame] | 113 | int routing_id, |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 114 | uint32_t layer_tree_frame_sink_id, |
enne | 077ba486 | 2016-09-12 20:59:53 | [diff] [blame] | 115 | std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 116 | SynchronousCompositorRegistry* registry, |
mkosiba@chromium.org | 586871b | 2014-07-22 17:05:11 | [diff] [blame] | 117 | scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue) |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 118 | : cc::LayerTreeFrameSink(std::move(context_provider), |
| 119 | std::move(worker_context_provider), |
| 120 | gpu_memory_buffer_manager, |
| 121 | nullptr), |
joth@chromium.org | 913d99a | 2013-05-31 07:16:07 | [diff] [blame] | 122 | routing_id_(routing_id), |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 123 | layer_tree_frame_sink_id_(layer_tree_frame_sink_id), |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 124 | registry_(registry), |
danakj | e9cf581 | 2017-02-16 22:22:55 | [diff] [blame] | 125 | shared_bitmap_manager_(shared_bitmap_manager), |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 126 | sender_(RenderThreadImpl::current()->sync_compositor_message_filter()), |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 127 | memory_policy_(0u), |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 128 | frame_swap_message_queue_(frame_swap_message_queue), |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 129 | surface_manager_(new cc::SurfaceManager), |
xing.xu | 1a9aa94c | 2017-02-23 21:04:32 | [diff] [blame] | 130 | local_surface_id_allocator_(new cc::LocalSurfaceIdAllocator()), |
enne | 077ba486 | 2016-09-12 20:59:53 | [diff] [blame] | 131 | begin_frame_source_(std::move(begin_frame_source)) { |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 132 | DCHECK(registry_); |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 133 | DCHECK(sender_); |
enne | 077ba486 | 2016-09-12 20:59:53 | [diff] [blame] | 134 | DCHECK(begin_frame_source_); |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 135 | thread_checker_.DetachFromThread(); |
boliu@chromium.org | 18a862a | 2013-10-02 10:10:55 | [diff] [blame] | 136 | memory_policy_.priority_cutoff_when_visible = |
jamesr@chromium.org | f44d555 | 2013-10-29 04:56:29 | [diff] [blame] | 137 | gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE; |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 138 | } |
| 139 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 140 | SynchronousLayerTreeFrameSink::~SynchronousLayerTreeFrameSink() = default; |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 141 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 142 | void SynchronousLayerTreeFrameSink::SetSyncClient( |
| 143 | SynchronousLayerTreeFrameSinkClient* compositor) { |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 144 | DCHECK(CalledOnValidThread()); |
| 145 | sync_client_ = compositor; |
hush | 9014453 | 2016-06-08 02:09:48 | [diff] [blame] | 146 | if (sync_client_) |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 147 | Send(new SyncCompositorHostMsg_LayerTreeFrameSinkCreated(routing_id_)); |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 148 | } |
| 149 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 150 | bool SynchronousLayerTreeFrameSink::OnMessageReceived( |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 151 | const IPC::Message& message) { |
| 152 | bool handled = true; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 153 | IPC_BEGIN_MESSAGE_MAP(SynchronousLayerTreeFrameSink, message) |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 154 | IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetMemoryPolicy, SetMemoryPolicy) |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 155 | IPC_MESSAGE_HANDLER(SyncCompositorMsg_ReclaimResources, OnReclaimResources) |
| 156 | IPC_MESSAGE_UNHANDLED(handled = false) |
| 157 | IPC_END_MESSAGE_MAP() |
| 158 | return handled; |
| 159 | } |
| 160 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 161 | bool SynchronousLayerTreeFrameSink::BindToClient( |
| 162 | cc::LayerTreeFrameSinkClient* sink_client) { |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 163 | DCHECK(CalledOnValidThread()); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 164 | if (!cc::LayerTreeFrameSink::BindToClient(sink_client)) |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 165 | return false; |
boliu@chromium.org | 0552c8e | 2013-09-10 22:44:43 | [diff] [blame] | 166 | |
enne | 077ba486 | 2016-09-12 20:59:53 | [diff] [blame] | 167 | DCHECK(begin_frame_source_); |
| 168 | client_->SetBeginFrameSource(begin_frame_source_.get()); |
sunnyps | eab5ac9 | 2015-04-02 20:26:13 | [diff] [blame] | 169 | client_->SetMemoryPolicy(memory_policy_); |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 170 | client_->SetTreeActivationCallback( |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 171 | base::Bind(&SynchronousLayerTreeFrameSink::DidActivatePendingTree, |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 172 | base::Unretained(this))); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 173 | registry_->RegisterLayerTreeFrameSink(routing_id_, this); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 174 | |
staraz | f4a164c | 2017-02-14 21:10:33 | [diff] [blame] | 175 | constexpr bool root_support_is_root = true; |
| 176 | constexpr bool child_support_is_root = false; |
| 177 | constexpr bool handles_frame_sink_id_invalidation = true; |
| 178 | constexpr bool needs_sync_points = true; |
staraz | 962f6109 | 2017-04-12 00:13:53 | [diff] [blame] | 179 | root_support_ = cc::CompositorFrameSinkSupport::Create( |
staraz | f4a164c | 2017-02-14 21:10:33 | [diff] [blame] | 180 | this, surface_manager_.get(), kRootFrameSinkId, root_support_is_root, |
staraz | 962f6109 | 2017-04-12 00:13:53 | [diff] [blame] | 181 | handles_frame_sink_id_invalidation, needs_sync_points); |
| 182 | child_support_ = cc::CompositorFrameSinkSupport::Create( |
staraz | f4a164c | 2017-02-14 21:10:33 | [diff] [blame] | 183 | this, surface_manager_.get(), kChildFrameSinkId, child_support_is_root, |
staraz | 962f6109 | 2017-04-12 00:13:53 | [diff] [blame] | 184 | handles_frame_sink_id_invalidation, needs_sync_points); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 185 | |
| 186 | cc::RendererSettings software_renderer_settings; |
| 187 | |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 188 | auto output_surface = base::MakeUnique<SoftwareOutputSurface>( |
| 189 | base::MakeUnique<SoftwareDevice>(¤t_sw_canvas_)); |
| 190 | software_output_surface_ = output_surface.get(); |
boliu | 4dae522 | 2016-07-28 00:09:45 | [diff] [blame] | 191 | |
danakj | e9cf581 | 2017-02-16 22:22:55 | [diff] [blame] | 192 | // The gpu_memory_buffer_manager here is null as the Display is only used for |
| 193 | // resourcesless software draws, where no resources are included in the frame |
| 194 | // swapped from the compositor. So there is no need for it. |
| 195 | // The shared_bitmap_manager_ is provided for the Display to allocate |
| 196 | // resources. |
| 197 | // TODO(crbug.com/692814): The Display never sends its resources out of |
| 198 | // process so there is no reason for it to use a SharedBitmapManager. |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 199 | display_.reset(new cc::Display( |
danakj | e9cf581 | 2017-02-16 22:22:55 | [diff] [blame] | 200 | shared_bitmap_manager_, nullptr /* gpu_memory_buffer_manager */, |
Alex Zhang | d3b9d65 | 2017-06-09 18:48:55 | [diff] [blame] | 201 | software_renderer_settings, kRootFrameSinkId, std::move(output_surface), |
danakj | e9cf581 | 2017-02-16 22:22:55 | [diff] [blame] | 202 | nullptr /* scheduler */, nullptr /* texture_mailbox_deleter */)); |
staraz | c9bab21 | 2016-11-10 19:27:39 | [diff] [blame] | 203 | display_->Initialize(&display_client_, surface_manager_.get()); |
danakj | 6f2861b | 2016-08-17 02:10:17 | [diff] [blame] | 204 | display_->SetVisible(true); |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 205 | return true; |
| 206 | } |
| 207 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 208 | void SynchronousLayerTreeFrameSink::DetachFromClient() { |
reveman | d180dfc3 | 2015-09-24 00:19:43 | [diff] [blame] | 209 | DCHECK(CalledOnValidThread()); |
enne | 077ba486 | 2016-09-12 20:59:53 | [diff] [blame] | 210 | client_->SetBeginFrameSource(nullptr); |
| 211 | // Destroy the begin frame source on the same thread it was bound on. |
| 212 | begin_frame_source_ = nullptr; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 213 | registry_->UnregisterLayerTreeFrameSink(routing_id_, this); |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 214 | client_->SetTreeActivationCallback(base::Closure()); |
samans | 923a54c | 2017-02-13 22:19:22 | [diff] [blame] | 215 | root_support_.reset(); |
| 216 | child_support_.reset(); |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 217 | software_output_surface_ = nullptr; |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 218 | display_ = nullptr; |
xing.xu | 1a9aa94c | 2017-02-23 21:04:32 | [diff] [blame] | 219 | local_surface_id_allocator_ = nullptr; |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 220 | surface_manager_ = nullptr; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 221 | cc::LayerTreeFrameSink::DetachFromClient(); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 222 | CancelFallbackTick(); |
reveman | d180dfc3 | 2015-09-24 00:19:43 | [diff] [blame] | 223 | } |
| 224 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 225 | void SynchronousLayerTreeFrameSink::SubmitCompositorFrame( |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 226 | cc::CompositorFrame frame) { |
boliu@chromium.org | 0552c8e | 2013-09-10 22:44:43 | [diff] [blame] | 227 | DCHECK(CalledOnValidThread()); |
boliu | 6c0ed63 | 2015-12-29 22:45:59 | [diff] [blame] | 228 | DCHECK(sync_client_); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 229 | |
danakj | ff78020 | 2016-07-08 01:07:26 | [diff] [blame] | 230 | if (fallback_tick_running_) { |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 231 | DCHECK(frame.resource_list.empty()); |
danakj | ff78020 | 2016-07-08 01:07:26 | [diff] [blame] | 232 | cc::ReturnedResourceArray return_resources; |
samans | 923a54c | 2017-02-13 22:19:22 | [diff] [blame] | 233 | ReclaimResources(return_resources); |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 234 | did_submit_frame_ = true; |
danakj | ff78020 | 2016-07-08 01:07:26 | [diff] [blame] | 235 | return; |
| 236 | } |
| 237 | |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 238 | cc::CompositorFrame submit_frame; |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 239 | |
| 240 | if (in_software_draw_) { |
| 241 | // The frame we send to the client is actually just the metadata. Preserve |
| 242 | // the |frame| for the software path below. |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 243 | submit_frame.metadata = frame.metadata.Clone(); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 244 | |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 245 | // The layer compositor should be giving a frame that covers the |
| 246 | // |sw_viewport_for_current_draw_| but at 0,0. |
| 247 | gfx::Size child_size = sw_viewport_for_current_draw_.size(); |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 248 | DCHECK(gfx::Rect(child_size) == frame.render_pass_list.back()->output_rect); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 249 | |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 250 | // Make a size that covers from 0,0 and includes the area coming from the |
| 251 | // layer compositor. |
| 252 | gfx::Size display_size(sw_viewport_for_current_draw_.right(), |
| 253 | sw_viewport_for_current_draw_.bottom()); |
| 254 | display_->Resize(display_size); |
| 255 | |
samans | cf887b6f | 2017-05-24 18:14:29 | [diff] [blame] | 256 | if (!root_local_surface_id_.is_valid() || display_size_ != display_size || |
| 257 | device_scale_factor_ != frame.metadata.device_scale_factor) { |
| 258 | root_local_surface_id_ = local_surface_id_allocator_->GenerateId(); |
| 259 | display_size_ = display_size; |
| 260 | device_scale_factor_ = frame.metadata.device_scale_factor; |
| 261 | } |
| 262 | |
| 263 | if (!child_local_surface_id_.is_valid() || child_size_ != child_size || |
| 264 | device_scale_factor_ != frame.metadata.device_scale_factor) { |
| 265 | child_local_surface_id_ = local_surface_id_allocator_->GenerateId(); |
| 266 | child_size_ = child_size; |
| 267 | device_scale_factor_ = frame.metadata.device_scale_factor; |
| 268 | } |
| 269 | |
| 270 | display_->SetLocalSurfaceId(root_local_surface_id_, |
| 271 | frame.metadata.device_scale_factor); |
| 272 | |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 273 | // The offset for the child frame relative to the origin of the canvas being |
| 274 | // drawn into. |
| 275 | gfx::Transform child_transform; |
| 276 | child_transform.Translate( |
| 277 | gfx::Vector2dF(sw_viewport_for_current_draw_.OffsetFromOrigin())); |
| 278 | |
| 279 | // Make a root frame that embeds the frame coming from the layer compositor |
| 280 | // and positions it based on the provided viewport. |
| 281 | // TODO(danakj): We could apply the transform here instead of passing it to |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 282 | // the LayerTreeFrameSink client too? (We'd have to do the same for |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 283 | // hardware frames in SurfacesInstance?) |
| 284 | cc::CompositorFrame embed_frame; |
eseckler | 6a9efe9b | 2017-03-24 16:29:56 | [diff] [blame] | 285 | embed_frame.metadata.begin_frame_ack = frame.metadata.begin_frame_ack; |
samans | cf887b6f | 2017-05-24 18:14:29 | [diff] [blame] | 286 | embed_frame.metadata.device_scale_factor = |
| 287 | frame.metadata.device_scale_factor; |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 288 | embed_frame.render_pass_list.push_back(cc::RenderPass::Create()); |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 289 | |
| 290 | // The embedding RenderPass covers the entire Display's area. |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 291 | const auto& embed_render_pass = embed_frame.render_pass_list.back(); |
ajuma | a26e5845 | 2016-12-15 22:35:01 | [diff] [blame] | 292 | embed_render_pass->SetNew(1, gfx::Rect(display_size), |
| 293 | gfx::Rect(display_size), gfx::Transform()); |
| 294 | embed_render_pass->has_transparent_background = false; |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 295 | |
| 296 | // The RenderPass has a single SurfaceDrawQuad (and SharedQuadState for it). |
| 297 | auto* shared_quad_state = |
| 298 | embed_render_pass->CreateAndAppendSharedQuadState(); |
| 299 | auto* surface_quad = |
| 300 | embed_render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
| 301 | shared_quad_state->SetAll( |
sunxd | f086659 | 2017-04-21 17:01:57 | [diff] [blame] | 302 | child_transform, gfx::Rect(child_size), gfx::Rect(child_size), |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 303 | gfx::Rect() /* clip_rect */, false /* is_clipped */, 1.f /* opacity */, |
reed | cc9c70f | 2016-11-22 04:26:01 | [diff] [blame] | 304 | SkBlendMode::kSrcOver, 0 /* sorting_context_id */); |
samans | 46b4f407 | 2016-11-28 21:47:13 | [diff] [blame] | 305 | surface_quad->SetNew( |
| 306 | shared_quad_state, gfx::Rect(child_size), gfx::Rect(child_size), |
fsamuel | 1d3252c | 2017-02-15 20:56:37 | [diff] [blame] | 307 | cc::SurfaceId(kChildFrameSinkId, child_local_surface_id_), |
| 308 | cc::SurfaceDrawQuadType::PRIMARY, nullptr); |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 309 | |
samans | cf887b6f | 2017-05-24 18:14:29 | [diff] [blame] | 310 | bool result = child_support_->SubmitCompositorFrame(child_local_surface_id_, |
| 311 | std::move(frame)); |
| 312 | DCHECK(result); |
| 313 | result = root_support_->SubmitCompositorFrame(root_local_surface_id_, |
| 314 | std::move(embed_frame)); |
| 315 | DCHECK(result); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 316 | display_->DrawAndSwap(); |
| 317 | } else { |
danakj | ff78020 | 2016-07-08 01:07:26 | [diff] [blame] | 318 | // For hardware draws we send the whole frame to the client so it can draw |
| 319 | // the content in it. |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 320 | submit_frame = std::move(frame); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 321 | } |
| 322 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 323 | sync_client_->SubmitCompositorFrame(layer_tree_frame_sink_id_, |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 324 | std::move(submit_frame)); |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 325 | did_submit_frame_ = true; |
boliu@chromium.org | a1811b891 | 2013-05-09 15:35:19 | [diff] [blame] | 326 | } |
| 327 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 328 | void SynchronousLayerTreeFrameSink::DidNotProduceFrame( |
eseckler | 9404a23 | 2017-05-22 14:49:43 | [diff] [blame] | 329 | const cc::BeginFrameAck& ack) { |
| 330 | DCHECK(!ack.has_damage); |
| 331 | DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); |
| 332 | Send(new ViewHostMsg_DidNotProduceFrame(routing_id_, ack)); |
| 333 | } |
| 334 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 335 | void SynchronousLayerTreeFrameSink::CancelFallbackTick() { |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 336 | fallback_tick_.Cancel(); |
| 337 | fallback_tick_pending_ = false; |
| 338 | } |
| 339 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 340 | void SynchronousLayerTreeFrameSink::FallbackTickFired() { |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 341 | DCHECK(CalledOnValidThread()); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 342 | TRACE_EVENT0("renderer", "SynchronousLayerTreeFrameSink::FallbackTickFired"); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 343 | base::AutoReset<bool> in_fallback_tick(&fallback_tick_running_, true); |
samans | 26510e44 | 2017-06-01 22:29:12 | [diff] [blame] | 344 | frame_swap_message_queue_->NotifyFramesAreDiscarded(true); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 345 | SkBitmap bitmap; |
| 346 | bitmap.allocN32Pixels(1, 1); |
| 347 | bitmap.eraseColor(0); |
| 348 | SkCanvas canvas(bitmap); |
| 349 | fallback_tick_pending_ = false; |
| 350 | DemandDrawSw(&canvas); |
samans | 26510e44 | 2017-06-01 22:29:12 | [diff] [blame] | 351 | frame_swap_message_queue_->NotifyFramesAreDiscarded(false); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 352 | } |
| 353 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 354 | void SynchronousLayerTreeFrameSink::Invalidate() { |
sunnyps | eab5ac9 | 2015-04-02 20:26:13 | [diff] [blame] | 355 | DCHECK(CalledOnValidThread()); |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 356 | if (sync_client_) |
| 357 | sync_client_->Invalidate(); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 358 | |
| 359 | if (!fallback_tick_pending_) { |
| 360 | fallback_tick_.Reset( |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 361 | base::Bind(&SynchronousLayerTreeFrameSink::FallbackTickFired, |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 362 | base::Unretained(this))); |
fdoray | 7a8954a4 | 2016-06-07 04:28:38 | [diff] [blame] | 363 | base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 364 | FROM_HERE, fallback_tick_.callback(), |
| 365 | base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds)); |
| 366 | fallback_tick_pending_ = true; |
| 367 | } |
boliu | 94f592a | 2014-11-21 21:18:40 | [diff] [blame] | 368 | } |
| 369 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 370 | void SynchronousLayerTreeFrameSink::DemandDrawHw( |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 371 | const gfx::Size& viewport_size, |
boliu | 6d9425ec7 | 2015-10-28 21:38:34 | [diff] [blame] | 372 | const gfx::Rect& viewport_rect_for_tile_priority, |
hush@chromium.org | bd532459 | 2014-07-31 09:09:33 | [diff] [blame] | 373 | const gfx::Transform& transform_for_tile_priority) { |
boliu@chromium.org | 19e43c5 | 2013-06-08 16:46:02 | [diff] [blame] | 374 | DCHECK(CalledOnValidThread()); |
brianderson@chromium.org | 049fc7a | 2013-06-18 12:32:35 | [diff] [blame] | 375 | DCHECK(HasClient()); |
dcheng | 165763c | 2014-10-07 04:14:54 | [diff] [blame] | 376 | DCHECK(context_provider_.get()); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 377 | CancelFallbackTick(); |
boliu@chromium.org | 19e43c5 | 2013-06-08 16:46:02 | [diff] [blame] | 378 | |
boliu | 7097ee5b | 2015-12-17 03:16:09 | [diff] [blame] | 379 | client_->SetExternalTilePriorityConstraints(viewport_rect_for_tile_priority, |
| 380 | transform_for_tile_priority); |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 381 | InvokeComposite(gfx::Transform(), gfx::Rect(viewport_size)); |
boliu@chromium.org | 19e43c5 | 2013-06-08 16:46:02 | [diff] [blame] | 382 | } |
| 383 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 384 | void SynchronousLayerTreeFrameSink::DemandDrawSw(SkCanvas* canvas) { |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 385 | DCHECK(CalledOnValidThread()); |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 386 | DCHECK(canvas); |
| 387 | DCHECK(!current_sw_canvas_); |
tobiasjs | 3fd0c95 | 2016-03-17 10:51:40 | [diff] [blame] | 388 | CancelFallbackTick(); |
sunnyps | eab5ac9 | 2015-04-02 20:26:13 | [diff] [blame] | 389 | |
joth@chromium.org | 3611c4b4 | 2013-06-22 07:06:14 | [diff] [blame] | 390 | base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas); |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 391 | |
reed | 4532514 | 2017-01-27 13:00:07 | [diff] [blame] | 392 | SkIRect canvas_clip = canvas->getDeviceClipBounds(); |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 393 | gfx::Rect viewport = gfx::SkIRectToRect(canvas_clip); |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 394 | |
aelias@chromium.org | f224cc9 | 2013-06-06 23:23:32 | [diff] [blame] | 395 | gfx::Transform transform(gfx::Transform::kSkipInitialization); |
joth@chromium.org | 1d0a6b8 | 2013-05-16 09:03:11 | [diff] [blame] | 396 | transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. |
| 397 | |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 398 | // We will resize the Display to ensure it covers the entire |viewport|, so |
| 399 | // save it for later. |
| 400 | sw_viewport_for_current_draw_ = viewport; |
| 401 | |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 402 | base::AutoReset<bool> set_in_software_draw(&in_software_draw_, true); |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 403 | InvokeComposite(transform, viewport); |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 404 | } |
| 405 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 406 | void SynchronousLayerTreeFrameSink::InvokeComposite( |
aelias@chromium.org | 54af0352 | 2013-09-05 00:43:28 | [diff] [blame] | 407 | const gfx::Transform& transform, |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 408 | const gfx::Rect& viewport) { |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 409 | did_submit_frame_ = false; |
danakj | e9e8961 | 2016-10-04 22:16:26 | [diff] [blame] | 410 | // Adjust transform so that the layer compositor draws the |viewport| rect |
| 411 | // at its origin. The offset of the |viewport| we pass to the layer compositor |
| 412 | // is ignored for drawing, so its okay to not match the transform. |
| 413 | // TODO(danakj): Why do we pass a viewport origin and then not really use it |
| 414 | // (only for comparing to the viewport passed in |
| 415 | // SetExternalTilePriorityConstraints), surely this could be more clear? |
aelias@chromium.org | 54af0352 | 2013-09-05 00:43:28 | [diff] [blame] | 416 | gfx::Transform adjusted_transform = transform; |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 417 | adjusted_transform.matrix().postTranslate(-viewport.x(), -viewport.y(), 0); |
boliu | 31c233ed | 2016-07-29 05:38:59 | [diff] [blame] | 418 | client_->OnDraw(adjusted_transform, viewport, in_software_draw_); |
aelias@chromium.org | 54af0352 | 2013-09-05 00:43:28 | [diff] [blame] | 419 | |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 420 | if (did_submit_frame_) { |
danakj | 4600da1 | 2016-07-13 21:40:10 | [diff] [blame] | 421 | // This must happen after unwinding the stack and leaving the compositor. |
| 422 | // Usually it is a separate task but we just defer it until OnDraw completes |
| 423 | // instead. |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 424 | client_->DidReceiveCompositorFrameAck(); |
danakj | 4600da1 | 2016-07-13 21:40:10 | [diff] [blame] | 425 | } |
boliu@chromium.org | a1811b891 | 2013-05-09 15:35:19 | [diff] [blame] | 426 | } |
| 427 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 428 | void SynchronousLayerTreeFrameSink::OnReclaimResources( |
| 429 | uint32_t layer_tree_frame_sink_id, |
fsamuel | b62b7822 | 2016-07-15 01:14:14 | [diff] [blame] | 430 | const cc::ReturnedResourceArray& resources) { |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 431 | // Ignore message if it's a stale one coming from a different output surface |
| 432 | // (e.g. after a lost context). |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 433 | if (layer_tree_frame_sink_id != layer_tree_frame_sink_id_) |
boliu | ec72a2ed | 2016-05-10 00:51:56 | [diff] [blame] | 434 | return; |
danakj | c54146a | 2016-09-12 21:46:18 | [diff] [blame] | 435 | client_->ReclaimResources(resources); |
boliu@chromium.org | 8705654b | 2014-05-24 01:16:19 | [diff] [blame] | 436 | } |
| 437 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 438 | void SynchronousLayerTreeFrameSink::SetMemoryPolicy(size_t bytes_limit) { |
boliu@chromium.org | 0552c8e | 2013-09-10 22:44:43 | [diff] [blame] | 439 | DCHECK(CalledOnValidThread()); |
boliu | b032a08 | 2015-06-05 20:03:15 | [diff] [blame] | 440 | bool became_zero = memory_policy_.bytes_limit_when_visible && !bytes_limit; |
| 441 | bool became_non_zero = |
| 442 | !memory_policy_.bytes_limit_when_visible && bytes_limit; |
boliu | 77de021 | 2014-10-28 04:06:33 | [diff] [blame] | 443 | memory_policy_.bytes_limit_when_visible = bytes_limit; |
| 444 | memory_policy_.num_resources_limit = kNumResourcesLimit; |
boliu@chromium.org | 0552c8e | 2013-09-10 22:44:43 | [diff] [blame] | 445 | |
sunnyps | eab5ac9 | 2015-04-02 20:26:13 | [diff] [blame] | 446 | if (client_) |
| 447 | client_->SetMemoryPolicy(memory_policy_); |
boliu | b032a08 | 2015-06-05 20:03:15 | [diff] [blame] | 448 | |
| 449 | if (became_zero) { |
| 450 | // This is small hack to drop context resources without destroying it |
| 451 | // when this compositor is put into the background. |
ericrk | 5804924 | 2015-06-22 20:32:15 | [diff] [blame] | 452 | context_provider()->ContextSupport()->SetAggressivelyFreeResources( |
| 453 | true /* aggressively_free_resources */); |
boliu | b032a08 | 2015-06-05 20:03:15 | [diff] [blame] | 454 | } else if (became_non_zero) { |
ericrk | 5804924 | 2015-06-22 20:32:15 | [diff] [blame] | 455 | context_provider()->ContextSupport()->SetAggressivelyFreeResources( |
| 456 | false /* aggressively_free_resources */); |
boliu | b032a08 | 2015-06-05 20:03:15 | [diff] [blame] | 457 | } |
boliu@chromium.org | 0552c8e | 2013-09-10 22:44:43 | [diff] [blame] | 458 | } |
| 459 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 460 | void SynchronousLayerTreeFrameSink::DidActivatePendingTree() { |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 461 | DCHECK(CalledOnValidThread()); |
| 462 | if (sync_client_) |
| 463 | sync_client_->DidActivatePendingTree(); |
| 464 | DeliverMessages(); |
boliu | 94f592a | 2014-11-21 21:18:40 | [diff] [blame] | 465 | } |
| 466 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 467 | void SynchronousLayerTreeFrameSink::DeliverMessages() { |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 468 | std::vector<std::unique_ptr<IPC::Message>> messages; |
dcheng | cedca561 | 2016-04-09 01:40:15 | [diff] [blame] | 469 | std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope = |
mkosiba@chromium.org | 586871b | 2014-07-22 17:05:11 | [diff] [blame] | 470 | frame_swap_message_queue_->AcquireSendMessageScope(); |
boliu | 5965c8d1 | 2016-05-13 23:58:19 | [diff] [blame] | 471 | frame_swap_message_queue_->DrainMessages(&messages); |
| 472 | for (auto& msg : messages) { |
| 473 | Send(msg.release()); |
| 474 | } |
mkosiba@chromium.org | 586871b | 2014-07-22 17:05:11 | [diff] [blame] | 475 | } |
| 476 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 477 | bool SynchronousLayerTreeFrameSink::Send(IPC::Message* message) { |
boliu | 42e0131 | 2016-05-12 21:47:52 | [diff] [blame] | 478 | DCHECK(CalledOnValidThread()); |
| 479 | return sender_->Send(message); |
| 480 | } |
| 481 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 482 | bool SynchronousLayerTreeFrameSink::CalledOnValidThread() const { |
boliu | dff2635 | 2015-10-12 23:47:07 | [diff] [blame] | 483 | return thread_checker_.CalledOnValidThread(); |
joth@chromium.org | 913d99a | 2013-05-31 07:16:07 | [diff] [blame] | 484 | } |
| 485 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 486 | void SynchronousLayerTreeFrameSink::DidReceiveCompositorFrameAck( |
samans | 8d3604f | 2017-04-11 22:15:30 | [diff] [blame] | 487 | const cc::ReturnedResourceArray& resources) { |
| 488 | ReclaimResources(resources); |
| 489 | } |
samans | 923a54c | 2017-02-13 22:19:22 | [diff] [blame] | 490 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 491 | void SynchronousLayerTreeFrameSink::OnBeginFrame( |
samans | 923a54c | 2017-02-13 22:19:22 | [diff] [blame] | 492 | const cc::BeginFrameArgs& args) {} |
| 493 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 494 | void SynchronousLayerTreeFrameSink::ReclaimResources( |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 495 | const cc::ReturnedResourceArray& resources) { |
| 496 | DCHECK(resources.empty()); |
fsamuel | b62b7822 | 2016-07-15 01:14:14 | [diff] [blame] | 497 | client_->ReclaimResources(resources); |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 498 | } |
| 499 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame^] | 500 | void SynchronousLayerTreeFrameSink::WillDrawSurface( |
samans | 6ede8b88 | 2017-02-17 04:22:45 | [diff] [blame] | 501 | const cc::LocalSurfaceId& local_surface_id, |
| 502 | const gfx::Rect& damage_rect) {} |
danakj | 554c98a | 2016-07-08 00:25:07 | [diff] [blame] | 503 | |
joth@chromium.org | eeb9311 | 2013-05-01 19:41:10 | [diff] [blame] | 504 | } // namespace content |