1// Copyright 2014 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/compositor/browser_compositor_output_surface_proxy.h" 6 7#include "base/bind.h" 8#include "content/browser/compositor/browser_compositor_output_surface.h" 9#include "content/browser/gpu/browser_gpu_channel_host_factory.h" 10#include "content/common/gpu/gpu_messages.h" 11 12namespace content { 13 14BrowserCompositorOutputSurfaceProxy::BrowserCompositorOutputSurfaceProxy( 15 IDMap<BrowserCompositorOutputSurface>* surface_map) 16 : surface_map_(surface_map), 17 connected_to_gpu_process_host_id_(0) {} 18 19BrowserCompositorOutputSurfaceProxy::~BrowserCompositorOutputSurfaceProxy() {} 20 21void BrowserCompositorOutputSurfaceProxy::ConnectToGpuProcessHost( 22 base::SingleThreadTaskRunner* compositor_thread_task_runner) { 23 BrowserGpuChannelHostFactory* factory = 24 BrowserGpuChannelHostFactory::instance(); 25 26 int gpu_process_host_id = factory->GpuProcessHostId(); 27 if (connected_to_gpu_process_host_id_ == gpu_process_host_id) 28 return; 29 30 const uint32 kMessagesToFilter[] = { GpuHostMsg_UpdateVSyncParameters::ID }; 31 factory->SetHandlerForControlMessages( 32 kMessagesToFilter, 33 arraysize(kMessagesToFilter), 34 base::Bind(&BrowserCompositorOutputSurfaceProxy:: 35 OnMessageReceivedOnCompositorThread, 36 this), 37 compositor_thread_task_runner); 38 connected_to_gpu_process_host_id_ = gpu_process_host_id; 39} 40 41void BrowserCompositorOutputSurfaceProxy::OnMessageReceivedOnCompositorThread( 42 const IPC::Message& message) { 43 IPC_BEGIN_MESSAGE_MAP(BrowserCompositorOutputSurfaceProxy, message) 44 IPC_MESSAGE_HANDLER(GpuHostMsg_UpdateVSyncParameters, 45 OnUpdateVSyncParametersOnCompositorThread); 46 IPC_END_MESSAGE_MAP() 47} 48 49void 50BrowserCompositorOutputSurfaceProxy::OnUpdateVSyncParametersOnCompositorThread( 51 int surface_id, 52 base::TimeTicks timebase, 53 base::TimeDelta interval) { 54 BrowserCompositorOutputSurface* surface = surface_map_->Lookup(surface_id); 55 if (surface) 56 surface->OnUpdateVSyncParametersFromGpu(timebase, interval); 57} 58} // namespace content 59