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

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

Issue 270333003: cc: Do not limit number of raster tasks for upload limit. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/test/fake_tile_manager.cc » ('j') | 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/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 state->SetInteger("canceled_count", stats.canceled_count); 365 state->SetInteger("canceled_count", stats.canceled_count);
366 return state.PassAs<base::Value>(); 366 return state.PassAs<base::Value>();
367 } 367 }
368 368
369 // static 369 // static
370 scoped_ptr<TileManager> TileManager::Create( 370 scoped_ptr<TileManager> TileManager::Create(
371 TileManagerClient* client, 371 TileManagerClient* client,
372 ResourcePool* resource_pool, 372 ResourcePool* resource_pool,
373 Rasterizer* rasterizer, 373 Rasterizer* rasterizer,
374 Rasterizer* gpu_rasterizer, 374 Rasterizer* gpu_rasterizer,
375 size_t max_raster_usage_bytes,
376 bool use_rasterize_on_demand, 375 bool use_rasterize_on_demand,
377 RenderingStatsInstrumentation* rendering_stats_instrumentation) { 376 RenderingStatsInstrumentation* rendering_stats_instrumentation) {
378 return make_scoped_ptr(new TileManager(client, 377 return make_scoped_ptr(new TileManager(client,
379 resource_pool, 378 resource_pool,
380 rasterizer, 379 rasterizer,
381 gpu_rasterizer, 380 gpu_rasterizer,
382 max_raster_usage_bytes,
383 use_rasterize_on_demand, 381 use_rasterize_on_demand,
384 rendering_stats_instrumentation)); 382 rendering_stats_instrumentation));
385 } 383 }
386 384
387 TileManager::TileManager( 385 TileManager::TileManager(
388 TileManagerClient* client, 386 TileManagerClient* client,
389 ResourcePool* resource_pool, 387 ResourcePool* resource_pool,
390 Rasterizer* rasterizer, 388 Rasterizer* rasterizer,
391 Rasterizer* gpu_rasterizer, 389 Rasterizer* gpu_rasterizer,
392 size_t max_raster_usage_bytes,
393 bool use_rasterize_on_demand, 390 bool use_rasterize_on_demand,
394 RenderingStatsInstrumentation* rendering_stats_instrumentation) 391 RenderingStatsInstrumentation* rendering_stats_instrumentation)
395 : client_(client), 392 : client_(client),
396 resource_pool_(resource_pool), 393 resource_pool_(resource_pool),
397 prioritized_tiles_dirty_(false), 394 prioritized_tiles_dirty_(false),
398 all_tiles_that_need_to_be_rasterized_have_memory_(true), 395 all_tiles_that_need_to_be_rasterized_have_memory_(true),
399 all_tiles_required_for_activation_have_memory_(true), 396 all_tiles_required_for_activation_have_memory_(true),
400 memory_required_bytes_(0), 397 memory_required_bytes_(0),
401 memory_nice_to_have_bytes_(0), 398 memory_nice_to_have_bytes_(0),
402 bytes_releasable_(0), 399 bytes_releasable_(0),
403 resources_releasable_(0), 400 resources_releasable_(0),
404 max_raster_usage_bytes_(max_raster_usage_bytes),
405 ever_exceeded_memory_budget_(false), 401 ever_exceeded_memory_budget_(false),
406 rendering_stats_instrumentation_(rendering_stats_instrumentation), 402 rendering_stats_instrumentation_(rendering_stats_instrumentation),
407 did_initialize_visible_tile_(false), 403 did_initialize_visible_tile_(false),
408 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 404 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
409 use_rasterize_on_demand_(use_rasterize_on_demand) { 405 use_rasterize_on_demand_(use_rasterize_on_demand) {
410 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { 406 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = {
411 rasterizer, // RASTERIZER_TYPE_DEFAULT 407 rasterizer, // RASTERIZER_TYPE_DEFAULT
412 gpu_rasterizer, // RASTERIZER_TYPE_GPU 408 gpu_rasterizer, // RASTERIZER_TYPE_GPU
413 }; 409 };
414 rasterizer_delegate_ = 410 rasterizer_delegate_ =
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 821
826 size_t bytes_that_exceeded_memory_budget = 0; 822 size_t bytes_that_exceeded_memory_budget = 0;
827 size_t soft_bytes_left = soft_bytes_allocatable; 823 size_t soft_bytes_left = soft_bytes_allocatable;
828 size_t hard_bytes_left = hard_bytes_allocatable; 824 size_t hard_bytes_left = hard_bytes_allocatable;
829 825
830 size_t resources_left = resources_allocatable; 826 size_t resources_left = resources_allocatable;
831 bool oomed_soft = false; 827 bool oomed_soft = false;
832 bool oomed_hard = false; 828 bool oomed_hard = false;
833 bool have_hit_soft_memory = false; // Soft memory comes after hard. 829 bool have_hit_soft_memory = false; // Soft memory comes after hard.
834 830
835 // Memory we assign to raster tasks now will be deducted from our memory
836 // in future iterations if priorities change. By assigning at most half
837 // the raster limit, we will always have another 50% left even if priorities
838 // change completely (assuming we check for completed/cancelled rasters
839 // between each call to this function).
reveman 2014/05/08 13:55:37 FYI, I'm OK removing this as I don't think this "a
vmpstr 2014/05/08 16:49:04 I agree with this as well. I think tile manager th
840 size_t max_raster_bytes = max_raster_usage_bytes_ / 2;
841 size_t raster_bytes = 0;
842
843 unsigned schedule_priority = 1u; 831 unsigned schedule_priority = 1u;
844 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) { 832 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) {
845 Tile* tile = *it; 833 Tile* tile = *it;
846 ManagedTileState& mts = tile->managed_state(); 834 ManagedTileState& mts = tile->managed_state();
847 835
848 mts.scheduled_priority = schedule_priority++; 836 mts.scheduled_priority = schedule_priority++;
849 837
850 mts.raster_mode = tile->DetermineOverallRasterMode(); 838 mts.raster_mode = tile->DetermineOverallRasterMode();
851 839
852 ManagedTileState::TileVersion& tile_version = 840 ManagedTileState::TileVersion& tile_version =
853 mts.tile_versions[mts.raster_mode]; 841 mts.tile_versions[mts.raster_mode];
854 842
855 // If this tile doesn't need a resource, then nothing to do. 843 // If this tile doesn't need a resource, then nothing to do.
856 if (!tile_version.requires_resource()) 844 if (!tile_version.requires_resource())
857 continue; 845 continue;
858 846
859 // If the tile is not needed, free it up. 847 // If the tile is not needed, free it up.
860 if (mts.bin == NEVER_BIN) { 848 if (mts.bin == NEVER_BIN) {
861 FreeResourcesForTile(tile); 849 FreeResourcesForTile(tile);
862 continue; 850 continue;
863 } 851 }
864 852
865 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; 853 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN;
866 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); 854 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile);
867 const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated;
868 const size_t tile_bytes_left = 855 const size_t tile_bytes_left =
869 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; 856 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left;
870 857
871 // Hard-limit is reserved for tiles that would cause a calamity 858 // Hard-limit is reserved for tiles that would cause a calamity
872 // if they were to go away, so by definition they are the highest 859 // if they were to go away, so by definition they are the highest
873 // priority memory, and must be at the front of the list. 860 // priority memory, and must be at the front of the list.
874 DCHECK(!(have_hit_soft_memory && tile_uses_hard_limit)); 861 DCHECK(!(have_hit_soft_memory && tile_uses_hard_limit));
875 have_hit_soft_memory |= !tile_uses_hard_limit; 862 have_hit_soft_memory |= !tile_uses_hard_limit;
876 863
877 size_t tile_bytes = 0; 864 size_t tile_bytes = 0;
878 size_t tile_resources = 0; 865 size_t tile_resources = 0;
879 866
880 // It costs to maintain a resource. 867 // It costs to maintain a resource.
881 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 868 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
882 if (mts.tile_versions[mode].resource_) { 869 if (mts.tile_versions[mode].resource_) {
883 tile_bytes += bytes_if_allocated; 870 tile_bytes += bytes_if_allocated;
884 tile_resources++; 871 tile_resources++;
885 } 872 }
886 } 873 }
887 874
888 // Allow lower priority tiles with initialized resources to keep 875 // Allow lower priority tiles with initialized resources to keep
889 // their memory by only assigning memory to new raster tasks if 876 // their memory by only assigning memory to new raster tasks if
890 // they can be scheduled. 877 // they can be scheduled.
891 if (raster_bytes_if_rastered <= max_raster_bytes) { 878 if (tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit) {
reveman 2014/05/08 13:55:37 why do we need a conditional here now? was this co
vmpstr 2014/05/08 16:49:04 I think it should've been <= raster_bytes || size
reveman 2014/05/08 17:07:51 Ok, please add a variable here instead of doing "t
alokp 2014/05/08 18:04:47 Done.
892 // If we don't have the required version, and it's not in flight 879 // If we don't have the required version, and it's not in flight
893 // then we'll have to pay to create a new task. 880 // then we'll have to pay to create a new task.
894 if (!tile_version.resource_ && !tile_version.raster_task_) { 881 if (!tile_version.resource_ && !tile_version.raster_task_) {
895 tile_bytes += bytes_if_allocated; 882 tile_bytes += bytes_if_allocated;
896 tile_resources++; 883 tile_resources++;
897 } 884 }
898 } 885 }
899 886
900 // Tile is OOM. 887 // Tile is OOM.
901 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) { 888 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) {
(...skipping 23 matching lines...) Expand all
925 912
926 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized| 913 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized|
927 // has reached it's limit or we've failed to assign gpu memory to this 914 // has reached it's limit or we've failed to assign gpu memory to this
928 // or any higher priority tile. Preventing tiles that fit into memory 915 // or any higher priority tile. Preventing tiles that fit into memory
929 // budget to be rasterized when higher priority tile is oom is 916 // budget to be rasterized when higher priority tile is oom is
930 // important for two reasons: 917 // important for two reasons:
931 // 1. Tile size should not impact raster priority. 918 // 1. Tile size should not impact raster priority.
932 // 2. Tiles with existing raster task could otherwise incorrectly 919 // 2. Tiles with existing raster task could otherwise incorrectly
933 // be added as they are not affected by |bytes_allocatable|. 920 // be added as they are not affected by |bytes_allocatable|.
934 bool can_schedule_tile = 921 bool can_schedule_tile =
935 !oomed_soft && raster_bytes_if_rastered <= max_raster_bytes && 922 !oomed_soft &&
936 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit; 923 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit;
937 924
938 if (!can_schedule_tile) { 925 if (!can_schedule_tile) {
939 all_tiles_that_need_to_be_rasterized_have_memory_ = false; 926 all_tiles_that_need_to_be_rasterized_have_memory_ = false;
940 if (tile->required_for_activation()) 927 if (tile->required_for_activation())
941 all_tiles_required_for_activation_have_memory_ = false; 928 all_tiles_required_for_activation_have_memory_ = false;
942 it.DisablePriorityOrdering(); 929 it.DisablePriorityOrdering();
943 continue; 930 continue;
944 } 931 }
945 932
946 raster_bytes = raster_bytes_if_rastered;
947 tiles_that_need_to_be_rasterized->push_back(tile); 933 tiles_that_need_to_be_rasterized->push_back(tile);
948 } 934 }
949 935
950 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. 936 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit.
951 ever_exceeded_memory_budget_ |= oomed_hard; 937 ever_exceeded_memory_budget_ |= oomed_hard;
952 if (ever_exceeded_memory_budget_) { 938 if (ever_exceeded_memory_budget_) {
953 TRACE_COUNTER_ID2("cc", 939 TRACE_COUNTER_ID2("cc",
954 "over_memory_budget", 940 "over_memory_budget",
955 this, 941 this,
956 "budget", 942 "budget",
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 1612
1627 if (b_priority.resolution != a_priority.resolution) { 1613 if (b_priority.resolution != a_priority.resolution) {
1628 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || 1614 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) ||
1629 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || 1615 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) ||
1630 (a_priority.resolution == NON_IDEAL_RESOLUTION); 1616 (a_priority.resolution == NON_IDEAL_RESOLUTION);
1631 } 1617 }
1632 return a_priority.IsHigherPriorityThan(b_priority); 1618 return a_priority.IsHigherPriorityThan(b_priority);
1633 } 1619 }
1634 1620
1635 } // namespace cc 1621 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/test/fake_tile_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698