OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 false, | 699 false, |
700 gfx::PointF( | 700 gfx::PointF( |
701 screen_space_rect.x() / overhang_resource_scaled_size.width(), | 701 screen_space_rect.x() / overhang_resource_scaled_size.width(), |
702 screen_space_rect.y() / overhang_resource_scaled_size.height()), | 702 screen_space_rect.y() / overhang_resource_scaled_size.height()), |
703 gfx::PointF( | 703 gfx::PointF( |
704 screen_space_rect.right() / overhang_resource_scaled_size.width(), | 704 screen_space_rect.right() / overhang_resource_scaled_size.width(), |
705 screen_space_rect.bottom() / | 705 screen_space_rect.bottom() / |
706 overhang_resource_scaled_size.height()), | 706 overhang_resource_scaled_size.height()), |
707 screen_background_color, | 707 screen_background_color, |
708 vertex_opacity, | 708 vertex_opacity, |
| 709 false, |
709 false); | 710 false); |
710 } | 711 } |
711 } | 712 } |
712 | 713 |
713 DrawResult LayerTreeHostImpl::CalculateRenderPasses( | 714 DrawResult LayerTreeHostImpl::CalculateRenderPasses( |
714 FrameData* frame) { | 715 FrameData* frame) { |
| 716 //printf("LayerTreeHostImpl::CalculateRenderPasses\n"); |
715 DCHECK(frame->render_passes.empty()); | 717 DCHECK(frame->render_passes.empty()); |
716 DCHECK(CanDraw()); | 718 DCHECK(CanDraw()); |
717 DCHECK(active_tree_->root_layer()); | 719 DCHECK(active_tree_->root_layer()); |
718 | 720 |
719 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 721 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
720 *frame->render_surface_layer_list); | 722 *frame->render_surface_layer_list); |
721 | 723 |
722 // If the root render surface has no visible damage, then don't generate a | 724 // If the root render surface has no visible damage, then don't generate a |
723 // frame at all. | 725 // frame at all. |
724 RenderSurfaceImpl* root_surface = | 726 RenderSurfaceImpl* root_surface = |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 &append_quads_data); | 844 &append_quads_data); |
843 } else if (it.represents_itself() && | 845 } else if (it.represents_itself() && |
844 !it->visible_content_rect().IsEmpty()) { | 846 !it->visible_content_rect().IsEmpty()) { |
845 bool occluded = | 847 bool occluded = |
846 occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()) | 848 occlusion_tracker.GetCurrentOcclusionForLayer(it->draw_transform()) |
847 .IsOccluded(it->visible_content_rect()); | 849 .IsOccluded(it->visible_content_rect()); |
848 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { | 850 if (!occluded && it->WillDraw(draw_mode, resource_provider_.get())) { |
849 DCHECK_EQ(active_tree_, it->layer_tree_impl()); | 851 DCHECK_EQ(active_tree_, it->layer_tree_impl()); |
850 | 852 |
851 frame->will_draw_layers.push_back(*it); | 853 frame->will_draw_layers.push_back(*it); |
| 854 //printf("frame->will_draw_layers %p\n", *it); |
852 | 855 |
853 if (it->HasContributingDelegatedRenderPasses()) { | 856 if (it->HasContributingDelegatedRenderPasses()) { |
| 857 //printf("HasContributingDelegatedRenderPasses\n"); |
854 RenderPassId contributing_render_pass_id = | 858 RenderPassId contributing_render_pass_id = |
855 it->FirstContributingRenderPassId(); | 859 it->FirstContributingRenderPassId(); |
856 while (frame->render_passes_by_id.find(contributing_render_pass_id) != | 860 while (frame->render_passes_by_id.find(contributing_render_pass_id) != |
857 frame->render_passes_by_id.end()) { | 861 frame->render_passes_by_id.end()) { |
858 RenderPass* render_pass = | 862 RenderPass* render_pass = |
859 frame->render_passes_by_id[contributing_render_pass_id]; | 863 frame->render_passes_by_id[contributing_render_pass_id]; |
860 | 864 |
861 AppendQuadsData append_quads_data(render_pass->id); | 865 AppendQuadsData append_quads_data(render_pass->id); |
862 AppendQuadsForLayer(render_pass, | 866 AppendQuadsForLayer(render_pass, |
863 *it, | 867 *it, |
864 occlusion_tracker, | 868 occlusion_tracker, |
865 &append_quads_data); | 869 &append_quads_data); |
866 | 870 |
867 contributing_render_pass_id = | 871 contributing_render_pass_id = |
868 it->NextContributingRenderPassId(contributing_render_pass_id); | 872 it->NextContributingRenderPassId(contributing_render_pass_id); |
869 } | 873 } |
870 } | 874 } |
871 | 875 |
872 AppendQuadsForLayer(target_render_pass, | 876 AppendQuadsForLayer(target_render_pass, |
873 *it, | 877 *it, |
874 occlusion_tracker, | 878 occlusion_tracker, |
875 &append_quads_data); | 879 &append_quads_data); |
876 } | 880 } |
877 | 881 |
878 ++layers_drawn; | 882 ++layers_drawn; |
879 } | 883 } |
880 | 884 |
| 885 /*for (auto& quad : target_render_pass->quad_list) { |
| 886 if (quad.material == DrawQuad::TEXTURE_CONTENT) { |
| 887 TextureDrawQuad tq = static_cast<TextureDrawQuad&>(quad); |
| 888 printf("LayerTreeHostImpl::CalculateRenderPasses texture quad %d %d\n",
tq.nearest_neighbor, tq.resource_id); |
| 889 } |
| 890 }*/ |
| 891 |
881 rendering_stats_instrumentation_->AddVisibleContentArea( | 892 rendering_stats_instrumentation_->AddVisibleContentArea( |
882 append_quads_data.visible_content_area); | 893 append_quads_data.visible_content_area); |
883 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( | 894 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( |
884 append_quads_data.approximated_visible_content_area); | 895 append_quads_data.approximated_visible_content_area); |
885 | 896 |
886 num_missing_tiles += append_quads_data.num_missing_tiles; | 897 num_missing_tiles += append_quads_data.num_missing_tiles; |
887 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; | 898 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; |
888 | 899 |
889 if (append_quads_data.num_missing_tiles) { | 900 if (append_quads_data.num_missing_tiles) { |
890 bool layer_has_animating_transform = | 901 bool layer_has_animating_transform = |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 UMA_HISTOGRAM_COUNTS_100( | 964 UMA_HISTOGRAM_COUNTS_100( |
954 "Compositing.RenderPass.AppendQuadData.NumIncompleteTiles", | 965 "Compositing.RenderPass.AppendQuadData.NumIncompleteTiles", |
955 num_incomplete_tiles); | 966 num_incomplete_tiles); |
956 } | 967 } |
957 | 968 |
958 // Should only have one render pass in resourceless software mode. | 969 // Should only have one render pass in resourceless software mode. |
959 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE || | 970 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE || |
960 frame->render_passes.size() == 1u) | 971 frame->render_passes.size() == 1u) |
961 << frame->render_passes.size(); | 972 << frame->render_passes.size(); |
962 | 973 |
| 974 //printf("LayerTreeHostImpl::CalculateRenderPasses %d\n", (draw_result == DRAW
_SUCCESS)); |
963 return draw_result; | 975 return draw_result; |
964 } | 976 } |
965 | 977 |
966 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { | 978 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { |
967 if (input_handler_client_) | 979 if (input_handler_client_) |
968 input_handler_client_->MainThreadHasStoppedFlinging(); | 980 input_handler_client_->MainThreadHasStoppedFlinging(); |
969 } | 981 } |
970 | 982 |
971 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( | 983 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( |
972 bool should_background_tick) { | 984 bool should_background_tick) { |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 | 1511 |
1500 return metadata; | 1512 return metadata; |
1501 } | 1513 } |
1502 | 1514 |
1503 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { | 1515 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { |
1504 layer->DidBeginTracing(); | 1516 layer->DidBeginTracing(); |
1505 } | 1517 } |
1506 | 1518 |
1507 void LayerTreeHostImpl::DrawLayers(FrameData* frame, | 1519 void LayerTreeHostImpl::DrawLayers(FrameData* frame, |
1508 base::TimeTicks frame_begin_time) { | 1520 base::TimeTicks frame_begin_time) { |
| 1521 /*printf("LayerTreeHostImpl::DrawLayers start\n"); |
| 1522 for (auto* render_pass : frame->render_passes) { |
| 1523 for (auto& quad : render_pass->quad_list) { |
| 1524 if (quad.material == DrawQuad::TEXTURE_CONTENT) { |
| 1525 TextureDrawQuad& tq = static_cast<TextureDrawQuad&>(quad); |
| 1526 printf("LayerTreeHostImpl::DrawLayers texture quad %d %d\n", tq.nearest_
neighbor, tq.resource_id); |
| 1527 } |
| 1528 } |
| 1529 } |
| 1530 for (LayerImpl* li : frame->will_draw_layers) { |
| 1531 printf("LayerTreeHostImpl::DrawLayers %p\n", li); |
| 1532 }*/ |
1509 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); | 1533 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); |
1510 DCHECK(CanDraw()); | 1534 DCHECK(CanDraw()); |
1511 | 1535 |
1512 if (frame->has_no_damage) { | 1536 if (frame->has_no_damage) { |
1513 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); | 1537 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); |
1514 DCHECK(!output_surface_->capabilities() | 1538 DCHECK(!output_surface_->capabilities() |
1515 .draw_and_swap_full_viewport_every_frame); | 1539 .draw_and_swap_full_viewport_every_frame); |
| 1540 //printf("LayerTreeHostImpl::DrawFrame no damage\n"); |
1516 return; | 1541 return; |
1517 } | 1542 } |
1518 | 1543 |
1519 DCHECK(!frame->render_passes.empty()); | 1544 DCHECK(!frame->render_passes.empty()); |
1520 | 1545 |
1521 fps_counter_->SaveTimeStamp(frame_begin_time, | 1546 fps_counter_->SaveTimeStamp(frame_begin_time, |
1522 !output_surface_->context_provider()); | 1547 !output_surface_->context_provider()); |
1523 rendering_stats_instrumentation_->IncrementFrameCount(1); | 1548 rendering_stats_instrumentation_->IncrementFrameCount(1); |
1524 | 1549 |
1525 if (tile_manager_) { | 1550 if (tile_manager_) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1583 IsActivelyScrolling() || needs_animate_layers(); | 1608 IsActivelyScrolling() || needs_animate_layers(); |
1584 | 1609 |
1585 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1610 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
1586 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL); | 1611 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL); |
1587 temp_software_renderer->DrawFrame(&frame->render_passes, | 1612 temp_software_renderer->DrawFrame(&frame->render_passes, |
1588 device_scale_factor_, | 1613 device_scale_factor_, |
1589 DeviceViewport(), | 1614 DeviceViewport(), |
1590 DeviceClip(), | 1615 DeviceClip(), |
1591 disable_picture_quad_image_filtering); | 1616 disable_picture_quad_image_filtering); |
1592 } else { | 1617 } else { |
| 1618 //printf("LayerTreeHostImpl::DrawLayers DrawFrame %p\n", renderer_.get()); |
1593 renderer_->DrawFrame(&frame->render_passes, | 1619 renderer_->DrawFrame(&frame->render_passes, |
1594 device_scale_factor_, | 1620 device_scale_factor_, |
1595 DeviceViewport(), | 1621 DeviceViewport(), |
1596 DeviceClip(), | 1622 DeviceClip(), |
1597 false); | 1623 false); |
1598 } | 1624 } |
1599 // The render passes should be consumed by the renderer. | 1625 // The render passes should be consumed by the renderer. |
1600 DCHECK(frame->render_passes.empty()); | 1626 DCHECK(frame->render_passes.empty()); |
1601 frame->render_passes_by_id.clear(); | 1627 frame->render_passes_by_id.clear(); |
1602 | 1628 |
1603 // The next frame should start by assuming nothing has changed, and changes | 1629 // The next frame should start by assuming nothing has changed, and changes |
1604 // are noted as they occur. | 1630 // are noted as they occur. |
1605 // TODO(boliu): If we did a temporary software renderer frame, propogate the | 1631 // TODO(boliu): If we did a temporary software renderer frame, propogate the |
1606 // damage forward to the next frame. | 1632 // damage forward to the next frame. |
1607 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { | 1633 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { |
1608 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> | 1634 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> |
1609 DidDrawDamagedArea(); | 1635 DidDrawDamagedArea(); |
1610 } | 1636 } |
1611 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); | 1637 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); |
1612 | 1638 |
1613 active_tree_->set_has_ever_been_drawn(true); | 1639 active_tree_->set_has_ever_been_drawn(true); |
1614 devtools_instrumentation::DidDrawFrame(id_); | 1640 devtools_instrumentation::DidDrawFrame(id_); |
1615 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( | 1641 benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( |
1616 rendering_stats_instrumentation_->impl_thread_rendering_stats()); | 1642 rendering_stats_instrumentation_->impl_thread_rendering_stats()); |
1617 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); | 1643 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
| 1644 //printf("LayerTreeHostImpl::DrawLayers done\n"); |
1618 } | 1645 } |
1619 | 1646 |
1620 void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { | 1647 void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { |
1621 for (size_t i = 0; i < frame.will_draw_layers.size(); ++i) | 1648 for (size_t i = 0; i < frame.will_draw_layers.size(); ++i) |
1622 frame.will_draw_layers[i]->DidDraw(resource_provider_.get()); | 1649 frame.will_draw_layers[i]->DidDraw(resource_provider_.get()); |
1623 | 1650 |
1624 // Once all layers have been drawn, pending texture uploads should no | 1651 // Once all layers have been drawn, pending texture uploads should no |
1625 // longer block future uploads. | 1652 // longer block future uploads. |
1626 resource_provider_->MarkPendingUploadsAsNonBlocking(); | 1653 resource_provider_->MarkPendingUploadsAsNonBlocking(); |
1627 } | 1654 } |
(...skipping 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3472 } | 3499 } |
3473 | 3500 |
3474 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3501 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3475 std::vector<PictureLayerImpl*>::iterator it = | 3502 std::vector<PictureLayerImpl*>::iterator it = |
3476 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3503 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3477 DCHECK(it != picture_layers_.end()); | 3504 DCHECK(it != picture_layers_.end()); |
3478 picture_layers_.erase(it); | 3505 picture_layers_.erase(it); |
3479 } | 3506 } |
3480 | 3507 |
3481 } // namespace cc | 3508 } // namespace cc |
OLD | NEW |