1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245

cc / trees / layer_tree_settings.h [blame]

// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_TREES_LAYER_TREE_SETTINGS_H_
#define CC_TREES_LAYER_TREE_SETTINGS_H_

#include <stddef.h>

#include "base/time/time.h"
#include "cc/base/features.h"
#include "cc/cc_export.h"
#include "cc/debug/layer_tree_debug_state.h"
#include "cc/scheduler/scheduler_settings.h"
#include "cc/tiles/image_decode_cache_utils.h"
#include "cc/tiles/tile_manager_settings.h"
#include "cc/trees/managed_memory_policy.h"
#include "components/viz/common/display/renderer_settings.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/size.h"

namespace cc {

class CC_EXPORT LayerTreeSettings {
 public:
  LayerTreeSettings();
  LayerTreeSettings(const LayerTreeSettings& other);
  virtual ~LayerTreeSettings();

  SchedulerSettings ToSchedulerSettings() const;
  TileManagerSettings ToTileManagerSettings() const;

  // If true, this tree doesn't draw itself. Instead upon activation it pushes
  // differential updates to a remote (GPU-side) display tree which is drawn
  // using tile resources prepared by this tree.
  bool UseLayerContextForDisplay() const;

  // If true, this is a GPU-side display tree receiving updates from a remote
  // client via the LayerContext API. Such trees do no raster work of their own
  // and submit compositor frames directly within Viz using tiles rastered by
  // the remote client.
  bool is_display_tree = false;

  bool single_thread_proxy_scheduler = true;
  bool main_frame_before_activation_enabled = false;
  bool using_synchronous_renderer_compositor = false;
  bool enable_early_damage_check = false;
  // When |enable_early_damage_check| is true, the early damage check is
  // performed if one of the last |damaged_frame_limit| frames had no damage.
  int damaged_frame_limit = 3;
  bool can_use_lcd_text = true;
  bool gpu_rasterization_disabled = false;
  int gpu_rasterization_msaa_sample_count = -1;
  float gpu_rasterization_skewport_target_time_in_seconds = 0.2f;
  bool create_low_res_tiling = false;
  bool use_stream_video_draw_quad = false;
  bool use_gpu_memory_buffer_resources = false;

  enum ScrollbarAnimator {
    NO_ANIMATOR,
    ANDROID_OVERLAY,
    AURA_OVERLAY,
  };
  ScrollbarAnimator scrollbar_animator = NO_ANIMATOR;
  base::TimeDelta scrollbar_fade_delay;
  base::TimeDelta scrollbar_fade_duration;
  base::TimeDelta scrollbar_thinning_duration;
  float idle_thickness_scale = 0.4f;
  bool scrollbar_flash_after_any_scroll_update = false;
  base::TimeDelta scroll_animation_duration_for_testing;
  bool layers_always_allowed_lcd_text = false;
  float low_res_contents_scale_factor = 0.25f;
  float top_controls_show_threshold = 0.5f;
  float top_controls_hide_threshold = 0.5f;
  gfx::Size default_tile_size;
  gfx::Size max_untiled_layer_size;
  // If set, indicates the largest tile size we will use for GPU Raster. If not
  // set, no limit is enforced.
  gfx::Size max_gpu_raster_tile_size;
  // Even for really wide viewports, at some point GPU raster should use
  // less than 4 tiles to fill the viewport. This is set to 256 as a
  // sane minimum for now, but we might want to tune this for low-end.
  int min_height_for_gpu_raster_tile = 256;
  gfx::Size minimum_occlusion_tracking_size;
  // Note this value is specified with an ideal contents scale in mind. That
  // is, the ideal tiling would use this value as the padding.
  // TODO(vmpstr): Figure out a better number that doesn't depend on scale.
  constexpr static int kDefaultSkewportExtrapolationLimitInScrenPixels = 2000;
  int tiling_interest_area_padding = features::kDefaultInterestAreaSizeInPixels;
  // Note: only used for software raster, otherwise
  // |gpu_rasterization_skewport_target_time_in_seconds| is used.
  float skewport_target_time_in_seconds = 1.0f;
  int skewport_extrapolation_limit_in_screen_pixels =
      kDefaultSkewportExtrapolationLimitInScrenPixels;
  static_assert(kDefaultSkewportExtrapolationLimitInScrenPixels <=
                    features::kDefaultInterestAreaSizeInPixels,
                "Skewport size must be smaller than the interest area to "
                "prevent prepainted tiles from being discarded.");
  size_t max_memory_for_prepaint_percentage = 100;
  bool use_zero_copy = false;
  bool use_partial_raster = false;
  bool enable_elastic_overscroll = false;
  size_t scheduled_raster_task_limit = 32;
  bool use_occlusion_for_tile_prioritization = false;
  bool use_layer_lists = false;
  int max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024;
  ManagedMemoryPolicy memory_policy;
  size_t decoded_image_working_set_budget_bytes =
      ImageDecodeCacheUtils::GetWorkingSetBytesForImageDecode(
          /*for_renderer=*/false);
  int max_preraster_distance_in_screen_pixels = 1000;
  bool use_rgba_4444 = false;
  bool unpremultiply_and_dither_low_bit_depth_tiles = false;

  // If set to true, the compositor may selectively defer image decodes to the
  // Image Decode Service and raster tiles without images until the decode is
  // ready.
  bool enable_checker_imaging = false;

  // When content needs a wide color gamut, raster in wide if available.
  // But when the content is sRGB, some situations prefer to raster in
  // wide while others prefer to raster in sRGB.
  bool prefer_raster_in_srgb = false;

  // The minimum size of an image we should considering decoding using the
  // deferred path.
  size_t min_image_bytes_to_checker = 1 * 1024 * 1024;  // 1MB.

  // Disables checkering of images when not using gpu rasterization.
  bool only_checker_images_with_gpu_raster = false;

  LayerTreeDebugState initial_debug_state;

  // Indicates the case when a sub-frame gets its own LayerTree because it's
  // rendered in a different process from its ancestor frames.
  bool is_for_embedded_frame = false;

  // Indicates when the LayerTree is for a GuestView or top level frame. In all
  // these cases we may have a page scale.
  bool is_for_scalable_page = true;

  // Determines whether we disallow non-exact matches when finding resources
  // in ResourcePool. Only used for layout or pixel tests, as non-deterministic
  // resource sizes can lead to floating point error and noise in these tests.
  bool disallow_non_exact_resource_reuse = false;

  // Whether the Scheduler should wait for all pipeline stages before attempting
  // to draw. If |true|, they will block indefinitely until all stages have
  // completed the current BeginFrame before triggering their own BeginFrame
  // deadlines.
  bool wait_for_all_pipeline_stages_before_draw = false;

  // Determines whether animated scrolling is supported. If true, and the
  // incoming gesture scroll is of a type that would normally be animated (e.g.
  // coarse granularity scrolls like those coming from an external mouse wheel),
  // the scroll will be performed smoothly using the animation system rather
  // than instantly.
  bool enable_smooth_scroll = false;

  // Whether layer tree commits should be made directly to the active
  // tree on the impl thread. If |false| LayerTreeHostImpl creates a
  // pending layer tree and produces that as the 'sync tree' with
  // which LayerTreeHost synchronizes. If |true| LayerTreeHostImpl
  // produces the active tree as its 'sync tree'.
  bool commit_to_active_tree = true;

  // Whether image animations can be reset to the beginning to avoid skipping
  // many frames.
  bool enable_image_animation_resync = true;

  // Whether to use edge anti-aliasing for all layer types that supports it.
  bool enable_edge_anti_aliasing = true;

  // Whether SetViewportRectAndScale should update the painted scale factor or
  // the device scale factor.
  bool use_painted_device_scale_factor = false;

  // When false, scroll deltas accumulated on the impl thread are rounded to
  // integer values when sent to Blink on commit. This flag should eventually
  // go away and CC should send Blink fractional values:
  // https://crbug.com/414283.
  bool commit_fractional_scroll_deltas = false;

  // Whether the compositor should attempt to sync with the scroll handlers
  // before submitting a frame.
  bool enable_synchronized_scrolling = true;

#if DCHECK_IS_ON()
  // Whether to check if any double blur exists.
  bool log_on_ui_double_background_blur = false;
#endif

  // When enabled, enforces new interoperable semantics for 3D transforms.
  // See crbug.com/1008483.
  bool enable_backface_visibility_interop = false;

  // Enables ThrottleDecider which produces a list of FrameSinkIds that are
  // candidates for throttling.
  // LayerTreeHostSingleThreadClient::FrameSinksToThrottleUpdated() will be
  // called with candidates.
  bool enable_compositing_based_throttling = false;

  // Whether it is a LayerTree for ui.
  bool is_layer_tree_for_ui = false;

  // Whether tile resources are dropped for hidden layers. In terms of code,
  // this uses PictureLayerImpl::HasValidTilePriorities(), which may return true
  // even if the layer is not drawn. For example, if the layer is occluded it is
  // still considered drawn and will not be impacted by this feature.
  bool release_tile_resources_for_hidden_layers = false;

  // Whether Fluent scrollbar is enabled. Please check https://crbug.com/1292117
  // to find the link to the Fluent Scrollbar spec and related CLs.
  bool enable_fluent_scrollbar = false;
  // This feature overrides enable_fluent_scrollbar by enabling them in overlay
  // mode. Overlay Fluent scrollbars have disappearance animation transitions
  // and are rendered over page's content.
  // For more information please check https://crbug.com/1479146
  bool enable_fluent_overlay_scrollbar = false;

  // Whether to disable the frame rate limit in the scheduler.
  bool disable_frame_rate_limit = false;

  // Enables shared image cache for gpu.
  // TODO(crbug.com/40243842): not ready to be used by renderer cc instance yet.
  bool enable_shared_image_cache_for_gpu = false;

  // Maximum size for buffers allocated for rendering when GPU compositing is
  // disabled. This size is equivalent to the max texture size in GPU mode.
  // This is an arbitrary limit here similar to what hardware might have.
  int max_render_buffer_bounds_for_sw = 16 * 1024;

  // Whether the client supports HitTestOpaqueness::kOpaque. If yes, cc will
  // respect the flag and optimize scroll hit testing.
  bool enable_hit_test_opaqueness = false;

  // Whether to use variable refresh rates when generating begin frames.
  bool enable_variable_refresh_rate = false;

  bool dynamic_safe_area_insets_on_scroll_enabled = false;
};

}  // namespace cc

#endif  // CC_TREES_LAYER_TREE_SETTINGS_H_