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

Side by Side Diff: cc/tiles/tile_manager.cc

Issue 2866173002: [WIP] cc: Use sRGB for rastering non-wide-color-gamut content
Patch Set: Created 3 years, 7 months 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
« cc/paint/display_item_list.cc ('K') | « cc/tiles/tile_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/tiles/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 636 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
637 bool had_enough_memory_to_schedule_tiles_needed_now = true; 637 bool had_enough_memory_to_schedule_tiles_needed_now = true;
638 638
639 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, 639 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes,
640 global_state_.num_resources_limit); 640 global_state_.num_resources_limit);
641 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 641 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
642 global_state_.num_resources_limit); 642 global_state_.num_resources_limit);
643 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(), 643 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(),
644 resource_pool_->resource_count()); 644 resource_pool_->resource_count());
645 645
646 gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace(); 646 gfx::ColorSpace client_raster_color_space = client_->GetRasterColorSpace();
647 647
648 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 648 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
649 client_->BuildRasterQueue(global_state_.tree_priority, 649 client_->BuildRasterQueue(global_state_.tree_priority,
650 RasterTilePriorityQueue::Type::ALL)); 650 RasterTilePriorityQueue::Type::ALL));
651 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue; 651 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue;
652 PrioritizedWorkToSchedule work_to_schedule; 652 PrioritizedWorkToSchedule work_to_schedule;
653 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { 653 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) {
654 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top(); 654 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top();
655 Tile* tile = prioritized_tile.tile(); 655 Tile* tile = prioritized_tile.tile();
656 TilePriority priority = prioritized_tile.priority(); 656 TilePriority priority = prioritized_tile.priority();
657 657
658 gfx::ColorSpace raster_color_space = GetTileColorSpace(prioritized_tile);
659
658 if (TilePriorityViolatesMemoryPolicy(priority)) { 660 if (TilePriorityViolatesMemoryPolicy(priority)) {
659 TRACE_EVENT_INSTANT0( 661 TRACE_EVENT_INSTANT0(
660 "cc", "TileManager::AssignGpuMemory tile violates memory policy", 662 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
661 TRACE_EVENT_SCOPE_THREAD); 663 TRACE_EVENT_SCOPE_THREAD);
662 break; 664 break;
663 } 665 }
664 666
665 bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW; 667 bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW;
666 if (!tile->is_solid_color_analysis_performed() && 668 if (!tile->is_solid_color_analysis_performed() &&
667 tile->use_picture_analysis() && kUseColorEstimator) { 669 tile->use_picture_analysis() && kUseColorEstimator) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 if (tile->raster_task_scheduled_with_checker_images() && 760 if (tile->raster_task_scheduled_with_checker_images() &&
759 prioritized_tile.should_decode_checkered_images_for_tile()) { 761 prioritized_tile.should_decode_checkered_images_for_tile()) {
760 AddCheckeredImagesToDecodeQueue( 762 AddCheckeredImagesToDecodeQueue(
761 prioritized_tile, raster_color_space, 763 prioritized_tile, raster_color_space,
762 &work_to_schedule.checker_image_decode_queue); 764 &work_to_schedule.checker_image_decode_queue);
763 } 765 }
764 } else { 766 } else {
765 // Creating the raster task here will acquire resources, but 767 // Creating the raster task here will acquire resources, but
766 // this resource usage has already been accounted for above. 768 // this resource usage has already been accounted for above.
767 tile->raster_task_ = 769 tile->raster_task_ =
768 CreateRasterTask(prioritized_tile, client_->GetRasterColorSpace(), 770 CreateRasterTask(prioritized_tile, raster_color_space,
769 &work_to_schedule.checker_image_decode_queue); 771 &work_to_schedule.checker_image_decode_queue);
770 } 772 }
771 773
772 memory_usage += memory_required_by_tile_to_be_scheduled; 774 memory_usage += memory_required_by_tile_to_be_scheduled;
773 work_to_schedule.tiles_to_raster.push_back(prioritized_tile); 775 work_to_schedule.tiles_to_raster.push_back(prioritized_tile);
774 } 776 }
775 777
776 // Note that we should try and further reduce memory in case the above loop 778 // Note that we should try and further reduce memory in case the above loop
777 // didn't reduce memory. This ensures that we always release as many resources 779 // didn't reduce memory. This ensures that we always release as many resources
778 // as possible to stay within the memory limit. 780 // as possible to stay within the memory limit.
(...skipping 14 matching lines...) Expand all
793 if (prioritized_tile.priority().priority_bin > TilePriority::NOW) 795 if (prioritized_tile.priority().priority_bin > TilePriority::NOW)
794 break; 796 break;
795 797
796 if (!prioritized_tile.should_decode_checkered_images_for_tile()) 798 if (!prioritized_tile.should_decode_checkered_images_for_tile())
797 continue; 799 continue;
798 800
799 Tile* tile = prioritized_tile.tile(); 801 Tile* tile = prioritized_tile.tile();
800 if (tile->draw_info().is_checker_imaged() || 802 if (tile->draw_info().is_checker_imaged() ||
801 tile->raster_task_scheduled_with_checker_images()) { 803 tile->raster_task_scheduled_with_checker_images()) {
802 AddCheckeredImagesToDecodeQueue( 804 AddCheckeredImagesToDecodeQueue(
803 prioritized_tile, raster_color_space, 805 prioritized_tile, GetTileColorSpace(prioritized_tile),
804 &work_to_schedule.checker_image_decode_queue); 806 &work_to_schedule.checker_image_decode_queue);
805 } 807 }
806 } 808 }
807 } 809 }
808 810
809 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", 811 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
810 !had_enough_memory_to_schedule_tiles_needed_now); 812 !had_enough_memory_to_schedule_tiles_needed_now);
811 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 813 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
812 814
813 memory_stats_from_last_assign_.total_budget_in_bytes = 815 memory_stats_from_last_assign_.total_budget_in_bytes =
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 909
908 // Track the number of dependents for each *_done task. 910 // Track the number of dependents for each *_done task.
909 size_t required_for_activate_count = 0; 911 size_t required_for_activate_count = 0;
910 size_t required_for_draw_count = 0; 912 size_t required_for_draw_count = 0;
911 size_t all_count = 0; 913 size_t all_count = 0;
912 914
913 size_t priority = kTileTaskPriorityBase; 915 size_t priority = kTileTaskPriorityBase;
914 916
915 graph_.Reset(); 917 graph_.Reset();
916 918
917 gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace();
918
919 scoped_refptr<TileTask> required_for_activation_done_task = 919 scoped_refptr<TileTask> required_for_activation_done_task =
920 CreateTaskSetFinishedTask( 920 CreateTaskSetFinishedTask(
921 &TileManager::DidFinishRunningTileTasksRequiredForActivation); 921 &TileManager::DidFinishRunningTileTasksRequiredForActivation);
922 scoped_refptr<TileTask> required_for_draw_done_task = 922 scoped_refptr<TileTask> required_for_draw_done_task =
923 CreateTaskSetFinishedTask( 923 CreateTaskSetFinishedTask(
924 &TileManager::DidFinishRunningTileTasksRequiredForDraw); 924 &TileManager::DidFinishRunningTileTasksRequiredForDraw);
925 scoped_refptr<TileTask> all_done_task = 925 scoped_refptr<TileTask> all_done_task =
926 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); 926 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
927 927
928 // Build a new task queue containing all task currently needed. Tasks 928 // Build a new task queue containing all task currently needed. Tasks
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 work_to_schedule.tiles_to_process_for_images; 965 work_to_schedule.tiles_to_process_for_images;
966 std::vector<DrawImage> new_locked_images; 966 std::vector<DrawImage> new_locked_images;
967 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { 967 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) {
968 Tile* tile = prioritized_tile.tile(); 968 Tile* tile = prioritized_tile.tile();
969 969
970 // TODO(khushalsagar): Send these images to the ImageDecodeService, through 970 // TODO(khushalsagar): Send these images to the ImageDecodeService, through
971 // the CheckerImageTracker as well. See crbug.com/691087. 971 // the CheckerImageTracker as well. See crbug.com/691087.
972 std::vector<DrawImage> images; 972 std::vector<DrawImage> images;
973 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 973 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
974 tile->enclosing_layer_rect(), tile->raster_transform().scale(), 974 tile->enclosing_layer_rect(), tile->raster_transform().scale(),
975 raster_color_space, &images); 975 GetTileColorSpace(prioritized_tile), &images);
976 new_locked_images.insert(new_locked_images.end(), images.begin(), 976 new_locked_images.insert(new_locked_images.end(), images.begin(),
977 images.end()); 977 images.end());
978 } 978 }
979 979
980 // TODO(vmpstr): SOON is misleading here, but these images can come from 980 // TODO(vmpstr): SOON is misleading here, but these images can come from
981 // several diffent tiles. Rethink what we actually want to trace here. Note 981 // several diffent tiles. Rethink what we actually want to trace here. Note
982 // that I'm using SOON, since it can't be NOW (these are prepaint). 982 // that I'm using SOON, since it can't be NOW (these are prepaint).
983 ImageDecodeCache::TracingInfo tracing_info(prepare_tiles_count_, 983 ImageDecodeCache::TracingInfo tracing_info(prepare_tiles_count_,
984 TilePriority::SOON); 984 TilePriority::SOON);
985 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks = 985 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks =
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1493 1493
1494 // Utility function that can be used to create a "Task set finished" task that 1494 // Utility function that can be used to create a "Task set finished" task that
1495 // posts |callback| to |task_runner| when run. 1495 // posts |callback| to |task_runner| when run.
1496 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( 1496 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1497 void (TileManager::*callback)()) { 1497 void (TileManager::*callback)()) {
1498 return make_scoped_refptr(new TaskSetFinishedTaskImpl( 1498 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1499 task_runner_, 1499 task_runner_,
1500 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); 1500 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr())));
1501 } 1501 }
1502 1502
1503 gfx::ColorSpace TileManager::GetTileColorSpace(
1504 const PrioritizedTile& prioritized_tile) const {
1505 return prioritized_tile.raster_source()->HasNonSRGBContent()
1506 ? client_raster_color_space
1507 : gfx::ColorSpace::CreateSRGB();
vmpstr 2017/05/09 22:58:27 Is this a cheap call? Assuming that everything is
1508 }
1509
1503 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 1510 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
1504 TileManager::ActivationStateAsValue() { 1511 TileManager::ActivationStateAsValue() {
1505 auto state = base::MakeUnique<base::trace_event::TracedValue>(); 1512 auto state = base::MakeUnique<base::trace_event::TracedValue>();
1506 ActivationStateAsValueInto(state.get()); 1513 ActivationStateAsValueInto(state.get());
1507 return std::move(state); 1514 return std::move(state);
1508 } 1515 }
1509 1516
1510 void TileManager::ActivationStateAsValueInto( 1517 void TileManager::ActivationStateAsValueInto(
1511 base::trace_event::TracedValue* state) { 1518 base::trace_event::TracedValue* state) {
1512 state->SetString("tree_priority", 1519 state->SetString("tree_priority",
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 all_tile_tasks_completed = false; 1648 all_tile_tasks_completed = false;
1642 did_notify_all_tile_tasks_completed = false; 1649 did_notify_all_tile_tasks_completed = false;
1643 } 1650 }
1644 1651
1645 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1652 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1646 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1653 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1647 PrioritizedWorkToSchedule&& other) = default; 1654 PrioritizedWorkToSchedule&& other) = default;
1648 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1655 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1649 1656
1650 } // namespace cc 1657 } // namespace cc
OLDNEW
« cc/paint/display_item_list.cc ('K') | « cc/tiles/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698