Chromium Code Reviews| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); | 81 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); |
| 82 compositor_frame_sink_filter_handler_ = | 82 compositor_frame_sink_filter_handler_ = |
| 83 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, | 83 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, |
| 84 compositor_frame_sink_proxy_); | 84 compositor_frame_sink_proxy_); |
| 85 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( | 85 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( |
| 86 routing_id_, compositor_frame_sink_filter_handler_); | 86 routing_id_, compositor_frame_sink_filter_handler_); |
| 87 return true; | 87 return true; |
| 88 } | 88 } |
| 89 | 89 |
| 90 void RendererCompositorFrameSink::DetachFromClient() { | 90 void RendererCompositorFrameSink::DetachFromClient() { |
| 91 if (!HasClient()) | |
| 92 return; | |
| 93 client_->SetBeginFrameSource(nullptr); | 91 client_->SetBeginFrameSource(nullptr); |
| 94 // Destroy the begin frame source on the same thread it was bound on. | 92 // Destroy the begin frame source on the same thread it was bound on. |
| 95 // The CompositorFrameSink itself is destroyed on the main thread. | 93 // The CompositorFrameSink itself is destroyed on the main thread. |
| 96 begin_frame_source_ = nullptr; | 94 begin_frame_source_ = nullptr; |
| 95 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); | |
| 96 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( | |
| 97 routing_id_, compositor_frame_sink_filter_handler_); | |
| 97 | 98 |
| 98 if (compositor_frame_sink_proxy_) { | |
| 99 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); | |
| 100 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( | |
| 101 routing_id_, compositor_frame_sink_filter_handler_); | |
| 102 } | |
| 103 cc::CompositorFrameSink::DetachFromClient(); | 99 cc::CompositorFrameSink::DetachFromClient(); |
| 104 } | 100 } |
| 105 | 101 |
| 106 void RendererCompositorFrameSink::SwapBuffers(cc::CompositorFrame frame) { | 102 void RendererCompositorFrameSink::SwapBuffers(cc::CompositorFrame frame) { |
| 107 { | 103 { |
| 108 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> | 104 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> |
| 109 send_message_scope = | 105 send_message_scope = |
| 110 frame_swap_message_queue_->AcquireSendMessageScope(); | 106 frame_swap_message_queue_->AcquireSendMessageScope(); |
| 111 std::vector<std::unique_ptr<IPC::Message>> messages; | 107 std::vector<std::unique_ptr<IPC::Message>> messages; |
| 112 std::vector<IPC::Message> messages_to_deliver_with_frame; | 108 std::vector<IPC::Message> messages_to_deliver_with_frame; |
| 113 frame_swap_message_queue_->DrainMessages(&messages); | 109 frame_swap_message_queue_->DrainMessages(&messages); |
| 114 FrameSwapMessageQueue::TransferMessages(&messages, | 110 FrameSwapMessageQueue::TransferMessages(&messages, |
| 115 &messages_to_deliver_with_frame); | 111 &messages_to_deliver_with_frame); |
| 116 Send(new ViewHostMsg_SwapCompositorFrame(routing_id_, | 112 Send(new ViewHostMsg_SwapCompositorFrame(routing_id_, |
| 117 compositor_frame_sink_id_, frame, | 113 compositor_frame_sink_id_, frame, |
| 118 messages_to_deliver_with_frame)); | 114 messages_to_deliver_with_frame)); |
| 119 // ~send_message_scope. | 115 // ~send_message_scope. |
| 120 } | 116 } |
| 121 } | 117 } |
| 122 | 118 |
| 123 void RendererCompositorFrameSink::OnMessageReceived( | 119 void RendererCompositorFrameSink::OnMessageReceived( |
| 124 const IPC::Message& message) { | 120 const IPC::Message& message) { |
| 125 DCHECK(client_thread_checker_.CalledOnValidThread()); | 121 DCHECK(client_thread_checker_.CalledOnValidThread()); |
| 126 if (!HasClient()) | |
|
danakj
2016/10/10 22:13:03
This looks "interesting" but AFAICT DetachFromClie
| |
| 127 return; | |
| 128 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) | 122 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) |
| 129 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, | 123 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, |
| 130 OnReclaimCompositorResources); | 124 OnReclaimCompositorResources); |
| 131 IPC_END_MESSAGE_MAP() | 125 IPC_END_MESSAGE_MAP() |
| 132 } | 126 } |
| 133 | 127 |
| 134 void RendererCompositorFrameSink::OnReclaimCompositorResources( | 128 void RendererCompositorFrameSink::OnReclaimCompositorResources( |
| 135 uint32_t compositor_frame_sink_id, | 129 uint32_t compositor_frame_sink_id, |
| 136 bool is_swap_ack, | 130 bool is_swap_ack, |
| 137 const cc::ReturnedResourceArray& resources) { | 131 const cc::ReturnedResourceArray& resources) { |
| 138 // Ignore message if it's a stale one coming from a different output surface | 132 // Ignore message if it's a stale one coming from a different output surface |
| 139 // (e.g. after a lost context). | 133 // (e.g. after a lost context). |
| 140 if (compositor_frame_sink_id != compositor_frame_sink_id_) | 134 if (compositor_frame_sink_id != compositor_frame_sink_id_) |
| 141 return; | 135 return; |
| 142 client_->ReclaimResources(resources); | 136 client_->ReclaimResources(resources); |
| 143 if (is_swap_ack) | 137 if (is_swap_ack) |
| 144 client_->DidSwapBuffersComplete(); | 138 client_->DidSwapBuffersComplete(); |
| 145 } | 139 } |
| 146 | 140 |
| 147 bool RendererCompositorFrameSink::Send(IPC::Message* message) { | 141 bool RendererCompositorFrameSink::Send(IPC::Message* message) { |
| 148 return message_sender_->Send(message); | 142 return message_sender_->Send(message); |
| 149 } | 143 } |
| 150 | 144 |
| 151 } // namespace content | 145 } // namespace content |
| OLD | NEW |