146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/browser/compositor/onscreen_display_client.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/debug/trace_event.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/output/output_surface.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_manager.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/surface_display_output_surface.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/common/host_shared_bitmap_manager.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace content { 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OnscreenDisplayClient::OnscreenDisplayClient( 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<cc::OutputSurface> output_surface, 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cc::SurfaceManager* manager, 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : output_surface_(output_surface.Pass()), 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) display_( 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new cc::Display(this, manager, HostSharedBitmapManager::current())), 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_runner_(task_runner), 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scheduled_draw_(false), 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deferred_draw_(false), 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_frames_(0), 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) weak_ptr_factory_(this) { 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OnscreenDisplayClient::~OnscreenDisplayClient() { 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<cc::OutputSurface> OnscreenDisplayClient::CreateOutputSurface() { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(output_surface_.get()); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_surface_.Pass(); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnscreenDisplayClient::CommitVSyncParameters(base::TimeTicks timebase, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta interval) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci surface_display_output_surface_->ReceivedVSyncParameters(timebase, interval); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnscreenDisplayClient::DisplayDamaged() { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (scheduled_draw_ || deferred_draw_) 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TRACE_EVENT0("content", "OnscreenDisplayClient::DisplayDamaged"); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pending_frames_ >= display_->GetMaxFramesPending()) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deferred_draw_ = true; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScheduleDraw(); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnscreenDisplayClient::ScheduleDraw() { 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!deferred_draw_); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!scheduled_draw_); 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scheduled_draw_ = true; 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_runner_->PostTask( 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FROM_HERE, 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&OnscreenDisplayClient::Draw, weak_ptr_factory_.GetWeakPtr())); 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnscreenDisplayClient::Draw() { 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TRACE_EVENT0("content", "OnscreenDisplayClient::Draw"); 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scheduled_draw_ = false; 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) display_->Draw(); 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnscreenDisplayClient::DidSwapBuffers() { 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_frames_++; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnscreenDisplayClient::DidSwapBuffersComplete() { 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_frames_--; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((pending_frames_ < display_->GetMaxFramesPending()) && deferred_draw_) { 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deferred_draw_ = false; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScheduleDraw(); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace content 82