blob: f1b89f0b673aa67c68ecfbd6ad48eee699b857ff [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CanvasHeuristicParameters_h
#define CanvasHeuristicParameters_h
namespace blink {
namespace CanvasHeuristicParameters {
enum {
// Layer promotion heuristic parameters
//======================================
// FIXME (crbug.com/463239):
// The Layer promotion heuristics should go away after slimming paint
// is completely phased in and display list canvases are modified to
// use a lightweight layering primitive instead of the
// SkCanvas::saveLayer.
// Heuristic: Canvases that are overdrawn beyond this factor in a
// single frame are promoted to a direct composited layer so that
// their contents not be re-rasterized by the compositor when the
// containing layer is the object of a paint invalidation.
kExpensiveOverdrawThreshold = 10,
kExpensivePathPointCount = 50,
kSVGImageSourcesAreExpensive = 1,
kConcavePathsAreExpensive = 1,
kComplexClipsAreExpensive = 1,
kBlurredShadowsAreExpensive = 1,
// Heuristic: When drawing a source image that has more pixels than
// the destination canvas by the following factor or more, the draw
// is considered expensive.
kExpensiveImageSizeRatio = 4,
// Display list fallback heuristic parameters
//============================================
// Frames ending with more than this number of levels remaining
// on the state stack at the end of a frame are too expensive to
// remain in display list mode. This criterion is motivated by an
// O(N) cost in carying over state from one frame to the next when
// in display list mode. The value of this parameter should be high
// enough to almost never kick in other than for cases with unmatched
// save()/restore() calls are low enough to kick in before state
// management becomes measurably expensive.
kExpensiveRecordingStackDepth = 50,
// GPU vs. display list heuristic parameters
//===========================================
// Pixel count beyond which we should always prefer to use display
// lists. Rationale: The allocation of large textures for canvas
// tends to starve the compositor, and increase the probability of
// failure of subsequent allocations required for double buffering.
kPreferDisplayListOverGpuSizeThreshold = 8096 * 4096,
// Disable Acceleration heuristic parameters
//===========================================
// When drawing very large images to canvases, there is a point where
// GPU acceleration becomes inefficient due to texture upload overhead,
// especially when the image is large enough that it is likely to
// monopolize the texture cache, and when it is being downsized to the
// point that few of the upload texels are actually sampled. When both
// of these conditions are met, we disable acceleration.
kDrawImageTextureUploadSoftSizeLimit = 4096 * 4096,
kDrawImageTextureUploadSoftSizeLimitScaleThreshold = 4,
kDrawImageTextureUploadHardSizeLimit = 8192 * 8192,
// GPU readback prevention heuristics
//====================================
kGPUReadbackForcesNoAcceleration = 1,
// When gpu readback is successively invoked in following number of frames,
// we disable gpu acceleration to avoid the high cost of gpu readback.
kGPUReadbackMinSuccessiveFrames = 3,
// When a canvas is used as a source image, if its destination is
// non-accelerated and the source canvas is accelerated, a readback
// from the gpu is necessary. This option causes the source canvas to
// switch to non-accelerated when this situation is encountered to
// prevent future canvas-to-canvas draws from requiring a readback.
kDisableAccelerationToAvoidReadbacks = 0,
// See description of DisableAccelerationToAvoidReadbacks. This is the
// opposite strategy : accelerate the destination canvas. If both
// EnableAccelerationToAvoidReadbacks and
// DisableAccelerationToAvoidReadbacks are specified, we try to enable
// acceleration on the destination first. If that does not succeed,
// we disable acceleration on the source canvas. Either way, future
// readbacks are prevented.
kEnableAccelerationToAvoidReadbacks = 1,
}; // enum
} // namespace CanvasHeuristicParameters
} // namespace blink
#endif