| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h" | 5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 compositor_frame_sink_filter_( | 43 compositor_frame_sink_filter_( |
| 44 RenderThreadImpl::current()->compositor_message_filter()), | 44 RenderThreadImpl::current()->compositor_message_filter()), |
| 45 message_sender_(RenderThreadImpl::current()->sync_message_filter()), | 45 message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
| 46 frame_swap_message_queue_(swap_frame_message_queue), | 46 frame_swap_message_queue_(swap_frame_message_queue), |
| 47 begin_frame_source_(std::move(begin_frame_source)), | 47 begin_frame_source_(std::move(begin_frame_source)), |
| 48 routing_id_(routing_id) { | 48 routing_id_(routing_id) { |
| 49 DCHECK(compositor_frame_sink_filter_); | 49 DCHECK(compositor_frame_sink_filter_); |
| 50 DCHECK(frame_swap_message_queue_); | 50 DCHECK(frame_swap_message_queue_); |
| 51 DCHECK(message_sender_); | 51 DCHECK(message_sender_); |
| 52 DCHECK(begin_frame_source_); | 52 DCHECK(begin_frame_source_); |
| 53 thread_checker_.DetachFromThread(); |
| 53 } | 54 } |
| 54 | 55 |
| 55 RendererCompositorFrameSink::RendererCompositorFrameSink( | 56 RendererCompositorFrameSink::RendererCompositorFrameSink( |
| 56 int32_t routing_id, | 57 int32_t routing_id, |
| 57 uint32_t compositor_frame_sink_id, | 58 uint32_t compositor_frame_sink_id, |
| 58 std::unique_ptr<cc::BeginFrameSource> begin_frame_source, | 59 std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
| 59 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 60 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
| 60 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) | 61 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) |
| 61 : CompositorFrameSink(std::move(vulkan_context_provider)), | 62 : CompositorFrameSink(std::move(vulkan_context_provider)), |
| 62 compositor_frame_sink_id_(compositor_frame_sink_id), | 63 compositor_frame_sink_id_(compositor_frame_sink_id), |
| 63 compositor_frame_sink_filter_( | 64 compositor_frame_sink_filter_( |
| 64 RenderThreadImpl::current()->compositor_message_filter()), | 65 RenderThreadImpl::current()->compositor_message_filter()), |
| 65 message_sender_(RenderThreadImpl::current()->sync_message_filter()), | 66 message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
| 66 frame_swap_message_queue_(swap_frame_message_queue), | 67 frame_swap_message_queue_(swap_frame_message_queue), |
| 67 begin_frame_source_(std::move(begin_frame_source)), | 68 begin_frame_source_(std::move(begin_frame_source)), |
| 68 routing_id_(routing_id) { | 69 routing_id_(routing_id) { |
| 69 DCHECK(compositor_frame_sink_filter_); | 70 DCHECK(compositor_frame_sink_filter_); |
| 70 DCHECK(frame_swap_message_queue_); | 71 DCHECK(frame_swap_message_queue_); |
| 71 DCHECK(message_sender_); | 72 DCHECK(message_sender_); |
| 72 DCHECK(begin_frame_source_); | 73 DCHECK(begin_frame_source_); |
| 74 thread_checker_.DetachFromThread(); |
| 73 } | 75 } |
| 74 | 76 |
| 75 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default; | 77 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default; |
| 76 | 78 |
| 77 bool RendererCompositorFrameSink::BindToClient( | 79 bool RendererCompositorFrameSink::BindToClient( |
| 78 cc::CompositorFrameSinkClient* client) { | 80 cc::CompositorFrameSinkClient* client) { |
| 81 DCHECK(thread_checker_.CalledOnValidThread()); |
| 79 if (!cc::CompositorFrameSink::BindToClient(client)) | 82 if (!cc::CompositorFrameSink::BindToClient(client)) |
| 80 return false; | 83 return false; |
| 81 | 84 |
| 82 DCHECK(begin_frame_source_); | 85 DCHECK(begin_frame_source_); |
| 83 client_->SetBeginFrameSource(begin_frame_source_.get()); | 86 client_->SetBeginFrameSource(begin_frame_source_.get()); |
| 84 | 87 |
| 85 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); | 88 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); |
| 86 compositor_frame_sink_filter_handler_ = | 89 compositor_frame_sink_filter_handler_ = |
| 87 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, | 90 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, |
| 88 compositor_frame_sink_proxy_); | 91 compositor_frame_sink_proxy_); |
| 89 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( | 92 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( |
| 90 routing_id_, compositor_frame_sink_filter_handler_); | 93 routing_id_, compositor_frame_sink_filter_handler_); |
| 91 return true; | 94 return true; |
| 92 } | 95 } |
| 93 | 96 |
| 94 void RendererCompositorFrameSink::DetachFromClient() { | 97 void RendererCompositorFrameSink::DetachFromClient() { |
| 98 DCHECK(thread_checker_.CalledOnValidThread()); |
| 95 client_->SetBeginFrameSource(nullptr); | 99 client_->SetBeginFrameSource(nullptr); |
| 96 // Destroy the begin frame source on the same thread it was bound on. | 100 // Destroy the begin frame source on the same thread it was bound on. |
| 97 // The CompositorFrameSink itself is destroyed on the main thread. | 101 // The CompositorFrameSink itself is destroyed on the main thread. |
| 98 begin_frame_source_ = nullptr; | 102 begin_frame_source_ = nullptr; |
| 99 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); | 103 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); |
| 100 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( | 104 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( |
| 101 routing_id_, compositor_frame_sink_filter_handler_); | 105 routing_id_, compositor_frame_sink_filter_handler_); |
| 102 | 106 |
| 103 cc::CompositorFrameSink::DetachFromClient(); | 107 cc::CompositorFrameSink::DetachFromClient(); |
| 104 } | 108 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 116 &messages_to_deliver_with_frame); | 120 &messages_to_deliver_with_frame); |
| 117 Send(new ViewHostMsg_SwapCompositorFrame(routing_id_, | 121 Send(new ViewHostMsg_SwapCompositorFrame(routing_id_, |
| 118 compositor_frame_sink_id_, frame, | 122 compositor_frame_sink_id_, frame, |
| 119 messages_to_deliver_with_frame)); | 123 messages_to_deliver_with_frame)); |
| 120 // ~send_message_scope. | 124 // ~send_message_scope. |
| 121 } | 125 } |
| 122 } | 126 } |
| 123 | 127 |
| 124 void RendererCompositorFrameSink::OnMessageReceived( | 128 void RendererCompositorFrameSink::OnMessageReceived( |
| 125 const IPC::Message& message) { | 129 const IPC::Message& message) { |
| 126 DCHECK(client_thread_checker_.CalledOnValidThread()); | 130 DCHECK(thread_checker_.CalledOnValidThread()); |
| 127 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) | 131 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) |
| 128 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, | 132 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, |
| 129 OnReclaimCompositorResources); | 133 OnReclaimCompositorResources); |
| 130 IPC_END_MESSAGE_MAP() | 134 IPC_END_MESSAGE_MAP() |
| 131 } | 135 } |
| 132 | 136 |
| 133 void RendererCompositorFrameSink::OnReclaimCompositorResources( | 137 void RendererCompositorFrameSink::OnReclaimCompositorResources( |
| 134 uint32_t compositor_frame_sink_id, | 138 uint32_t compositor_frame_sink_id, |
| 135 bool is_swap_ack, | 139 bool is_swap_ack, |
| 136 const cc::ReturnedResourceArray& resources) { | 140 const cc::ReturnedResourceArray& resources) { |
| 137 // Ignore message if it's a stale one coming from a different output surface | 141 // Ignore message if it's a stale one coming from a different output surface |
| 138 // (e.g. after a lost context). | 142 // (e.g. after a lost context). |
| 139 if (compositor_frame_sink_id != compositor_frame_sink_id_) | 143 if (compositor_frame_sink_id != compositor_frame_sink_id_) |
| 140 return; | 144 return; |
| 141 client_->ReclaimResources(resources); | 145 client_->ReclaimResources(resources); |
| 142 if (is_swap_ack) | 146 if (is_swap_ack) |
| 143 client_->DidReceiveCompositorFrameAck(); | 147 client_->DidReceiveCompositorFrameAck(); |
| 144 } | 148 } |
| 145 | 149 |
| 146 bool RendererCompositorFrameSink::Send(IPC::Message* message) { | 150 bool RendererCompositorFrameSink::Send(IPC::Message* message) { |
| 147 return message_sender_->Send(message); | 151 return message_sender_->Send(message); |
| 148 } | 152 } |
| 149 | 153 |
| 150 } // namespace content | 154 } // namespace content |
| OLD | NEW |