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

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

Issue 2281143002: Refactor external begin frame source into a base class (Closed)
Patch Set: danakj review Created 4 years, 3 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
« no previous file with comments | « content/renderer/gpu/compositor_external_begin_frame_source.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_external_begin_frame_source.h" 5 #include "content/renderer/gpu/compositor_external_begin_frame_source.h"
6 6
7 #include "content/common/view_messages.h" 7 #include "content/common/view_messages.h"
8 #include "ipc/ipc_sync_channel.h" 8 #include "ipc/ipc_sync_channel.h"
9 #include "ipc/ipc_sync_message_filter.h" 9 #include "ipc/ipc_sync_message_filter.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 CompositorExternalBeginFrameSource::CompositorExternalBeginFrameSource( 13 CompositorExternalBeginFrameSource::CompositorExternalBeginFrameSource(
14 CompositorForwardingMessageFilter* filter, 14 CompositorForwardingMessageFilter* filter,
15 IPC::SyncMessageFilter* sync_message_filter, 15 IPC::SyncMessageFilter* sync_message_filter,
16 int routing_id) 16 int routing_id)
17 : begin_frame_source_filter_(filter), 17 : external_begin_frame_source_(this),
18 begin_frame_source_filter_(filter),
18 message_sender_(sync_message_filter), 19 message_sender_(sync_message_filter),
19 routing_id_(routing_id) { 20 routing_id_(routing_id) {
20 DCHECK(begin_frame_source_filter_.get()); 21 DCHECK(begin_frame_source_filter_);
21 DCHECK(message_sender_.get()); 22 DCHECK(message_sender_);
22 DetachFromThread(); 23 DetachFromThread();
23 } 24 }
24 25
25 CompositorExternalBeginFrameSource::~CompositorExternalBeginFrameSource() { 26 CompositorExternalBeginFrameSource::~CompositorExternalBeginFrameSource() {
26 DCHECK(CalledOnValidThread()); 27 DCHECK(CalledOnValidThread());
27 if (begin_frame_source_proxy_.get()) { 28 if (begin_frame_source_proxy_) {
28 begin_frame_source_proxy_->ClearBeginFrameSource(); 29 begin_frame_source_proxy_->ClearBeginFrameSource();
29 begin_frame_source_filter_->RemoveHandlerOnCompositorThread( 30 begin_frame_source_filter_->RemoveHandlerOnCompositorThread(
30 routing_id_, 31 routing_id_,
31 begin_frame_source_filter_handler_); 32 begin_frame_source_filter_handler_);
32 } 33 }
33 } 34 }
34 35
35 void CompositorExternalBeginFrameSource::AddObserver( 36 void CompositorExternalBeginFrameSource::AddObserver(
36 cc::BeginFrameObserver* obs) { 37 cc::BeginFrameObserver* obs) {
37 DCHECK(CalledOnValidThread()); 38 DCHECK(CalledOnValidThread());
38 DCHECK(obs);
39 DCHECK(observers_.find(obs) == observers_.end());
40 39
41 SetClientReady(); 40 if (!begin_frame_source_proxy_) {
42 bool observers_was_empty = observers_.empty(); 41 begin_frame_source_proxy_ =
43 observers_.insert(obs); 42 new CompositorExternalBeginFrameSourceProxy(this);
44 obs->OnBeginFrameSourcePausedChanged(paused_); 43 begin_frame_source_filter_handler_ =
45 if (observers_was_empty) 44 base::Bind(&CompositorExternalBeginFrameSourceProxy::OnMessageReceived,
46 Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, true)); 45 begin_frame_source_proxy_);
46 begin_frame_source_filter_->AddHandlerOnCompositorThread(
47 routing_id_, begin_frame_source_filter_handler_);
48 }
47 49
48 // Send a MISSED begin frame if necessary. 50 external_begin_frame_source_.AddObserver(obs);
49 if (missed_begin_frame_args_.IsValid()) {
50 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
51 if (!last_args.IsValid() ||
52 (missed_begin_frame_args_.frame_time > last_args.frame_time)) {
53 obs->OnBeginFrame(missed_begin_frame_args_);
54 }
55 }
56 } 51 }
57 52
58 void CompositorExternalBeginFrameSource::RemoveObserver( 53 void CompositorExternalBeginFrameSource::RemoveObserver(
59 cc::BeginFrameObserver* obs) { 54 cc::BeginFrameObserver* obs) {
60 DCHECK(obs); 55 external_begin_frame_source_.RemoveObserver(obs);
61 DCHECK(observers_.find(obs) != observers_.end());
62
63 observers_.erase(obs);
64 if (observers_.empty()) {
65 missed_begin_frame_args_ = cc::BeginFrameArgs();
66 Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, false));
67 }
68 } 56 }
69 57
70 void CompositorExternalBeginFrameSource::SetClientReady() { 58 void CompositorExternalBeginFrameSource::OnNeedsBeginFrames(
71 DCHECK(CalledOnValidThread()); 59 bool needs_begin_frames) {
72 if (begin_frame_source_proxy_) 60 Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames));
73 return;
74 begin_frame_source_proxy_ =
75 new CompositorExternalBeginFrameSourceProxy(this);
76 begin_frame_source_filter_handler_ = base::Bind(
77 &CompositorExternalBeginFrameSourceProxy::OnMessageReceived,
78 begin_frame_source_proxy_);
79 begin_frame_source_filter_->AddHandlerOnCompositorThread(
80 routing_id_,
81 begin_frame_source_filter_handler_);
82 } 61 }
83 62
84 void CompositorExternalBeginFrameSource::OnMessageReceived( 63 void CompositorExternalBeginFrameSource::OnMessageReceived(
85 const IPC::Message& message) { 64 const IPC::Message& message) {
86 DCHECK(CalledOnValidThread()); 65 DCHECK(CalledOnValidThread());
87 DCHECK(begin_frame_source_proxy_.get()); 66 DCHECK(begin_frame_source_proxy_);
88 IPC_BEGIN_MESSAGE_MAP(CompositorExternalBeginFrameSource, message) 67 IPC_BEGIN_MESSAGE_MAP(CompositorExternalBeginFrameSource, message)
89 IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, 68 IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused,
90 OnSetBeginFrameSourcePaused) 69 OnSetBeginFrameSourcePaused)
91 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame) 70 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame)
92 IPC_END_MESSAGE_MAP() 71 IPC_END_MESSAGE_MAP()
93 } 72 }
94 73
95 void CompositorExternalBeginFrameSource::OnSetBeginFrameSourcePaused( 74 void CompositorExternalBeginFrameSource::OnSetBeginFrameSourcePaused(
96 bool paused) { 75 bool paused) {
97 if (paused_ == paused) 76 external_begin_frame_source_.OnSetBeginFrameSourcePaused(paused);
98 return;
99 paused_ = paused;
100 std::unordered_set<cc::BeginFrameObserver*> observers(observers_);
101 for (auto* obs : observers)
102 obs->OnBeginFrameSourcePausedChanged(paused_);
103 } 77 }
104 78
105 void CompositorExternalBeginFrameSource::OnBeginFrame( 79 void CompositorExternalBeginFrameSource::OnBeginFrame(
106 const cc::BeginFrameArgs& args) { 80 const cc::BeginFrameArgs& args) {
107 DCHECK(CalledOnValidThread()); 81 external_begin_frame_source_.OnBeginFrame(args);
108 missed_begin_frame_args_ = args;
109 missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
110 std::unordered_set<cc::BeginFrameObserver*> observers(observers_);
111 for (auto* obs : observers)
112 obs->OnBeginFrame(args);
113 } 82 }
114 83
115 bool CompositorExternalBeginFrameSource::Send(IPC::Message* message) { 84 bool CompositorExternalBeginFrameSource::Send(IPC::Message* message) {
116 return message_sender_->Send(message); 85 return message_sender_->Send(message);
117 } 86 }
118 87
119 } // namespace content 88 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/compositor_external_begin_frame_source.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698