Home | History | Annotate | Download | only in compositor
      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.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/location.h"
      9 #include "base/strings/string_number_conversions.h"
     10 #include "content/browser/compositor/reflector_impl.h"
     11 #include "content/common/gpu/client/context_provider_command_buffer.h"
     12 
     13 namespace content {
     14 
     15 BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
     16     const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
     17     int surface_id,
     18     IDMap<BrowserCompositorOutputSurface>* output_surface_map,
     19     const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
     20     : OutputSurface(context_provider),
     21       surface_id_(surface_id),
     22       output_surface_map_(output_surface_map),
     23       vsync_manager_(vsync_manager) {
     24   Initialize();
     25 }
     26 
     27 BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
     28     scoped_ptr<cc::SoftwareOutputDevice> software_device,
     29     int surface_id,
     30     IDMap<BrowserCompositorOutputSurface>* output_surface_map,
     31     const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
     32     : OutputSurface(software_device.Pass()),
     33       surface_id_(surface_id),
     34       output_surface_map_(output_surface_map),
     35       vsync_manager_(vsync_manager) {
     36   Initialize();
     37 }
     38 
     39 BrowserCompositorOutputSurface::~BrowserCompositorOutputSurface() {
     40   DCHECK(CalledOnValidThread());
     41   if (reflector_.get())
     42     reflector_->DetachFromOutputSurface();
     43   DCHECK(!reflector_.get());
     44   if (!HasClient())
     45     return;
     46   output_surface_map_->Remove(surface_id_);
     47   vsync_manager_->RemoveObserver(this);
     48 }
     49 
     50 void BrowserCompositorOutputSurface::Initialize() {
     51   capabilities_.max_frames_pending = 1;
     52   capabilities_.adjust_deadline_for_parent = false;
     53 
     54   DetachFromThread();
     55 }
     56 
     57 bool BrowserCompositorOutputSurface::BindToClient(
     58     cc::OutputSurfaceClient* client) {
     59   DCHECK(CalledOnValidThread());
     60 
     61   if (!OutputSurface::BindToClient(client))
     62     return false;
     63 
     64   output_surface_map_->AddWithID(this, surface_id_);
     65   if (reflector_.get())
     66     reflector_->OnSourceSurfaceReady(this);
     67   vsync_manager_->AddObserver(this);
     68   return true;
     69 }
     70 
     71 void BrowserCompositorOutputSurface::OnSwapBuffersComplete() {
     72   // On Mac, delay acknowledging the swap to the output surface client until
     73   // it has been drawn.
     74 #if !defined(OS_MACOSX)
     75   cc::OutputSurface::OnSwapBuffersComplete();
     76 #endif
     77 }
     78 
     79 void BrowserCompositorOutputSurface::OnUpdateVSyncParameters(
     80     base::TimeTicks timebase,
     81     base::TimeDelta interval) {
     82   DCHECK(CalledOnValidThread());
     83   DCHECK(HasClient());
     84   CommitVSyncParameters(timebase, interval);
     85 }
     86 
     87 void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu(
     88     base::TimeTicks timebase,
     89     base::TimeDelta interval) {
     90   DCHECK(CalledOnValidThread());
     91   DCHECK(HasClient());
     92   vsync_manager_->UpdateVSyncParameters(timebase, interval);
     93 }
     94 
     95 void BrowserCompositorOutputSurface::SetReflector(ReflectorImpl* reflector) {
     96   reflector_ = reflector;
     97 }
     98 
     99 #if defined(OS_MACOSX)
    100 void BrowserCompositorOutputSurface::OnSurfaceDisplayed() {
    101   cc::OutputSurface::OnSwapBuffersComplete();
    102 }
    103 #endif
    104 
    105 }  // namespace content
    106