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

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: remove ui changes, cleanups 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/common/android/sync_compositor_messages.h"
13 #include "content/public/browser/render_process_host.h"
14 #include "ui/android/window_android.h"
15
16 namespace content {
17
18 namespace {
19 base::LazyInstance<std::map<int, SynchronousCompositorRPHObserver*>>
20 g_instances;
21 }
22
23 // static
24 SynchronousCompositorRPHObserver*
25 SynchronousCompositorRPHObserver::GetOrCreateFor(int process_id) {
26 auto itr = g_instances.Get().find(process_id);
27 if (itr != g_instances.Get().end())
28 return itr->second;
29 return new SynchronousCompositorRPHObserver(process_id);
30 }
31
32 SynchronousCompositorRPHObserver::SynchronousCompositorRPHObserver(
33 int process_id)
34 : render_process_host_(RenderProcessHost::FromID(process_id)),
35 window_android_in_vsync_(nullptr) {
36 DCHECK(render_process_host_);
37 DCHECK(!ContainsKey(g_instances.Get(), render_process_host_->GetID()));
38 g_instances.Get()[render_process_host_->GetID()] = this;
39 render_process_host_->AddObserver(this);
40 }
41
42 SynchronousCompositorRPHObserver::~SynchronousCompositorRPHObserver() {
43 DCHECK(compositor_host_pending_renderer_state_.empty());
44 DCHECK(ContainsKey(g_instances.Get(), render_process_host_->GetID()));
45 DCHECK_EQ(this, g_instances.Get()[render_process_host_->GetID()]);
46 render_process_host_->RemoveObserver(this);
47 g_instances.Get().erase(render_process_host_->GetID());
48 }
49
50 void SynchronousCompositorRPHObserver::RenderProcessHostDestroyed(
51 RenderProcessHost* host) {
52 DCHECK_EQ(render_process_host_, host);
53 delete this;
54 }
55
56 void SynchronousCompositorRPHObserver::SyncStateAfterVSync(
57 ui::WindowAndroid* window_android,
58 SynchronousCompositorHost* compositor_host) {
59 DCHECK(!window_android_in_vsync_ ||
60 window_android_in_vsync_ == window_android)
61 << !!window_android_in_vsync_;
62 DCHECK(compositor_host);
63 DCHECK(
64 !ContainsValue(compositor_host_pending_renderer_state_, compositor_host));
65 compositor_host_pending_renderer_state_.push_back(compositor_host);
66 if (window_android_in_vsync_)
67 return;
68 window_android_in_vsync_ = window_android;
69 window_android_in_vsync_->AddObserver(this);
70 }
71
72 void SynchronousCompositorRPHObserver::OnCompositingDidCommit() {
73 NOTREACHED();
74 }
75
76 void SynchronousCompositorRPHObserver::OnRootWindowVisibilityChanged(
77 bool visible) {
78 NOTREACHED();
79 }
80
81 void SynchronousCompositorRPHObserver::OnAttachCompositor() {
82 NOTREACHED();
83 }
84
85 void SynchronousCompositorRPHObserver::OnDetachCompositor() {
86 NOTREACHED();
87 }
88
89 void SynchronousCompositorRPHObserver::OnVSync(base::TimeTicks frame_time,
90 base::TimeDelta vsync_period) {
91 // This is called after DidSendBeginFrame for SynchronousCompositorHosts
92 // belonging to this WindowAndroid, since this is added as an Observer after
93 // the observer iteration has started.
94 DCHECK(window_android_in_vsync_);
95 window_android_in_vsync_->RemoveObserver(this);
96 window_android_in_vsync_ = nullptr;
97 std::vector<int> routing_ids;
98 for (const auto host : compositor_host_pending_renderer_state_)
99 routing_ids.push_back(host->routing_id());
100 std::vector<SyncCompositorCommonRendererParams> params;
101 if (!render_process_host_->Send(
102 new SyncCompositorMsg_SynchronizeRendererState(routing_ids,
103 &params))) {
104 return;
105 }
106
107 DCHECK_EQ(compositor_host_pending_renderer_state_.size(), params.size());
dcheng 2016/07/21 02:27:36 This shouldn't be a DCHECK, since a malicious rend
boliu 2016/07/21 14:35:04 Turned this into a bad_message.
108 for (size_t i = 0; i < compositor_host_pending_renderer_state_.size(); ++i) {
109 compositor_host_pending_renderer_state_[i]->ProcessCommonParams(params[i]);
110 }
111 compositor_host_pending_renderer_state_.clear();
112 }
113
114 void SynchronousCompositorRPHObserver::OnActivityStopped() {
115 NOTREACHED();
116 }
117
118 void SynchronousCompositorRPHObserver::OnActivityStarted() {
119 NOTREACHED();
120 }
121
122 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698