delegated_renderer_layer.cc revision 3551c9c881056c480085172ff9840cab31610854
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_client.h" 8#include "cc/layers/delegated_renderer_layer_impl.h" 9#include "cc/output/delegated_frame_data.h" 10 11namespace cc { 12 13scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create( 14 DelegatedRendererLayerClient* client) { 15 return scoped_refptr<DelegatedRendererLayer>( 16 new DelegatedRendererLayer(client)); 17} 18 19DelegatedRendererLayer::DelegatedRendererLayer( 20 DelegatedRendererLayerClient* client) 21 : Layer(), 22 client_(client) {} 23 24DelegatedRendererLayer::~DelegatedRendererLayer() {} 25 26scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl( 27 LayerTreeImpl* tree_impl) { 28 return DelegatedRendererLayerImpl::Create( 29 tree_impl, layer_id_).PassAs<LayerImpl>(); 30} 31 32bool DelegatedRendererLayer::DrawsContent() const { 33 return Layer::DrawsContent() && !frame_size_.IsEmpty(); 34} 35 36void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) { 37 Layer::PushPropertiesTo(impl); 38 39 DelegatedRendererLayerImpl* delegated_impl = 40 static_cast<DelegatedRendererLayerImpl*>(impl); 41 42 delegated_impl->SetDisplaySize(display_size_); 43 44 if (frame_data_) 45 delegated_impl->SetFrameData(frame_data_.Pass(), damage_in_frame_); 46 frame_data_.reset(); 47 damage_in_frame_ = gfx::RectF(); 48 49 delegated_impl->CollectUnusedResources( 50 &unused_resources_for_child_compositor_); 51 52 if (client_) 53 client_->DidCommitFrameData(); 54 55 // TODO(danakj): TakeUnusedResourcesForChildCompositor requires a push 56 // properties to happen in order to collect unused resources returned 57 // from the parent compositor. crbug.com/259090 58 needs_push_properties_ = true; 59} 60 61void DelegatedRendererLayer::SetDisplaySize(gfx::Size size) { 62 if (display_size_ == size) 63 return; 64 display_size_ = size; 65 SetNeedsCommit(); 66} 67 68void DelegatedRendererLayer::SetFrameData( 69 scoped_ptr<DelegatedFrameData> new_frame_data) { 70 if (frame_data_) { 71 // Copy the resources from the last provided frame into the unused resources 72 // list, as the new frame will provide its own resources. 73 TransferableResource::ReturnResources( 74 frame_data_->resource_list, 75 &unused_resources_for_child_compositor_); 76 } 77 frame_data_ = new_frame_data.Pass(); 78 if (!frame_data_->render_pass_list.empty()) { 79 RenderPass* root_pass = frame_data_->render_pass_list.back(); 80 damage_in_frame_.Union(root_pass->damage_rect); 81 frame_size_ = root_pass->output_rect.size(); 82 } else { 83 frame_size_ = gfx::Size(); 84 } 85 SetNeedsCommit(); 86} 87 88void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( 89 ReturnedResourceArray* array) { 90 DCHECK(array->empty()); 91 array->clear(); 92 93 array->swap(unused_resources_for_child_compositor_); 94} 95 96bool DelegatedRendererLayer::BlocksPendingCommit() const { 97 // The active frame needs to be replaced and resources returned before the 98 // commit is called complete. This is true even whenever there may be 99 // resources to return, regardless of if the layer will draw in its new 100 // state. 101 return true; 102} 103 104} // namespace cc 105