Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(920)

Side by Side Diff: content/renderer/gpu/compositor_output_surface.cc

Issue 619843002: cc: Make separate interface for BeginFrame ipc from OutputSurface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/message_loop/message_loop_proxy.h" 8 #include "base/message_loop/message_loop_proxy.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h" 10 #include "cc/output/compositor_frame_ack.h"
(...skipping 12 matching lines...) Expand all
23 #include "ipc/ipc_sync_channel.h" 23 #include "ipc/ipc_sync_channel.h"
24 24
25 namespace { 25 namespace {
26 // There are several compositor surfaces in a process, but they share the same 26 // There are several compositor surfaces in a process, but they share the same
27 // compositor thread, so we use a simple int here to track prefer-smoothness. 27 // compositor thread, so we use a simple int here to track prefer-smoothness.
28 int g_prefer_smoothness_count = 0; 28 int g_prefer_smoothness_count = 0;
29 } // namespace 29 } // namespace
30 30
31 namespace content { 31 namespace content {
32 32
33 //------------------------------------------------------------------------------
34
35 // static
36 IPC::ForwardingMessageFilter* CompositorOutputSurface::CreateFilter(
37 base::TaskRunner* target_task_runner)
38 {
39 uint32 messages_to_filter[] = {
40 ViewMsg_UpdateVSyncParameters::ID,
41 ViewMsg_SwapCompositorFrameAck::ID,
42 ViewMsg_ReclaimCompositorResources::ID,
43 #if defined(OS_ANDROID)
44 ViewMsg_BeginFrame::ID
45 #endif
46 };
47
48 return new IPC::ForwardingMessageFilter(
49 messages_to_filter, arraysize(messages_to_filter),
50 target_task_runner);
51 }
52
53 CompositorOutputSurface::CompositorOutputSurface( 33 CompositorOutputSurface::CompositorOutputSurface(
54 int32 routing_id, 34 int32 routing_id,
55 uint32 output_surface_id, 35 uint32 output_surface_id,
56 const scoped_refptr<ContextProviderCommandBuffer>& context_provider, 36 const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
57 scoped_ptr<cc::SoftwareOutputDevice> software_device, 37 scoped_ptr<cc::SoftwareOutputDevice> software_device,
58 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue, 38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue,
59 bool use_swap_compositor_frame_message) 39 bool use_swap_compositor_frame_message)
60 : OutputSurface(context_provider, software_device.Pass()), 40 : OutputSurface(context_provider, software_device.Pass()),
61 output_surface_id_(output_surface_id), 41 output_surface_id_(output_surface_id),
62 use_swap_compositor_frame_message_(use_swap_compositor_frame_message), 42 use_swap_compositor_frame_message_(use_swap_compositor_frame_message),
63 output_surface_filter_( 43 output_surface_filter_(
64 RenderThreadImpl::current()->compositor_output_surface_filter()), 44 RenderThreadImpl::current()->compositor_message_filter()),
65 frame_swap_message_queue_(swap_frame_message_queue), 45 frame_swap_message_queue_(swap_frame_message_queue),
66 routing_id_(routing_id), 46 routing_id_(routing_id),
67 prefers_smoothness_(false), 47 prefers_smoothness_(false),
68 #if defined(OS_WIN) 48 #if defined(OS_WIN)
69 // TODO(epenner): Implement PlatformThread::CurrentHandle() on windows. 49 // TODO(epenner): Implement PlatformThread::CurrentHandle() on windows.
70 main_thread_handle_(base::PlatformThreadHandle()), 50 main_thread_handle_(base::PlatformThreadHandle()),
71 #else 51 #else
72 main_thread_handle_(base::PlatformThread::CurrentHandle()), 52 main_thread_handle_(base::PlatformThread::CurrentHandle()),
73 #endif 53 #endif
74 layout_test_mode_(RenderThreadImpl::current()->layout_test_mode()), 54 layout_test_mode_(RenderThreadImpl::current()->layout_test_mode()),
75 weak_ptrs_(this) { 55 weak_ptrs_(this) {
76 DCHECK(output_surface_filter_.get()); 56 DCHECK(output_surface_filter_.get());
77 DCHECK(frame_swap_message_queue_.get()); 57 DCHECK(frame_swap_message_queue_.get());
78 DetachFromThread(); 58 DetachFromThread();
79 message_sender_ = RenderThreadImpl::current()->sync_message_filter(); 59 message_sender_ = RenderThreadImpl::current()->sync_message_filter();
80 DCHECK(message_sender_.get()); 60 DCHECK(message_sender_.get());
81 if (OutputSurface::software_device()) 61 if (OutputSurface::software_device())
82 capabilities_.max_frames_pending = 1; 62 capabilities_.max_frames_pending = 1;
83 } 63 }
84 64
85 CompositorOutputSurface::~CompositorOutputSurface() { 65 CompositorOutputSurface::~CompositorOutputSurface() {
86 DCHECK(CalledOnValidThread()); 66 DCHECK(CalledOnValidThread());
87 SetNeedsBeginFrame(false);
88 if (!HasClient()) 67 if (!HasClient())
89 return; 68 return;
90 UpdateSmoothnessTakesPriority(false); 69 UpdateSmoothnessTakesPriority(false);
91 if (output_surface_proxy_.get()) 70 if (output_surface_proxy_.get())
92 output_surface_proxy_->ClearOutputSurface(); 71 output_surface_proxy_->ClearOutputSurface();
93 output_surface_filter_->RemoveRoute(routing_id_); 72 output_surface_filter_->RemoveRoute(routing_id_);
94 } 73 }
95 74
96 bool CompositorOutputSurface::BindToClient( 75 bool CompositorOutputSurface::BindToClient(
97 cc::OutputSurfaceClient* client) { 76 cc::OutputSurfaceClient* client) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 165
187 void CompositorOutputSurface::OnMessageReceived(const IPC::Message& message) { 166 void CompositorOutputSurface::OnMessageReceived(const IPC::Message& message) {
188 DCHECK(CalledOnValidThread()); 167 DCHECK(CalledOnValidThread());
189 if (!HasClient()) 168 if (!HasClient())
190 return; 169 return;
191 IPC_BEGIN_MESSAGE_MAP(CompositorOutputSurface, message) 170 IPC_BEGIN_MESSAGE_MAP(CompositorOutputSurface, message)
192 IPC_MESSAGE_HANDLER(ViewMsg_UpdateVSyncParameters, 171 IPC_MESSAGE_HANDLER(ViewMsg_UpdateVSyncParameters,
193 OnUpdateVSyncParametersFromBrowser); 172 OnUpdateVSyncParametersFromBrowser);
194 IPC_MESSAGE_HANDLER(ViewMsg_SwapCompositorFrameAck, OnSwapAck); 173 IPC_MESSAGE_HANDLER(ViewMsg_SwapCompositorFrameAck, OnSwapAck);
195 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, OnReclaimResources); 174 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, OnReclaimResources);
196 #if defined(OS_ANDROID)
197 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame);
198 #endif
199 IPC_END_MESSAGE_MAP() 175 IPC_END_MESSAGE_MAP()
200 } 176 }
201 177
202 void CompositorOutputSurface::OnUpdateVSyncParametersFromBrowser( 178 void CompositorOutputSurface::OnUpdateVSyncParametersFromBrowser(
203 base::TimeTicks timebase, 179 base::TimeTicks timebase,
204 base::TimeDelta interval) { 180 base::TimeDelta interval) {
205 DCHECK(CalledOnValidThread()); 181 DCHECK(CalledOnValidThread());
206 CommitVSyncParameters(timebase, interval); 182 CommitVSyncParameters(timebase, interval);
207 } 183 }
208 184
209 #if defined(OS_ANDROID)
210 void CompositorOutputSurface::SetNeedsBeginFrame(bool enable) {
211 DCHECK(CalledOnValidThread());
212 Send(new ViewHostMsg_SetNeedsBeginFrame(routing_id_, enable));
213 }
214
215 void CompositorOutputSurface::OnBeginFrame(const cc::BeginFrameArgs& args) {
216 DCHECK(CalledOnValidThread());
217 client_->BeginFrame(args);
218 }
219 #endif // defined(OS_ANDROID)
220
221 void CompositorOutputSurface::OnSwapAck(uint32 output_surface_id, 185 void CompositorOutputSurface::OnSwapAck(uint32 output_surface_id,
222 const cc::CompositorFrameAck& ack) { 186 const cc::CompositorFrameAck& ack) {
223 // Ignore message if it's a stale one coming from a different output surface 187 // Ignore message if it's a stale one coming from a different output surface
224 // (e.g. after a lost context). 188 // (e.g. after a lost context).
225 if (output_surface_id != output_surface_id_) 189 if (output_surface_id != output_surface_id_)
226 return; 190 return;
227 ReclaimResources(&ack); 191 ReclaimResources(&ack);
228 client_->DidSwapBuffersComplete(); 192 client_->DidSwapBuffersComplete();
229 } 193 }
230 194
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 // If this is the last surface to stop preferring smoothness, 241 // If this is the last surface to stop preferring smoothness,
278 // Reset the main thread's priority to the default. 242 // Reset the main thread's priority to the default.
279 if (prefers_smoothness_ == true && 243 if (prefers_smoothness_ == true &&
280 --g_prefer_smoothness_count == 0) { 244 --g_prefer_smoothness_count == 0) {
281 SetThreadPriorityToDefault(main_thread_handle_); 245 SetThreadPriorityToDefault(main_thread_handle_);
282 } 246 }
283 prefers_smoothness_ = prefers_smoothness; 247 prefers_smoothness_ = prefers_smoothness;
284 } 248 }
285 249
286 } // namespace content 250 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698