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