// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/compositor/browser_compositor_output_surface.h" #include "base/bind.h" #include "base/location.h" #include "base/strings/string_number_conversions.h" #include "content/browser/compositor/reflector_impl.h" #include "content/common/gpu/client/context_provider_command_buffer.h" namespace content { BrowserCompositorOutputSurface::BrowserCompositorOutputSurface( const scoped_refptr& context_provider, int surface_id, IDMap* output_surface_map, const scoped_refptr& vsync_manager) : OutputSurface(context_provider), surface_id_(surface_id), output_surface_map_(output_surface_map), vsync_manager_(vsync_manager) { Initialize(); } BrowserCompositorOutputSurface::BrowserCompositorOutputSurface( scoped_ptr software_device, int surface_id, IDMap* output_surface_map, const scoped_refptr& vsync_manager) : OutputSurface(software_device.Pass()), surface_id_(surface_id), output_surface_map_(output_surface_map), vsync_manager_(vsync_manager) { Initialize(); } BrowserCompositorOutputSurface::~BrowserCompositorOutputSurface() { DCHECK(CalledOnValidThread()); if (reflector_.get()) reflector_->DetachFromOutputSurface(); DCHECK(!reflector_.get()); if (!HasClient()) return; output_surface_map_->Remove(surface_id_); vsync_manager_->RemoveObserver(this); } void BrowserCompositorOutputSurface::Initialize() { capabilities_.max_frames_pending = 1; capabilities_.adjust_deadline_for_parent = false; DetachFromThread(); } bool BrowserCompositorOutputSurface::BindToClient( cc::OutputSurfaceClient* client) { DCHECK(CalledOnValidThread()); if (!OutputSurface::BindToClient(client)) return false; output_surface_map_->AddWithID(this, surface_id_); if (reflector_.get()) reflector_->OnSourceSurfaceReady(this); vsync_manager_->AddObserver(this); return true; } void BrowserCompositorOutputSurface::OnUpdateVSyncParameters( base::TimeTicks timebase, base::TimeDelta interval) { DCHECK(CalledOnValidThread()); DCHECK(HasClient()); CommitVSyncParameters(timebase, interval); } void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu( base::TimeTicks timebase, base::TimeDelta interval) { DCHECK(CalledOnValidThread()); DCHECK(HasClient()); vsync_manager_->UpdateVSyncParameters(timebase, interval); } void BrowserCompositorOutputSurface::SetReflector(ReflectorImpl* reflector) { reflector_ = reflector; } } // namespace content