// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/layers/delegated_renderer_layer.h" #include "cc/layers/delegated_renderer_layer_impl.h" #include "cc/output/delegated_frame_data.h" #include "cc/quads/render_pass_draw_quad.h" #include "cc/trees/blocking_task_runner.h" #include "cc/trees/layer_tree_host.h" namespace cc { scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create( const scoped_refptr<DelegatedFrameProvider>& frame_provider) { return scoped_refptr<DelegatedRendererLayer>( new DelegatedRendererLayer(frame_provider)); } DelegatedRendererLayer::DelegatedRendererLayer( const scoped_refptr<DelegatedFrameProvider>& frame_provider) : Layer(), frame_provider_(frame_provider), should_collect_new_frame_(true), frame_data_(NULL), main_thread_runner_(BlockingTaskRunner::current()), weak_ptrs_(this) { frame_provider_->AddObserver(this); } DelegatedRendererLayer::~DelegatedRendererLayer() { frame_provider_->RemoveObserver(this); } scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl( LayerTreeImpl* tree_impl) { return DelegatedRendererLayerImpl::Create( tree_impl, layer_id_).PassAs<LayerImpl>(); } void DelegatedRendererLayer::SetLayerTreeHost(LayerTreeHost* host) { if (layer_tree_host() == host) { Layer::SetLayerTreeHost(host); return; } if (!host) { // The active frame needs to be removed from the active tree and resources // returned before the commit is called complete. // TODO(danakj): Don't need to do this if the last frame commited was empty // or we never commited a frame with resources. SetNextCommitWaitsForActivation(); } else { // There is no active frame in the new layer tree host to wait for so no // need to call SetNextCommitWaitsForActivation(). should_collect_new_frame_ = true; SetNeedsUpdate(); } Layer::SetLayerTreeHost(host); } void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) { Layer::PushPropertiesTo(impl); DelegatedRendererLayerImpl* delegated_impl = static_cast<DelegatedRendererLayerImpl*>(impl); delegated_impl->CreateChildIdIfNeeded( frame_provider_->GetReturnResourcesCallbackForImplThread()); if (frame_data_) delegated_impl->SetFrameData(frame_data_, frame_damage_); frame_data_ = NULL; frame_damage_ = gfx::RectF(); } void DelegatedRendererLayer::ProviderHasNewFrame() { should_collect_new_frame_ = true; SetNeedsUpdate(); // The active frame needs to be replaced and resources returned before the // commit is called complete. SetNextCommitWaitsForActivation(); } bool DelegatedRendererLayer::Update(ResourceUpdateQueue* queue, const OcclusionTracker<Layer>* occlusion) { bool updated = Layer::Update(queue, occlusion); if (!should_collect_new_frame_) return updated; frame_data_ = frame_provider_->GetFrameDataAndRefResources(this, &frame_damage_); should_collect_new_frame_ = false; SetNeedsPushProperties(); return true; } } // namespace cc