diff options
Diffstat (limited to 'cc/delegated_renderer_layer_impl.cc')
-rw-r--r-- | cc/delegated_renderer_layer_impl.cc | 106 |
1 files changed, 47 insertions, 59 deletions
diff --git a/cc/delegated_renderer_layer_impl.cc b/cc/delegated_renderer_layer_impl.cc index e271b57..4b9b38a 100644 --- a/cc/delegated_renderer_layer_impl.cc +++ b/cc/delegated_renderer_layer_impl.cc @@ -60,75 +60,63 @@ void DelegatedRendererLayerImpl::SetFrameData( scoped_ptr<DelegatedFrameData> frame_data, gfx::RectF damage_in_frame, TransferableResourceArray* resources_for_ack) { - // 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_); - // Display size is already set so we can compute what the damage rect - // will be in layer space. - if (!frame_data->render_pass_list.empty()) { - RenderPass* new_root_pass = frame_data->render_pass_list.back(); - gfx::RectF damage_in_layer = MathUtil::mapClippedRect( - DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()), - damage_in_frame); - setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); - } - - // Save the resources from the last frame. - ResourceProvider::ResourceIdSet new_resources; - - // Receive the current frame's resources from the child compositor. ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); - resource_provider->receiveFromChild(child_id_, frame_data->resource_list); - - // Remap resource ids in the current frame's quads to the parent's namespace. - bool invalid_frame = false; - DrawQuad::ResourceIteratorCallback remap_callback = base::Bind( - &ResourceRemapHelper, - &invalid_frame, - resource_provider->getChildToParentMap(child_id_), - &new_resources); - 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) { - DrawQuad* quad = pass->quad_list[j]; - quad->IterateResources(remap_callback); + const ResourceProvider::ResourceIdMap& resource_map = + resource_provider->getChildToParentMap(child_id_); + + if (frame_data) { + // 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()); + + // Display size is already set so we can compute what the damage rect + // will be in layer space. + if (!frame_data->render_pass_list.empty()) { + RenderPass* new_root_pass = frame_data->render_pass_list.back(); + gfx::RectF damage_in_layer = MathUtil::mapClippedRect( + DelegatedFrameToLayerSpaceTransform( + new_root_pass->output_rect.size()), + damage_in_frame); + setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer)); } - } - - // If the frame has invalid data in it, don't display it. - if (invalid_frame) { - // Keep the resources given to us this frame. - for (ResourceProvider::ResourceIdSet::iterator it = new_resources.begin(); - it != new_resources.end(); - ++it) - resources_.insert(*it); - return; - } - // Save the resources that this layer owns now. - ResourceProvider::ResourceIdSet previous_frame_resources; - previous_frame_resources.swap(resources_); - resources_.swap(new_resources); + resource_provider->receiveFromChild(child_id_, frame_data->resource_list); + + bool invalid_frame = false; + ResourceProvider::ResourceIdSet used_resources; + DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = + base::Bind(&ResourceRemapHelper, + &invalid_frame, + resource_map, + &used_resources); + 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) { + DrawQuad* quad = pass->quad_list[j]; + quad->IterateResources(remap_resources_to_parent_callback); + } + } - // Save the remapped quads on the layer. This steals the quads and render - // passes from the frame_data. - SetRenderPasses(&frame_data->render_pass_list); + if (!invalid_frame) { + // 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); + } + } - // Release the resources from the previous frame to prepare them for transport - // back to the child compositor. ResourceProvider::ResourceIdArray unused_resources; - for (ResourceProvider::ResourceIdSet::iterator it = - previous_frame_resources.begin(); - it != previous_frame_resources.end(); + for (ResourceProvider::ResourceIdMap::const_iterator it = + resource_map.begin(); + it != resource_map.end(); ++it) { - bool resource_is_not_in_current_frame = - resources_.find(*it) == resources_.end(); - if (resource_is_not_in_current_frame) - unused_resources.push_back(*it); + bool resource_is_in_current_frame = resources_.count(it->second); + 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->prepareSendToChild( child_id_, unused_resources, resources_for_ack); |