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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 558083002: [cc] Add nearest neighbor filtering for TextureLayer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add nearest_neighbor field to TextureMailbox. Created 6 years, 1 month 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
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698