delegated_renderer_layer.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
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 new frame, as 72 // it may use resources that were transferred in the last frame. 73 new_frame_data->resource_list.insert(new_frame_data->resource_list.end(), 74 frame_data_->resource_list.begin(), 75 frame_data_->resource_list.end()); 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 83 // TODO(danakj): This could be optimized to only add resources to the 84 // frame_data_ if they are actually used in the frame. For now, it will 85 // cause the parent (this layer) to hold onto some resources it doesn't 86 // need to for an extra frame. 87 for (size_t i = 0; i < unused_resources_for_child_compositor_.size(); ++i) { 88 frame_data_->resource_list.push_back( 89 unused_resources_for_child_compositor_[i]); 90 } 91 unused_resources_for_child_compositor_.clear(); 92 } else { 93 frame_size_ = gfx::Size(); 94 } 95 SetNeedsCommit(); 96} 97 98void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( 99 TransferableResourceArray* array) { 100 DCHECK(array->empty()); 101 array->clear(); 102 103 array->swap(unused_resources_for_child_compositor_); 104} 105 106bool DelegatedRendererLayer::BlocksPendingCommit() const { 107 // The active frame needs to be replaced and resources returned before the 108 // commit is called complete. This is true even whenever there may be 109 // resources to return, regardless of if the layer will draw in its new 110 // state. 111 return true; 112} 113 114} // namespace cc 115