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

Side by Side Diff: content/browser/android/synchronous_compositor_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: clang format Created 4 years, 4 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_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, SynchronousCompositorObserver*>> g_instances;
21 }
22
23 // static
24 SynchronousCompositorObserver* SynchronousCompositorObserver::GetOrCreateFor(
25 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 SynchronousCompositorObserver(process_id);
30 }
31
32 SynchronousCompositorObserver::SynchronousCompositorObserver(int process_id)
33 : render_process_host_(RenderProcessHost::FromID(process_id)),
34 window_android_in_vsync_(nullptr) {
35 DCHECK(render_process_host_);
36 DCHECK(!ContainsKey(g_instances.Get(), render_process_host_->GetID()));
37 g_instances.Get()[render_process_host_->GetID()] = this;
38 render_process_host_->AddObserver(this);
39 }
40
41 SynchronousCompositorObserver::~SynchronousCompositorObserver() {
42 DCHECK(compositor_host_pending_renderer_state_.empty());
43 DCHECK(ContainsKey(g_instances.Get(), render_process_host_->GetID()));
44 DCHECK_EQ(this, g_instances.Get()[render_process_host_->GetID()]);
45 render_process_host_->RemoveObserver(this);
46 g_instances.Get().erase(render_process_host_->GetID());
47 }
48
49 void SynchronousCompositorObserver::RenderProcessHostDestroyed(
50 RenderProcessHost* host) {
51 DCHECK_EQ(render_process_host_, host);
52 delete this;
53 }
54
55 void SynchronousCompositorObserver::SyncStateAfterVSync(
56 ui::WindowAndroid* window_android,
57 SynchronousCompositorHost* compositor_host) {
58 DCHECK(!window_android_in_vsync_ ||
59 window_android_in_vsync_ == window_android)
60 << !!window_android_in_vsync_;
61 DCHECK(compositor_host);
62 DCHECK(
63 !ContainsValue(compositor_host_pending_renderer_state_, compositor_host));
64 compositor_host_pending_renderer_state_.push_back(compositor_host);
65 if (window_android_in_vsync_)
66 return;
67 window_android_in_vsync_ = window_android;
68 window_android_in_vsync_->AddObserver(this);
69 }
70
71 void SynchronousCompositorObserver::OnCompositingDidCommit() {
72 NOTREACHED();
73 }
74
75 void SynchronousCompositorObserver::OnRootWindowVisibilityChanged(
76 bool visible) {
77 NOTREACHED();
78 }
79
80 void SynchronousCompositorObserver::OnAttachCompositor() {
81 NOTREACHED();
82 }
83
84 void SynchronousCompositorObserver::OnDetachCompositor() {
85 NOTREACHED();
86 }
87
88 void SynchronousCompositorObserver::OnVSync(base::TimeTicks frame_time,
89 base::TimeDelta vsync_period) {
90 // This is called after DidSendBeginFrame for SynchronousCompositorHosts
91 // belonging to this WindowAndroid, since this is added as an Observer after
92 // the observer iteration has started.
93 DCHECK(window_android_in_vsync_);
94 window_android_in_vsync_->RemoveObserver(this);
95 window_android_in_vsync_ = nullptr;
96
97 std::vector<int> routing_ids;
98 routing_ids.reserve(compositor_host_pending_renderer_state_.size());
99 for (const auto host : compositor_host_pending_renderer_state_)
100 routing_ids.push_back(host->routing_id());
101
102 std::vector<SyncCompositorCommonRendererParams> params;
103 params.reserve(compositor_host_pending_renderer_state_.size());
104
105 if (!render_process_host_->Send(
106 new SyncCompositorMsg_SynchronizeRendererState(routing_ids,
107 &params))) {
108 return;
109 }
110
111 if (compositor_host_pending_renderer_state_.size() != params.size()) {
112 bad_message::ReceivedBadMessage(render_process_host_,
113 bad_message::SCO_INVALID_ARGUMENT);
114 return;
115 }
116
117 for (size_t i = 0; i < compositor_host_pending_renderer_state_.size(); ++i) {
118 compositor_host_pending_renderer_state_[i]->ProcessCommonParams(params[i]);
119 }
120 compositor_host_pending_renderer_state_.clear();
121 }
122
123 void SynchronousCompositorObserver::OnActivityStopped() {
124 NOTREACHED();
125 }
126
127 void SynchronousCompositorObserver::OnActivityStarted() {
128 NOTREACHED();
129 }
130
131 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/synchronous_compositor_observer.h ('k') | content/browser/bad_message.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698