15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/compositor/browser_compositor_output_surface_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/compositor/browser_compositor_output_surface.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserCompositorOutputSurfaceProxy::BrowserCompositorOutputSurfaceProxy(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDMap<BrowserCompositorOutputSurface>* surface_map)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_map_(surface_map),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      connected_to_gpu_process_host_id_(0) {}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserCompositorOutputSurfaceProxy::~BrowserCompositorOutputSurfaceProxy() {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserCompositorOutputSurfaceProxy::ConnectToGpuProcessHost(
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SingleThreadTaskRunner* compositor_thread_task_runner) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserGpuChannelHostFactory* factory =
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserGpuChannelHostFactory::instance();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int gpu_process_host_id = factory->GpuProcessHostId();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (connected_to_gpu_process_host_id_ == gpu_process_host_id)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kMessagesToFilter[] = { GpuHostMsg_UpdateVSyncParameters::ID };
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory->SetHandlerForControlMessages(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMessagesToFilter,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(kMessagesToFilter),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowserCompositorOutputSurfaceProxy::
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     OnMessageReceivedOnCompositorThread,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 this),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      compositor_thread_task_runner);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_to_gpu_process_host_id_ = gpu_process_host_id;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserCompositorOutputSurfaceProxy::OnMessageReceivedOnCompositorThread(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(BrowserCompositorOutputSurfaceProxy, message)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IPC_MESSAGE_HANDLER(GpuHostMsg_UpdateVSyncParameters,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          OnUpdateVSyncParametersOnCompositorThread);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserCompositorOutputSurfaceProxy::OnUpdateVSyncParametersOnCompositorThread(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int surface_id,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks timebase,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta interval) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserCompositorOutputSurface* surface = surface_map_->Lookup(surface_id);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (surface)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    surface->OnUpdateVSyncParametersFromGpu(timebase, interval);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)