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

Side by Side Diff: content/browser/android/synchronous_compositor_rph_observer.cc

Issue 2160743002: sync compositor: Reduce begin frame sync IPC overhead (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bad_message, reserve Created 4 years, 5 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/synchronous_compositor_rph_observer.h"
6
7 #include <map>
8
9 #include "base/lazy_instance.h"
10 #include "base/stl_util.h"
11 #include "content/browser/android/synchronous_compositor_host.h"
12 #include "content/browser/bad_message.h"
13 #include "content/common/android/sync_compositor_messages.h"
14 #include "content/public/browser/render_process_host.h"
15 #include "ui/android/window_android.h"
16
17 namespace content {
18
19 namespace {
20 base::LazyInstance<std::map<int, SynchronousCompositorRPHObserver*>>
21 g_instances;
22 }
23
24 // static
25 SynchronousCompositorRPHObserver*
26 SynchronousCompositorRPHObserver::GetOrCreateFor(int process_id) {
27 auto itr = g_instances.Get().find(process_id);
28 if (itr != g_instances.Get().end())
29 return itr->second;
30 return new SynchronousCompositorRPHObserver(process_id);
31 }
32
33 SynchronousCompositorRPHObserver::SynchronousCompositorRPHObserver(
34 int process_id)
35 : render_process_host_(RenderProcessHost::FromID(process_id)),
36 window_android_in_vsync_(nullptr) {
37 DCHECK(render_process_host_);
38 DCHECK(!ContainsKey(g_instances.Get(), render_process_host_->GetID()));
39 g_instances.Get()[render_process_host_->GetID()] = this;
40 render_process_host_->AddObserver(this);
41 }
42
43 SynchronousCompositorRPHObserver::~SynchronousCompositorRPHObserver() {
44 DCHECK(compositor_host_pending_renderer_state_.empty());
45 DCHECK(ContainsKey(g_instances.Get(), render_process_host_->GetID()));
46 DCHECK_EQ(this, g_instances.Get()[render_process_host_->GetID()]);
47 render_process_host_->RemoveObserver(this);
48 g_instances.Get().erase(render_process_host_->GetID());
49 }
50
51 void SynchronousCompositorRPHObserver::RenderProcessHostDestroyed(
52 RenderProcessHost* host) {
53 DCHECK_EQ(render_process_host_, host);
54 delete this;
55 }
56
57 void SynchronousCompositorRPHObserver::SyncStateAfterVSync(
58 ui::WindowAndroid* window_android,
59 SynchronousCompositorHost* compositor_host) {
60 DCHECK(!window_android_in_vsync_ ||
61 window_android_in_vsync_ == window_android)
62 << !!window_android_in_vsync_;
63 DCHECK(compositor_host);
64 DCHECK(
65 !ContainsValue(compositor_host_pending_renderer_state_, compositor_host));
66 compositor_host_pending_renderer_state_.push_back(compositor_host);
67 if (window_android_in_vsync_)
68 return;
69 window_android_in_vsync_ = window_android;
70 window_android_in_vsync_->AddObserver(this);
71 }
72
73 void SynchronousCompositorRPHObserver::OnCompositingDidCommit() {
74 NOTREACHED();
75 }
76
77 void SynchronousCompositorRPHObserver::OnRootWindowVisibilityChanged(
78 bool visible) {
79 NOTREACHED();
80 }
81
82 void SynchronousCompositorRPHObserver::OnAttachCompositor() {
83 NOTREACHED();
84 }
85
86 void SynchronousCompositorRPHObserver::OnDetachCompositor() {
87 NOTREACHED();
88 }
89
90 void SynchronousCompositorRPHObserver::OnVSync(base::TimeTicks frame_time,
91 base::TimeDelta vsync_period) {
92 // This is called after DidSendBeginFrame for SynchronousCompositorHosts
93 // belonging to this WindowAndroid, since this is added as an Observer after
94 // the observer iteration has started.
95 DCHECK(window_android_in_vsync_);
96 window_android_in_vsync_->RemoveObserver(this);
97 window_android_in_vsync_ = nullptr;
98
99 std::vector<int> routing_ids;
100 routing_ids.reserve(compositor_host_pending_renderer_state_.size());
101 for (const auto host : compositor_host_pending_renderer_state_)
102 routing_ids.push_back(host->routing_id());
103
104 std::vector<SyncCompositorCommonRendererParams> params;
105 params.reserve(compositor_host_pending_renderer_state_.size());
106
107 if (!render_process_host_->Send(
108 new SyncCompositorMsg_SynchronizeRendererState(routing_ids,
109 &params))) {
110 return;
111 }
112
113 if (compositor_host_pending_renderer_state_.size() != params.size()) {
114 bad_message::ReceivedBadMessage(render_process_host_,
115 bad_message::SCA_INVALID_ARGUMENT);
dcheng 2016/07/22 06:53:44 I guess a //content reviewer can chime in but wow,
no sievers 2016/07/28 22:03:30 // The naming convention is abbreviated class / na
boliu 2016/07/28 23:22:40 both done. at this point, any name is better than
116 return;
117 }
118
119 for (size_t i = 0; i < compositor_host_pending_renderer_state_.size(); ++i) {
120 compositor_host_pending_renderer_state_[i]->ProcessCommonParams(params[i]);
121 }
122 compositor_host_pending_renderer_state_.clear();
123 }
124
125 void SynchronousCompositorRPHObserver::OnActivityStopped() {
126 NOTREACHED();
127 }
128
129 void SynchronousCompositorRPHObserver::OnActivityStarted() {
130 NOTREACHED();
131 }
132
133 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698