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