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/compositor_output_surface.h" | 5 #include "content/renderer/gpu/compositor_output_surface.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 11 matching lines...) Expand all Loading... |
22 #include "gpu/command_buffer/client/context_support.h" | 22 #include "gpu/command_buffer/client/context_support.h" |
23 #include "gpu/command_buffer/client/gles2_interface.h" | 23 #include "gpu/command_buffer/client/gles2_interface.h" |
24 #include "gpu/ipc/client/command_buffer_proxy_impl.h" | 24 #include "gpu/ipc/client/command_buffer_proxy_impl.h" |
25 #include "ipc/ipc_sync_channel.h" | 25 #include "ipc/ipc_sync_channel.h" |
26 | 26 |
27 namespace content { | 27 namespace content { |
28 | 28 |
29 CompositorOutputSurface::CompositorOutputSurface( | 29 CompositorOutputSurface::CompositorOutputSurface( |
30 int32_t routing_id, | 30 int32_t routing_id, |
31 uint32_t output_surface_id, | 31 uint32_t output_surface_id, |
| 32 std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
32 scoped_refptr<cc::ContextProvider> context_provider, | 33 scoped_refptr<cc::ContextProvider> context_provider, |
33 scoped_refptr<cc::ContextProvider> worker_context_provider, | 34 scoped_refptr<cc::ContextProvider> worker_context_provider, |
34 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) | 35 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) |
35 : OutputSurface(std::move(context_provider), | 36 : OutputSurface(std::move(context_provider), |
36 std::move(worker_context_provider), | 37 std::move(worker_context_provider), |
37 nullptr), | 38 nullptr), |
38 output_surface_id_(output_surface_id), | 39 output_surface_id_(output_surface_id), |
39 output_surface_filter_( | 40 output_surface_filter_( |
40 RenderThreadImpl::current()->compositor_message_filter()), | 41 RenderThreadImpl::current()->compositor_message_filter()), |
41 message_sender_(RenderThreadImpl::current()->sync_message_filter()), | 42 message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
42 frame_swap_message_queue_(swap_frame_message_queue), | 43 frame_swap_message_queue_(swap_frame_message_queue), |
| 44 begin_frame_source_(std::move(begin_frame_source)), |
43 routing_id_(routing_id) { | 45 routing_id_(routing_id) { |
44 DCHECK(output_surface_filter_); | 46 DCHECK(output_surface_filter_); |
45 DCHECK(frame_swap_message_queue_); | 47 DCHECK(frame_swap_message_queue_); |
46 DCHECK(message_sender_); | 48 DCHECK(message_sender_); |
| 49 DCHECK(begin_frame_source_); |
47 capabilities_.delegated_rendering = true; | 50 capabilities_.delegated_rendering = true; |
48 } | 51 } |
49 | 52 |
50 CompositorOutputSurface::CompositorOutputSurface( | 53 CompositorOutputSurface::CompositorOutputSurface( |
51 int32_t routing_id, | 54 int32_t routing_id, |
52 uint32_t output_surface_id, | 55 uint32_t output_surface_id, |
| 56 std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
53 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 57 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
54 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) | 58 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) |
55 : OutputSurface(std::move(vulkan_context_provider)), | 59 : OutputSurface(std::move(vulkan_context_provider)), |
56 output_surface_id_(output_surface_id), | 60 output_surface_id_(output_surface_id), |
57 output_surface_filter_( | 61 output_surface_filter_( |
58 RenderThreadImpl::current()->compositor_message_filter()), | 62 RenderThreadImpl::current()->compositor_message_filter()), |
59 message_sender_(RenderThreadImpl::current()->sync_message_filter()), | 63 message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
60 frame_swap_message_queue_(swap_frame_message_queue), | 64 frame_swap_message_queue_(swap_frame_message_queue), |
| 65 begin_frame_source_(std::move(begin_frame_source)), |
61 routing_id_(routing_id) { | 66 routing_id_(routing_id) { |
62 DCHECK(output_surface_filter_); | 67 DCHECK(output_surface_filter_); |
63 DCHECK(frame_swap_message_queue_); | 68 DCHECK(frame_swap_message_queue_); |
64 DCHECK(message_sender_); | 69 DCHECK(message_sender_); |
| 70 DCHECK(begin_frame_source_); |
65 capabilities_.delegated_rendering = true; | 71 capabilities_.delegated_rendering = true; |
66 } | 72 } |
67 | 73 |
68 CompositorOutputSurface::~CompositorOutputSurface() = default; | 74 CompositorOutputSurface::~CompositorOutputSurface() = default; |
69 | 75 |
70 bool CompositorOutputSurface::BindToClient( | 76 bool CompositorOutputSurface::BindToClient( |
71 cc::OutputSurfaceClient* client) { | 77 cc::OutputSurfaceClient* client) { |
72 if (!cc::OutputSurface::BindToClient(client)) | 78 if (!cc::OutputSurface::BindToClient(client)) |
73 return false; | 79 return false; |
74 | 80 |
| 81 DCHECK(begin_frame_source_); |
| 82 client_->SetBeginFrameSource(begin_frame_source_.get()); |
| 83 |
75 output_surface_proxy_ = new CompositorOutputSurfaceProxy(this); | 84 output_surface_proxy_ = new CompositorOutputSurfaceProxy(this); |
76 output_surface_filter_handler_ = | 85 output_surface_filter_handler_ = |
77 base::Bind(&CompositorOutputSurfaceProxy::OnMessageReceived, | 86 base::Bind(&CompositorOutputSurfaceProxy::OnMessageReceived, |
78 output_surface_proxy_); | 87 output_surface_proxy_); |
79 output_surface_filter_->AddHandlerOnCompositorThread( | 88 output_surface_filter_->AddHandlerOnCompositorThread( |
80 routing_id_, | 89 routing_id_, |
81 output_surface_filter_handler_); | 90 output_surface_filter_handler_); |
82 | 91 |
83 if (!context_provider()) { | 92 if (!context_provider()) { |
84 // Without a GPU context, the memory policy otherwise wouldn't be set. | 93 // Without a GPU context, the memory policy otherwise wouldn't be set. |
85 client->SetMemoryPolicy(cc::ManagedMemoryPolicy( | 94 client->SetMemoryPolicy(cc::ManagedMemoryPolicy( |
86 128 * 1024 * 1024, | 95 128 * 1024 * 1024, |
87 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, | 96 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, |
88 base::SharedMemory::GetHandleLimit() / 3)); | 97 base::SharedMemory::GetHandleLimit() / 3)); |
89 } | 98 } |
90 | 99 |
91 return true; | 100 return true; |
92 } | 101 } |
93 | 102 |
94 void CompositorOutputSurface::DetachFromClient() { | 103 void CompositorOutputSurface::DetachFromClient() { |
95 if (!HasClient()) | 104 if (!HasClient()) |
96 return; | 105 return; |
| 106 client_->SetBeginFrameSource(nullptr); |
| 107 // Destroy the begin frame source on the same thread it was bound on. |
| 108 // The OutputSurface itself is destroyed on the main thread. |
| 109 begin_frame_source_ = nullptr; |
| 110 |
97 if (output_surface_proxy_) { | 111 if (output_surface_proxy_) { |
98 output_surface_proxy_->ClearOutputSurface(); | 112 output_surface_proxy_->ClearOutputSurface(); |
99 output_surface_filter_->RemoveHandlerOnCompositorThread( | 113 output_surface_filter_->RemoveHandlerOnCompositorThread( |
100 routing_id_, output_surface_filter_handler_); | 114 routing_id_, output_surface_filter_handler_); |
101 } | 115 } |
102 cc::OutputSurface::DetachFromClient(); | 116 cc::OutputSurface::DetachFromClient(); |
103 } | 117 } |
104 | 118 |
105 void CompositorOutputSurface::SwapBuffers(cc::CompositorFrame frame) { | 119 void CompositorOutputSurface::SwapBuffers(cc::CompositorFrame frame) { |
106 { | 120 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 ReclaimResources(resources); | 165 ReclaimResources(resources); |
152 if (is_swap_ack) | 166 if (is_swap_ack) |
153 client_->DidSwapBuffersComplete(); | 167 client_->DidSwapBuffersComplete(); |
154 } | 168 } |
155 | 169 |
156 bool CompositorOutputSurface::Send(IPC::Message* message) { | 170 bool CompositorOutputSurface::Send(IPC::Message* message) { |
157 return message_sender_->Send(message); | 171 return message_sender_->Send(message); |
158 } | 172 } |
159 | 173 |
160 } // namespace content | 174 } // namespace content |
OLD | NEW |