Home | History | Annotate | Download | only in layers
      1 // Copyright 2012 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 "cc/layers/delegated_renderer_layer.h"
      6 
      7 #include "cc/layers/delegated_renderer_layer_impl.h"
      8 #include "cc/output/delegated_frame_data.h"
      9 #include "cc/quads/render_pass_draw_quad.h"
     10 #include "cc/trees/blocking_task_runner.h"
     11 #include "cc/trees/layer_tree_host.h"
     12 
     13 namespace cc {
     14 
     15 scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create(
     16     const scoped_refptr<DelegatedFrameProvider>& frame_provider) {
     17   return scoped_refptr<DelegatedRendererLayer>(
     18       new DelegatedRendererLayer(frame_provider));
     19 }
     20 
     21 DelegatedRendererLayer::DelegatedRendererLayer(
     22     const scoped_refptr<DelegatedFrameProvider>& frame_provider)
     23     : Layer(),
     24       frame_provider_(frame_provider),
     25       should_collect_new_frame_(true),
     26       frame_data_(NULL),
     27       main_thread_runner_(BlockingTaskRunner::current()),
     28       weak_ptrs_(this) {
     29   frame_provider_->AddObserver(this);
     30 }
     31 
     32 DelegatedRendererLayer::~DelegatedRendererLayer() {
     33   frame_provider_->RemoveObserver(this);
     34 }
     35 
     36 scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl(
     37     LayerTreeImpl* tree_impl) {
     38   return DelegatedRendererLayerImpl::Create(
     39       tree_impl, layer_id_).PassAs<LayerImpl>();
     40 }
     41 
     42 void DelegatedRendererLayer::SetLayerTreeHost(LayerTreeHost* host) {
     43   if (layer_tree_host() == host) {
     44     Layer::SetLayerTreeHost(host);
     45     return;
     46   }
     47 
     48   if (!host) {
     49     // The active frame needs to be removed from the active tree and resources
     50     // returned before the commit is called complete.
     51     // TODO(danakj): Don't need to do this if the last frame commited was empty
     52     // or we never commited a frame with resources.
     53     SetNextCommitWaitsForActivation();
     54   } else {
     55     // There is no active frame in the new layer tree host to wait for so no
     56     // need to call SetNextCommitWaitsForActivation().
     57     should_collect_new_frame_ = true;
     58     SetNeedsUpdate();
     59   }
     60 
     61   Layer::SetLayerTreeHost(host);
     62 }
     63 
     64 void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) {
     65   Layer::PushPropertiesTo(impl);
     66 
     67   DelegatedRendererLayerImpl* delegated_impl =
     68       static_cast<DelegatedRendererLayerImpl*>(impl);
     69 
     70   delegated_impl->CreateChildIdIfNeeded(
     71       frame_provider_->GetReturnResourcesCallbackForImplThread());
     72 
     73   if (frame_data_)
     74     delegated_impl->SetFrameData(frame_data_, frame_damage_);
     75   frame_data_ = NULL;
     76   frame_damage_ = gfx::RectF();
     77 }
     78 
     79 void DelegatedRendererLayer::ProviderHasNewFrame() {
     80   should_collect_new_frame_ = true;
     81   SetNeedsUpdate();
     82   // The active frame needs to be replaced and resources returned before the
     83   // commit is called complete.
     84   SetNextCommitWaitsForActivation();
     85 }
     86 
     87 bool DelegatedRendererLayer::Update(ResourceUpdateQueue* queue,
     88                                     const OcclusionTracker<Layer>* occlusion) {
     89   bool updated = Layer::Update(queue, occlusion);
     90   if (!should_collect_new_frame_)
     91     return updated;
     92 
     93   frame_data_ =
     94       frame_provider_->GetFrameDataAndRefResources(this, &frame_damage_);
     95   should_collect_new_frame_ = false;
     96 
     97   SetNeedsPushProperties();
     98   return true;
     99 }
    100 
    101 }  // namespace cc
    102