15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file.
4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/software_browser_compositor_output_surface.h"
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/message_loop/message_loop.h"
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/time/time.h"
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "cc/output/compositor_frame.h"
11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "cc/output/software_output_device.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/browser_compositor_output_surface_proxy.h"
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/renderer_host/render_widget_host_impl.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/latency_info.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/vsync_provider.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace content {
18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochSoftwareBrowserCompositorOutputSurface::SoftwareBrowserCompositorOutputSurface(
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_refptr<BrowserCompositorOutputSurfaceProxy> surface_proxy,
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<cc::SoftwareOutputDevice> software_device,
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int surface_id,
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IDMap<BrowserCompositorOutputSurface>* output_surface_map,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : BrowserCompositorOutputSurface(software_device.Pass(),
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     surface_id,
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     output_surface_map,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     vsync_manager),
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      output_surface_proxy_(surface_proxy) {}
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SoftwareBrowserCompositorOutputSurface::
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ~SoftwareBrowserCompositorOutputSurface() {}
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid SoftwareBrowserCompositorOutputSurface::SwapBuffers(
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    cc::CompositorFrame* frame) {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame->metadata.latency_info[i].AddLatencyNumber(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      FROM_HERE,
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          &RenderWidgetHostImpl::CompositorFrameDrawn,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          frame->metadata.latency_info));
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::VSyncProvider* vsync_provider = software_device()->GetVSyncProvider();
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (vsync_provider) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    vsync_provider->GetVSyncParameters(
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&BrowserCompositorOutputSurfaceProxy::
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        OnUpdateVSyncParametersOnCompositorThread,
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   output_surface_proxy_,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   surface_id_));
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace content
57