| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layers/delegated_renderer_layer.h" | 5 #include "cc/layers/delegated_renderer_layer.h" |
| 6 | 6 |
| 7 #include "cc/layers/delegated_renderer_layer_client.h" | 7 #include "cc/layers/delegated_renderer_layer_client.h" |
| 8 #include "cc/layers/delegated_renderer_layer_impl.h" | 8 #include "cc/layers/delegated_renderer_layer_impl.h" |
| 9 #include "cc/output/delegated_frame_data.h" | 9 #include "cc/output/delegated_frame_data.h" |
| 10 #include "cc/quads/render_pass_draw_quad.h" |
| 11 #include "cc/trees/layer_tree_host.h" |
| 10 | 12 |
| 11 namespace cc { | 13 namespace cc { |
| 12 | 14 |
| 13 scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create( | 15 scoped_refptr<DelegatedRendererLayer> DelegatedRendererLayer::Create( |
| 14 DelegatedRendererLayerClient* client) { | 16 DelegatedRendererLayerClient* client) { |
| 15 return scoped_refptr<DelegatedRendererLayer>( | 17 return scoped_refptr<DelegatedRendererLayer>( |
| 16 new DelegatedRendererLayer(client)); | 18 new DelegatedRendererLayer(client)); |
| 17 } | 19 } |
| 18 | 20 |
| 19 DelegatedRendererLayer::DelegatedRendererLayer( | 21 DelegatedRendererLayer::DelegatedRendererLayer( |
| 20 DelegatedRendererLayerClient* client) | 22 DelegatedRendererLayerClient* client) |
| 21 : Layer(), | 23 : Layer(), |
| 22 client_(client) {} | 24 client_(client), |
| 25 needs_filter_context_(false) {} |
| 23 | 26 |
| 24 DelegatedRendererLayer::~DelegatedRendererLayer() {} | 27 DelegatedRendererLayer::~DelegatedRendererLayer() {} |
| 25 | 28 |
| 26 scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl( | 29 scoped_ptr<LayerImpl> DelegatedRendererLayer::CreateLayerImpl( |
| 27 LayerTreeImpl* tree_impl) { | 30 LayerTreeImpl* tree_impl) { |
| 28 return DelegatedRendererLayerImpl::Create( | 31 return DelegatedRendererLayerImpl::Create( |
| 29 tree_impl, layer_id_).PassAs<LayerImpl>(); | 32 tree_impl, layer_id_).PassAs<LayerImpl>(); |
| 30 } | 33 } |
| 31 | 34 |
| 32 void DelegatedRendererLayer::SetLayerTreeHost(LayerTreeHost* host) { | 35 void DelegatedRendererLayer::SetLayerTreeHost(LayerTreeHost* host) { |
| 33 if (layer_tree_host() == host) { | 36 if (layer_tree_host() == host) { |
| 34 Layer::SetLayerTreeHost(host); | 37 Layer::SetLayerTreeHost(host); |
| 35 return; | 38 return; |
| 36 } | 39 } |
| 37 | 40 |
| 38 if (!host) { | 41 if (!host) { |
| 39 // The active frame needs to be removed from the active tree and resources | 42 // The active frame needs to be removed from the active tree and resources |
| 40 // returned before the commit is called complete. | 43 // returned before the commit is called complete. |
| 41 // TODO(danakj): Don't need to do this if the last frame commited was empty | 44 // TODO(danakj): Don't need to do this if the last frame commited was empty |
| 42 // or we never commited a frame with resources. | 45 // or we never commited a frame with resources. |
| 43 SetNextCommitWaitsForActivation(); | 46 SetNextCommitWaitsForActivation(); |
| 47 } else { |
| 48 if (needs_filter_context_) |
| 49 host->set_needs_filter_context(); |
| 44 } | 50 } |
| 45 | 51 |
| 46 Layer::SetLayerTreeHost(host); | 52 Layer::SetLayerTreeHost(host); |
| 47 } | 53 } |
| 48 | 54 |
| 49 bool DelegatedRendererLayer::DrawsContent() const { | 55 bool DelegatedRendererLayer::DrawsContent() const { |
| 50 return Layer::DrawsContent() && !frame_size_.IsEmpty(); | 56 return Layer::DrawsContent() && !frame_size_.IsEmpty(); |
| 51 } | 57 } |
| 52 | 58 |
| 53 void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) { | 59 void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 &unused_resources_for_child_compositor_); | 98 &unused_resources_for_child_compositor_); |
| 93 } | 99 } |
| 94 frame_data_ = new_frame_data.Pass(); | 100 frame_data_ = new_frame_data.Pass(); |
| 95 if (!frame_data_->render_pass_list.empty()) { | 101 if (!frame_data_->render_pass_list.empty()) { |
| 96 RenderPass* root_pass = frame_data_->render_pass_list.back(); | 102 RenderPass* root_pass = frame_data_->render_pass_list.back(); |
| 97 damage_in_frame_.Union(root_pass->damage_rect); | 103 damage_in_frame_.Union(root_pass->damage_rect); |
| 98 frame_size_ = root_pass->output_rect.size(); | 104 frame_size_ = root_pass->output_rect.size(); |
| 99 } else { | 105 } else { |
| 100 frame_size_ = gfx::Size(); | 106 frame_size_ = gfx::Size(); |
| 101 } | 107 } |
| 108 |
| 109 // If any RenderPassDrawQuad has a filter operation, then we need a filter |
| 110 // context to draw this layer's content. |
| 111 for (size_t i = 0; |
| 112 !needs_filter_context_ && i < frame_data_->render_pass_list.size(); |
| 113 ++i) { |
| 114 const QuadList& quad_list = frame_data_->render_pass_list[i]->quad_list; |
| 115 for (size_t j = 0; !needs_filter_context_ && j < quad_list.size(); ++j) { |
| 116 if (quad_list[j]->material != DrawQuad::RENDER_PASS) |
| 117 continue; |
| 118 const RenderPassDrawQuad* render_pass_quad = |
| 119 RenderPassDrawQuad::MaterialCast(quad_list[j]); |
| 120 if (!render_pass_quad->filters.IsEmpty() || |
| 121 !render_pass_quad->background_filters.IsEmpty()) |
| 122 needs_filter_context_ = true; |
| 123 } |
| 124 } |
| 125 if (needs_filter_context_ && layer_tree_host()) |
| 126 layer_tree_host()->set_needs_filter_context(); |
| 127 |
| 102 SetNeedsCommit(); | 128 SetNeedsCommit(); |
| 103 // The active frame needs to be replaced and resources returned before the | 129 // The active frame needs to be replaced and resources returned before the |
| 104 // commit is called complete. | 130 // commit is called complete. |
| 105 SetNextCommitWaitsForActivation(); | 131 SetNextCommitWaitsForActivation(); |
| 106 } | 132 } |
| 107 | 133 |
| 108 void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( | 134 void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( |
| 109 ReturnedResourceArray* array) { | 135 ReturnedResourceArray* array) { |
| 110 DCHECK(array->empty()); | 136 DCHECK(array->empty()); |
| 111 array->clear(); | 137 array->clear(); |
| 112 | 138 |
| 113 array->swap(unused_resources_for_child_compositor_); | 139 array->swap(unused_resources_for_child_compositor_); |
| 114 } | 140 } |
| 115 | 141 |
| 116 } // namespace cc | 142 } // namespace cc |
| OLD | NEW |