Index: cc/layers/delegated_renderer_layer_impl.cc |
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc |
index b0a1b3ff8b3ab2afed50af65d80dc35c7e7d2975..34a1cd86755949fbe946dba7057a7fc647aba072 100644 |
--- a/cc/layers/delegated_renderer_layer_impl.cc |
+++ b/cc/layers/delegated_renderer_layer_impl.cc |
@@ -47,7 +47,7 @@ bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const { |
static ResourceProvider::ResourceId ResourceRemapHelper( |
bool* invalid_frame, |
const ResourceProvider::ResourceIdMap& child_to_parent_map, |
- ResourceProvider::ResourceIdSet *remapped_resources, |
+ ResourceProvider::ResourceIdArray* resources_in_frame, |
ResourceProvider::ResourceId id) { |
ResourceProvider::ResourceIdMap::const_iterator it = |
@@ -59,7 +59,7 @@ static ResourceProvider::ResourceId ResourceRemapHelper( |
DCHECK_EQ(it->first, id); |
ResourceProvider::ResourceId remapped_id = it->second; |
- remapped_resources->insert(remapped_id); |
+ resources_in_frame->push_back(id); |
return remapped_id; |
} |
@@ -85,23 +85,31 @@ void DelegatedRendererLayerImpl::PushPropertiesTo(LayerImpl* layer) { |
have_render_passes_to_push_ = false; |
} |
- // This is just a copy for testing since we keep the data on the pending layer |
- // for returning resources to the child for now. |
+ // This is just a copy for testing, since resources are added to the |
+ // ResourceProvider in the pending tree. |
delegated_layer->resources_ = resources_; |
} |
+void DelegatedRendererLayerImpl::CreateChildIdIfNeeded( |
+ const ReturnCallback& return_callback) { |
+ if (child_id_) |
+ return; |
+ |
+ ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
+ child_id_ = resource_provider->CreateChild(return_callback); |
+ own_child_id_ = true; |
+} |
+ |
void DelegatedRendererLayerImpl::SetFrameData( |
scoped_ptr<DelegatedFrameData> frame_data, |
gfx::RectF damage_in_frame) { |
DCHECK(frame_data); |
+ DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first."; |
// A frame with an empty root render pass is invalid. |
DCHECK(frame_data->render_pass_list.empty() || |
!frame_data->render_pass_list.back()->output_rect.IsEmpty()); |
- CreateChildIdIfNeeded(); |
- DCHECK(child_id_); |
- |
ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
const ResourceProvider::ResourceIdMap& resource_map = |
resource_provider->GetChildToParentMap(child_id_); |
@@ -109,12 +117,12 @@ void DelegatedRendererLayerImpl::SetFrameData( |
resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list); |
bool invalid_frame = false; |
- ResourceProvider::ResourceIdSet used_resources; |
+ ResourceProvider::ResourceIdArray resources_in_frame; |
DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = |
base::Bind(&ResourceRemapHelper, |
&invalid_frame, |
resource_map, |
- &used_resources); |
+ &resources_in_frame); |
for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { |
RenderPass* pass = frame_data->render_pass_list[i]; |
for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
@@ -123,8 +131,15 @@ void DelegatedRendererLayerImpl::SetFrameData( |
} |
} |
- if (invalid_frame) |
+ if (invalid_frame) { |
+ // Declare we are still using the last frame's resources. |
+ resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
return; |
+ } |
+ |
+ // Declare we are using the new frame's resources. |
+ resources_.swap(resources_in_frame); |
+ resource_provider->DeclareUsedResourcesFromChild(child_id_, resources_); |
// Display size is already set so we can compute what the damage rect |
// will be in layer space. |
@@ -140,33 +155,9 @@ void DelegatedRendererLayerImpl::SetFrameData( |
// Save the remapped quads on the layer. This steals the quads and render |
// passes from the frame_data. |
SetRenderPasses(&frame_data->render_pass_list); |
- resources_.swap(used_resources); |
have_render_passes_to_push_ = true; |
} |
-void DelegatedRendererLayerImpl::CollectUnusedResources( |
- ReturnedResourceArray* resources_for_ack) { |
- CreateChildIdIfNeeded(); |
- DCHECK(child_id_); |
- |
- ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
- const ResourceProvider::ResourceIdMap& resource_map = |
- resource_provider->GetChildToParentMap(child_id_); |
- |
- ResourceProvider::ResourceIdArray unused_resources; |
- for (ResourceProvider::ResourceIdMap::const_iterator it = |
- resource_map.begin(); |
- it != resource_map.end(); |
- ++it) { |
- bool resource_is_in_current_frame = resources_.count(it->second) > 0; |
- bool resource_is_in_use = resource_provider->InUseByConsumer(it->second); |
- if (!resource_is_in_current_frame && !resource_is_in_use) |
- unused_resources.push_back(it->second); |
- } |
- resource_provider->PrepareSendReturnsToChild( |
- child_id_, unused_resources, resources_for_ack); |
-} |
- |
void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) { |
if (display_size_ == size) |
return; |
@@ -477,15 +468,6 @@ const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { |
return "cc::DelegatedRendererLayerImpl"; |
} |
-void DelegatedRendererLayerImpl::CreateChildIdIfNeeded() { |
- if (child_id_) |
- return; |
- |
- ResourceProvider* resource_provider = layer_tree_impl()->resource_provider(); |
- child_id_ = resource_provider->CreateChild(); |
- own_child_id_ = true; |
-} |
- |
void DelegatedRendererLayerImpl::ClearChildId() { |
if (!child_id_) |
return; |