Chromium Code Reviews| Index: cc/trees/layer_tree_host_impl.cc |
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
| index bd77d844e629315d657d6cb4660bdb26e284b903..b18d49b1dc48800f88c2fc1fc2a5c742e6706252 100644 |
| --- a/cc/trees/layer_tree_host_impl.cc |
| +++ b/cc/trees/layer_tree_host_impl.cc |
| @@ -68,7 +68,6 @@ |
| #include "cc/trees/layer_tree_host.h" |
| #include "cc/trees/layer_tree_host_common.h" |
| #include "cc/trees/layer_tree_impl.h" |
| -#include "cc/trees/occlusion_tracker.h" |
| #include "cc/trees/single_thread_proxy.h" |
| #include "cc/trees/tree_synchronizer.h" |
| #include "gpu/command_buffer/client/gles2_interface.h" |
| @@ -592,25 +591,20 @@ DrawMode LayerTreeHostImpl::GetDrawMode() const { |
| static void AppendQuadsForLayer( |
| RenderPass* target_render_pass, |
| LayerImpl* layer, |
| - const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| AppendQuadsData* append_quads_data) { |
| - layer->AppendQuads( |
| - target_render_pass, |
| - occlusion_tracker.GetCurrentOcclusionForLayer(layer->draw_transform()), |
| - append_quads_data); |
| + layer->AppendQuads(target_render_pass, |
| + layer->draw_properties().occlusion_in_content_space, |
| + append_quads_data); |
| } |
| static void AppendQuadsForRenderSurfaceLayer( |
| RenderPass* target_render_pass, |
| LayerImpl* layer, |
| const RenderPass* contributing_render_pass, |
| - const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| AppendQuadsData* append_quads_data) { |
| RenderSurfaceImpl* surface = layer->render_surface(); |
| const gfx::Transform& draw_transform = surface->draw_transform(); |
| - const Occlusion& occlusion = |
| - occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
| - draw_transform); |
| + const Occlusion& occlusion = surface->occlusion_in_content_space(); |
| SkColor debug_border_color = surface->GetDebugBorderColor(); |
| float debug_border_width = surface->GetDebugBorderWidth(); |
| LayerImpl* mask_layer = layer->mask_layer(); |
| @@ -624,8 +618,7 @@ static void AppendQuadsForRenderSurfaceLayer( |
| const gfx::Transform& replica_draw_transform = |
| surface->replica_draw_transform(); |
| const Occlusion& replica_occlusion = |
| - occlusion_tracker.GetCurrentOcclusionForContributingSurface( |
| - replica_draw_transform); |
| + surface->replica_occlusion_in_content_space(); |
| SkColor replica_debug_border_color = surface->GetReplicaDebugBorderColor(); |
| float replica_debug_border_width = surface->GetReplicaDebugBorderWidth(); |
| // TODO(danakj): By using the same RenderSurfaceImpl for both the |
| @@ -645,16 +638,13 @@ static void AppendQuadsForRenderSurfaceLayer( |
| } |
| } |
| -static void AppendQuadsToFillScreen( |
| - const gfx::Rect& root_scroll_layer_rect, |
| - RenderPass* target_render_pass, |
| - LayerImpl* root_layer, |
| - SkColor screen_background_color, |
| - const OcclusionTracker<LayerImpl>& occlusion_tracker) { |
| +static void AppendQuadsToFillScreen(const gfx::Rect& root_scroll_layer_rect, |
| + RenderPass* target_render_pass, |
| + LayerImpl* root_layer, |
| + SkColor screen_background_color, |
| + const Region& fill_region) { |
| if (!root_layer || !SkColorGetA(screen_background_color)) |
| return; |
| - |
| - Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); |
| if (fill_region.IsEmpty()) |
| return; |
| @@ -758,14 +748,11 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| root_pass->damage_rect = root_pass->output_rect; |
| } |
| - OcclusionTracker<LayerImpl> occlusion_tracker( |
| - active_tree_->root_layer()->render_surface()->content_rect()); |
| - occlusion_tracker.set_minimum_tracking_size( |
| - settings_.minimum_occlusion_tracking_size); |
| - |
| - // Add quads to the Render passes in front-to-back order to allow for testing |
| - // occlusion and performing culling during the tree walk. |
| - typedef LayerIterator<LayerImpl> LayerIteratorType; |
| + // Grab this region here before iterating layers. Taking copy requests from |
|
vmpstr
2015/02/13 00:24:54
Do you mean to say that UnoccludedScreenSpaceRegio
danakj
2015/02/13 00:27:07
No, i mean that the dirty bit is set to true so as
|
| + // the layers while constructing the render passes will dirty the render |
| + // surface layer list and this unoccluded region. |
| + const Region& unoccluded_screen_space_region = |
| + active_tree_->UnoccludedScreenSpaceRegion(); |
| // Typically when we are missing a texture and use a checkerboard quad, we |
| // still draw the frame. However when the layer being checkerboarded is moving |
| @@ -783,19 +770,15 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| int num_missing_tiles = 0; |
| int num_incomplete_tiles = 0; |
| - LayerIteratorType end = |
| - LayerIteratorType::End(frame->render_surface_layer_list); |
| - for (LayerIteratorType it = |
| - LayerIteratorType::Begin(frame->render_surface_layer_list); |
| - it != end; |
| - ++it) { |
| + auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); |
| + for (auto it = |
| + LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); |
| + it != end; ++it) { |
| RenderPassId target_render_pass_id = |
| it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
| RenderPass* target_render_pass = |
| frame->render_passes_by_id[target_render_pass_id]; |
| - occlusion_tracker.EnterLayer(it); |
| - |
| AppendQuadsData append_quads_data; |
| if (it.represents_target_render_surface()) { |
| @@ -813,13 +796,12 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| AppendQuadsForRenderSurfaceLayer(target_render_pass, |
| *it, |
| contributing_render_pass, |
| - occlusion_tracker, |
| &append_quads_data); |
| } else if (it.represents_itself() && |
| !it->visible_content_rect().IsEmpty()) { |
| bool occluded = |
| - occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()) |
| - .IsOccluded(it->visible_content_rect()); |
| + it->draw_properties().occlusion_in_content_space.IsOccluded( |
| + it->visible_content_rect()); |
| if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
| DCHECK_EQ(active_tree_, it->layer_tree_impl()); |
| @@ -835,7 +817,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| AppendQuadsForLayer(render_pass, |
| *it, |
| - occlusion_tracker, |
| &append_quads_data); |
| contributing_render_pass_id = |
| @@ -845,7 +826,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| AppendQuadsForLayer(target_render_pass, |
| *it, |
| - occlusion_tracker, |
| &append_quads_data); |
| // For layers that represent themselves, add composite frame timing |
| @@ -885,8 +865,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| if (RequiresHighResToDraw()) |
| draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
| } |
| - |
| - occlusion_tracker.LeaveLayer(it); |
| } |
| if (have_copy_request || |
| @@ -907,10 +885,8 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
| frame->render_passes.back()->has_transparent_background = false; |
| AppendQuadsToFillScreen( |
| active_tree_->RootScrollLayerDeviceViewportBounds(), |
| - frame->render_passes.back(), |
| - active_tree_->root_layer(), |
| - active_tree_->background_color(), |
| - occlusion_tracker); |
| + frame->render_passes.back(), active_tree_->root_layer(), |
| + active_tree_->background_color(), unoccluded_screen_space_region); |
| } |
| RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |