12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegated_frame_data.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create(
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const scoped_refptr<DelegatedFrameProvider>& frame_provider) {
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return scoped_refptr<DelegatedRendererLayer>(
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new DelegatedRendererLayer(frame_provider));
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DelegatedRendererLayer::DelegatedRendererLayer(
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const scoped_refptr<DelegatedFrameProvider>& frame_provider)
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : Layer(),
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_(frame_provider),
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      should_collect_new_frame_(true),
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_data_(NULL),
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_ptrs_(this) {
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_provider_->AddObserver(this);
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DelegatedRendererLayer::~DelegatedRendererLayer() {
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_provider_->RemoveObserver(this);
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl(
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeImpl* tree_impl) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return DelegatedRendererLayerImpl::Create(
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tree_impl, layer_id_).PassAs<LayerImpl>();
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void DelegatedRendererLayer::SetLayerTreeHost(LayerTreeHost* host) {
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (layer_tree_host() == host) {
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    Layer::SetLayerTreeHost(host);
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!host) {
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // The active frame needs to be removed from the active tree and resources
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // returned before the commit is called complete.
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // TODO(danakj): Don't need to do this if the last frame commited was empty
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // or we never commited a frame with resources.
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    SetNextCommitWaitsForActivation();
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // There is no active frame in the new layer tree host to wait for so no
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // need to call SetNextCommitWaitsForActivation().
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    should_collect_new_frame_ = true;
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetNeedsUpdate();
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Layer::SetLayerTreeHost(host);
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layer::PushPropertiesTo(impl);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DelegatedRendererLayerImpl* delegated_impl =
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<DelegatedRendererLayerImpl*>(impl);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  delegated_impl->CreateChildIdIfNeeded(
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->GetReturnResourcesCallbackForImplThread());
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (frame_data_)
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_impl->SetFrameData(frame_data_, frame_damage_);
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_data_ = NULL;
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_damage_ = gfx::RectF();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedRendererLayer::ProviderHasNewFrame() {
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  should_collect_new_frame_ = true;
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SetNeedsUpdate();
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The active frame needs to be replaced and resources returned before the
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // commit is called complete.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SetNextCommitWaitsForActivation();
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool DelegatedRendererLayer::Update(ResourceUpdateQueue* queue,
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    const OcclusionTracker<Layer>* occlusion) {
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool updated = Layer::Update(queue, occlusion);
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!should_collect_new_frame_)
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return updated;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_data_ =
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->GetFrameDataAndRefResources(this, &frame_damage_);
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  should_collect_new_frame_ = false;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetNeedsPushProperties();
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool DelegatedRendererLayer::HasDelegatedContent() const {
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
104