Index: content/browser/android/synchronous_compositor_observer.cc |
diff --git a/content/browser/android/synchronous_compositor_observer.cc b/content/browser/android/synchronous_compositor_observer.cc |
index bbf778510d8fa626117f3936b826edc8eff23304..321718f1d868c449f852b3fdfbd6edaddecc97f2 100644 |
--- a/content/browser/android/synchronous_compositor_observer.cc |
+++ b/content/browser/android/synchronous_compositor_observer.cc |
@@ -16,40 +16,16 @@ |
namespace content { |
-namespace { |
-base::LazyInstance<std::map<int, SynchronousCompositorObserver*>> g_instances; |
-} |
- |
-// static |
-SynchronousCompositorObserver* SynchronousCompositorObserver::GetOrCreateFor( |
- int process_id) { |
- auto itr = g_instances.Get().find(process_id); |
- if (itr != g_instances.Get().end()) |
- return itr->second; |
- return new SynchronousCompositorObserver(process_id); |
-} |
- |
SynchronousCompositorObserver::SynchronousCompositorObserver(int process_id) |
- : render_process_host_(RenderProcessHost::FromID(process_id)), |
+ : BrowserMessageFilter(SyncCompositorMsgStart), |
+ render_process_host_(RenderProcessHost::FromID(process_id)), |
window_android_in_vsync_(nullptr) { |
DCHECK(render_process_host_); |
- DCHECK(!base::ContainsKey(g_instances.Get(), render_process_host_->GetID())); |
- g_instances.Get()[render_process_host_->GetID()] = this; |
- render_process_host_->AddObserver(this); |
} |
SynchronousCompositorObserver::~SynchronousCompositorObserver() { |
DCHECK(compositor_host_pending_renderer_state_.empty()); |
- DCHECK(base::ContainsKey(g_instances.Get(), render_process_host_->GetID())); |
- DCHECK_EQ(this, g_instances.Get()[render_process_host_->GetID()]); |
- render_process_host_->RemoveObserver(this); |
- g_instances.Get().erase(render_process_host_->GetID()); |
-} |
- |
-void SynchronousCompositorObserver::RenderProcessHostDestroyed( |
- RenderProcessHost* host) { |
- DCHECK_EQ(render_process_host_, host); |
- delete this; |
+ // TODO(boliu): signal pending frames. |
} |
void SynchronousCompositorObserver::SyncStateAfterVSync( |
@@ -68,6 +44,59 @@ void SynchronousCompositorObserver::SyncStateAfterVSync( |
window_android_in_vsync_->AddObserver(this); |
} |
+bool SynchronousCompositorObserver::OnMessageReceived( |
+ const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorObserver, message) |
+ IPC_MESSAGE_HANDLER_GENERIC(SyncCompositorHostMsg_ReturnFrame, |
+ ReceiveFrame(message)) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+bool SynchronousCompositorObserver::ReceiveFrame(const IPC::Message& message) { |
+ SyncCompositorHostMsg_ReturnFrame::Param param; |
+ if (!SyncCompositorHostMsg_ReturnFrame::Read(&message, ¶m)) |
+ return false; |
+ |
+ int routing_id = message.routing_id(); |
+ scoped_refptr<SynchronousCompositor::FrameFuture> future; |
+ { |
+ base::AutoLock lock(future_map_lock_); |
+ auto itr = future_map_.find(routing_id); |
+ if (itr == future_map_.end()) { |
+ bad_message::ReceivedBadMessage(render_process_host_, |
+ bad_message::SCO_INVALID_ARGUMENT); |
+ return true; |
+ } |
+ future = std::move(itr->second); |
+ DCHECK(future); |
+ future_map_.erase(itr); |
+ } |
+ |
+ std::unique_ptr<SynchronousCompositor::Frame> frame_ptr = |
dcheng
2016/10/21 06:42:56
Note it's generally considered to just abbreviate
boliu
2016/10/21 15:15:32
Done.
|
+ base::MakeUnique<SynchronousCompositor::Frame>(); |
+ frame_ptr->compositor_frame_sink_id = std::get<0>(param); |
+ cc::CompositorFrame& compositor_frame = std::get<1>(param); |
+ if (compositor_frame.delegated_frame_data) { |
+ frame_ptr->frame.reset(new cc::CompositorFrame); |
+ *frame_ptr->frame = std::move(compositor_frame); |
+ } |
+ future->setFrame(std::move(frame_ptr)); |
+ // TODO(boliu): Post metadata back to UI thread. |
+ return true; |
+} |
+ |
+void SynchronousCompositorObserver::SetFrameFuture( |
+ const int routing_id, |
+ const scoped_refptr<SynchronousCompositor::FrameFuture>& frame_future) { |
+ // TODO(boliu): Need a sequenced id, to queue previous frames. |
+ DCHECK(frame_future); |
+ base::AutoLock lock(future_map_lock_); |
+ future_map_[routing_id] = std::move(frame_future); |
dcheng
2016/10/21 06:42:56
Note that std::move() here doesn't do anything, si
boliu
2016/10/21 15:15:32
changed to pass by value in the function param, so
|
+} |
+ |
void SynchronousCompositorObserver::OnCompositingDidCommit() { |
NOTREACHED(); |
} |