Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Side by Side Diff: cc/layers/delegated_renderer_layer.cc

Issue 24078024: cc: Return resources to child compositor via a Callback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: deletechild: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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" 10 #include "cc/quads/render_pass_draw_quad.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 } 57 }
58 58
59 void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) { 59 void DelegatedRendererLayer::PushPropertiesTo(LayerImpl* impl) {
60 Layer::PushPropertiesTo(impl); 60 Layer::PushPropertiesTo(impl);
61 61
62 DelegatedRendererLayerImpl* delegated_impl = 62 DelegatedRendererLayerImpl* delegated_impl =
63 static_cast<DelegatedRendererLayerImpl*>(impl); 63 static_cast<DelegatedRendererLayerImpl*>(impl);
64 64
65 delegated_impl->SetDisplaySize(display_size_); 65 delegated_impl->SetDisplaySize(display_size_);
66 66
67 delegated_impl->CreateChildIdIfNeeded(
68 base::Bind(&DelegatedRendererLayer::ReceiveUnusedResources, this));
piman 2013/09/20 01:55:01 Layer is only RefCounted, not RefCountedThreadSafe
danakj 2013/09/20 14:54:52 Oh, right. I will use a WeakPtrFactory.
danakj 2013/09/20 15:39:21 Ugh thread issues. The right way to do this is to
danakj 2013/09/20 17:35:12 Ok done. Used a WeakPtrFactory and a BlockingTaskR
69
67 if (frame_data_) 70 if (frame_data_)
68 delegated_impl->SetFrameData(frame_data_.Pass(), damage_in_frame_); 71 delegated_impl->SetFrameData(frame_data_.Pass(), damage_in_frame_);
69 frame_data_.reset(); 72 frame_data_.reset();
70 damage_in_frame_ = gfx::RectF(); 73 damage_in_frame_ = gfx::RectF();
71 74
72 delegated_impl->CollectUnusedResources( 75 // The ResourceProvider will have the new frame as soon as we push it to the
73 &unused_resources_for_child_compositor_); 76 // pending tree. So unused resources will be returned as well.
74
75 if (client_) 77 if (client_)
76 client_->DidCommitFrameData(); 78 client_->DidCommitFrameData();
77 79
78 // TODO(danakj): TakeUnusedResourcesForChildCompositor requires a push 80 // TODO(danakj): The DidCommitFrameData() notification requires a push
79 // properties to happen in order to collect unused resources returned 81 // properties to happen in order to notify about unused resources returned
80 // from the parent compositor. crbug.com/259090 82 // from the parent compositor. crbug.com/259090
81 needs_push_properties_ = true; 83 needs_push_properties_ = true;
82 } 84 }
83 85
84 void DelegatedRendererLayer::SetDisplaySize(gfx::Size size) { 86 void DelegatedRendererLayer::SetDisplaySize(gfx::Size size) {
85 if (display_size_ == size) 87 if (display_size_ == size)
86 return; 88 return;
87 display_size_ = size; 89 display_size_ = size;
88 SetNeedsCommit(); 90 SetNeedsCommit();
89 } 91 }
90 92
91 void DelegatedRendererLayer::SetFrameData( 93 void DelegatedRendererLayer::SetFrameData(
92 scoped_ptr<DelegatedFrameData> new_frame_data) { 94 scoped_ptr<DelegatedFrameData> new_frame_data) {
95 DCHECK(new_frame_data);
96
93 if (frame_data_) { 97 if (frame_data_) {
94 // Copy the resources from the last provided frame into the unused resources 98 // Copy the resources from the last provided frame into the unused resources
95 // list, as the new frame will provide its own resources. 99 // list, as the new frame will provide its own resources.
96 TransferableResource::ReturnResources( 100 TransferableResource::ReturnResources(
97 frame_data_->resource_list, 101 frame_data_->resource_list,
98 &unused_resources_for_child_compositor_); 102 &unused_resources_for_child_compositor_);
99 } 103 }
100 frame_data_ = new_frame_data.Pass(); 104 frame_data_ = new_frame_data.Pass();
101 if (!frame_data_->render_pass_list.empty()) { 105 if (!frame_data_->render_pass_list.empty()) {
102 RenderPass* root_pass = frame_data_->render_pass_list.back(); 106 RenderPass* root_pass = frame_data_->render_pass_list.back();
(...skipping 26 matching lines...) Expand all
129 // The active frame needs to be replaced and resources returned before the 133 // The active frame needs to be replaced and resources returned before the
130 // commit is called complete. 134 // commit is called complete.
131 SetNextCommitWaitsForActivation(); 135 SetNextCommitWaitsForActivation();
132 } 136 }
133 137
134 void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( 138 void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor(
135 ReturnedResourceArray* array) { 139 ReturnedResourceArray* array) {
136 DCHECK(array->empty()); 140 DCHECK(array->empty());
137 array->clear(); 141 array->clear();
138 142
143 base::AutoLock lock(unused_resources_lock_);
139 array->swap(unused_resources_for_child_compositor_); 144 array->swap(unused_resources_for_child_compositor_);
140 } 145 }
141 146
147 void DelegatedRendererLayer::ReceiveUnusedResources(
148 const ReturnedResourceArray& unused) {
149 base::AutoLock lock(unused_resources_lock_);
150 unused_resources_for_child_compositor_.insert(
151 unused_resources_for_child_compositor_.end(),
152 unused.begin(),
153 unused.end());
154 }
155
142 } // namespace cc 156 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698