blob: 228cdb46ee5764b5e9499bfd1603bea6f9285257 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/common/features.h"
#include <string>
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "base/system/sys_info.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/viz/common/delegated_ink_prediction_configuration.h"
#include "components/viz/common/switches.h"
#include "components/viz/common/viz_utils.h"
#include "gpu/config/gpu_finch_features.h"
#include "gpu/config/gpu_switches.h"
#include "media/media_buildflags.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/build_info.h"
#endif
namespace {
// FieldTrialParams for `DynamicSchedulerForDraw` and
// `kDynamicSchedulerForClients`.
const char kDynamicSchedulerPercentile[] = "percentile";
} // namespace
namespace features {
// Enables the use of power hint APIs on Android.
BASE_FEATURE(kAdpf, "Adpf", base::FEATURE_DISABLED_BY_DEFAULT);
// Target duration used for power hint on Android.
// `0` indicates use hard coded default.
const base::FeatureParam<int> kAdpfTargetDurationMs{&kAdpf,
"AdpfTargetDurationMs", 0};
BASE_FEATURE(kEnableOverlayPrioritization,
"EnableOverlayPrioritization",
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kUseMultipleOverlays,
"UseMultipleOverlays",
#if BUILDFLAG(IS_CHROMEOS_ASH)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
const char kMaxOverlaysParam[] = "max_overlays";
BASE_FEATURE(kDelegatedCompositing,
"DelegatedCompositing",
#if BUILDFLAG(IS_CHROMEOS_LACROS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kVideoDetectorIgnoreNonVideos,
"VideoDetectorIgnoreNonVideos",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSimpleFrameRateThrottling,
"SimpleFrameRateThrottling",
base::FEATURE_DISABLED_BY_DEFAULT);
// Kill-switch to disable de-jelly, even if flags/properties indicate it should
// be enabled.
BASE_FEATURE(kDisableDeJelly,
"DisableDeJelly",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID)
// When wide color gamut content from the web is encountered, promote our
// display to wide color gamut if supported.
BASE_FEATURE(kDynamicColorGamut,
"DynamicColorGamut",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
// Submit CompositorFrame from SynchronousLayerTreeFrameSink directly to viz in
// WebView.
BASE_FEATURE(kVizFrameSubmissionForWebView,
"VizFrameSubmissionForWebView",
base::FEATURE_DISABLED_BY_DEFAULT);
// Whether we should use the real buffers corresponding to overlay candidates in
// order to do a pageflip test rather than allocating test buffers.
BASE_FEATURE(kUseRealBuffersForPageFlipTest,
"UseRealBuffersForPageFlipTest",
base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_FUCHSIA)
// Enables SkiaOutputDeviceBufferQueue instead of Vulkan swapchain on Fuchsia.
BASE_FEATURE(kUseSkiaOutputDeviceBufferQueue,
"UseSkiaOutputDeviceBufferQueue",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
// Whether we should log extra debug information to webrtc native log.
BASE_FEATURE(kWebRtcLogCapturePipeline,
"WebRtcLogCapturePipeline",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
// Enables swap chains to call SetPresentDuration to request DWM/OS to reduce
// vsync.
BASE_FEATURE(kUseSetPresentDuration,
"UseSetPresentDuration",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif // BUILDFLAG(IS_WIN)
// Enables platform supported delegated ink trails instead of Skia backed
// delegated ink trails.
BASE_FEATURE(kUsePlatformDelegatedInk,
"UsePlatformDelegatedInk",
base::FEATURE_ENABLED_BY_DEFAULT);
// Used to debug Android WebView Vulkan composite. Composite to an intermediate
// buffer and draw the intermediate buffer to the secondary command buffer.
BASE_FEATURE(kWebViewVulkanIntermediateBuffer,
"WebViewVulkanIntermediateBuffer",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID)
// Hardcoded as disabled for WebView to have a different default for
// UseSurfaceLayerForVideo from chrome.
BASE_FEATURE(kUseSurfaceLayerForVideoDefault,
"UseSurfaceLayerForVideoDefault",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewNewInvalidateHeuristic,
"WebViewNewInvalidateHeuristic",
base::FEATURE_DISABLED_BY_DEFAULT);
// Historically media on android hardcoded SRGB color space because of lack of
// color space support in surface control. This controls if we want to use real
// color space in DisplayCompositor.
BASE_FEATURE(kUseRealVideoColorSpaceForDisplay,
"UseRealVideoColorSpaceForDisplay",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
// Used by CC to throttle frame production of older surfaces. Used by the
// Browser to batch SurfaceSync calls sent to the Renderer for properties can
// change in close proximity to each other.
BASE_FEATURE(kSurfaceSyncThrottling,
"SurfaceSyncThrottling",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kDrawPredictedInkPoint,
"DrawPredictedInkPoint",
base::FEATURE_DISABLED_BY_DEFAULT);
const char kDraw1Point12Ms[] = "1-pt-12ms";
const char kDraw2Points6Ms[] = "2-pt-6ms";
const char kDraw1Point6Ms[] = "1-pt-6ms";
const char kDraw2Points3Ms[] = "2-pt-3ms";
const char kPredictorKalman[] = "kalman";
const char kPredictorLinearResampling[] = "linear-resampling";
const char kPredictorLinear1[] = "linear-1";
const char kPredictorLinear2[] = "linear-2";
const char kPredictorLsq[] = "lsq";
// Used by Viz to parameterize adjustments to scheduler deadlines.
BASE_FEATURE(kDynamicSchedulerForDraw,
"DynamicSchedulerForDraw",
base::FEATURE_DISABLED_BY_DEFAULT);
// User to parameterize adjustments to clients' deadlines.
BASE_FEATURE(kDynamicSchedulerForClients,
"DynamicSchedulerForClients",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_MAC)
BASE_FEATURE(kMacCAOverlayQuad,
"MacCAOverlayQuads",
base::FEATURE_ENABLED_BY_DEFAULT);
// The maximum supported overlay quad number on Mac CALayerOverlay.
// The default is set to -1. When MaxNum is < 0, the default in CALayerOverlay
// will be used instead.
const base::FeatureParam<int> kMacCAOverlayQuadMaxNum{
&kMacCAOverlayQuad, "MacCAOverlayQuadMaxNum", -1};
#endif
#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE)
BASE_FEATURE(kCanSkipRenderPassOverlay,
"CanSkipRenderPassOverlay",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
// TODO(crbug.com/1357744): Solve the vulkan flakiness issue before enabling
// this on Linux.
BASE_FEATURE(kAllowUndamagedNonrootRenderPassToSkip,
"AllowUndamagedNonrootRenderPassToSkip",
base::FEATURE_DISABLED_BY_DEFAULT);
// Whether to:
// - Perform periodic inactive frame culling.
// - Cull *all* frames in case of critical memory pressure, rather than keeping
// one.
BASE_FEATURE(kAggressiveFrameCulling,
"AggressiveFrameCulling",
base::FEATURE_DISABLED_BY_DEFAULT);
// If enabled, do not rely on surface garbage collection to happen
// periodically, but trigger it eagerly, to avoid missing calls.
BASE_FEATURE(kEagerSurfaceGarbageCollection,
"EagerSurfaceGarbageCollection",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsAdpfEnabled() {
// TODO(crbug.com/1157620): Limit this to correct android version.
return base::FeatureList::IsEnabled(kAdpf);
}
bool IsOverlayPrioritizationEnabled() {
#if BUILDFLAG(IS_CHROMEOS_LACROS)
// DelegatedCompositing in Lacros makes this feature a no-op.
return false;
#else
return base::FeatureList::IsEnabled(kEnableOverlayPrioritization);
#endif
}
bool IsDelegatedCompositingEnabled() {
return base::FeatureList::IsEnabled(kDelegatedCompositing);
}
// If a synchronous IPC should used when destroying windows. This exists to test
// the impact of removing the sync IPC.
bool IsSyncWindowDestructionEnabled() {
static BASE_FEATURE(kSyncWindowDestruction, "SyncWindowDestruction",
base::FEATURE_ENABLED_BY_DEFAULT);
return base::FeatureList::IsEnabled(kSyncWindowDestruction);
}
bool IsSimpleFrameRateThrottlingEnabled() {
return base::FeatureList::IsEnabled(kSimpleFrameRateThrottling);
}
#if BUILDFLAG(IS_ANDROID)
bool IsDynamicColorGamutEnabled() {
if (viz::AlwaysUseWideColorGamut())
return false;
auto* build_info = base::android::BuildInfo::GetInstance();
if (build_info->sdk_int() < base::android::SDK_VERSION_Q)
return false;
return base::FeatureList::IsEnabled(kDynamicColorGamut);
}
#endif
bool IsUsingVizFrameSubmissionForWebView() {
return base::FeatureList::IsEnabled(kVizFrameSubmissionForWebView);
}
bool ShouldUseRealBuffersForPageFlipTest() {
return base::FeatureList::IsEnabled(kUseRealBuffersForPageFlipTest);
}
bool ShouldWebRtcLogCapturePipeline() {
return base::FeatureList::IsEnabled(kWebRtcLogCapturePipeline);
}
#if BUILDFLAG(IS_WIN)
bool ShouldUseSetPresentDuration() {
return base::FeatureList::IsEnabled(kUseSetPresentDuration);
}
#endif // BUILDFLAG(IS_WIN)
absl::optional<int> ShouldDrawPredictedInkPoints() {
if (!base::FeatureList::IsEnabled(kDrawPredictedInkPoint))
return absl::nullopt;
std::string predicted_points = GetFieldTrialParamValueByFeature(
kDrawPredictedInkPoint, "predicted_points");
if (predicted_points == kDraw1Point12Ms)
return viz::PredictionConfig::k1Point12Ms;
else if (predicted_points == kDraw2Points6Ms)
return viz::PredictionConfig::k2Points6Ms;
else if (predicted_points == kDraw1Point6Ms)
return viz::PredictionConfig::k1Point6Ms;
else if (predicted_points == kDraw2Points3Ms)
return viz::PredictionConfig::k2Points3Ms;
NOTREACHED();
return absl::nullopt;
}
std::string InkPredictor() {
if (!base::FeatureList::IsEnabled(kDrawPredictedInkPoint))
return "";
return GetFieldTrialParamValueByFeature(kDrawPredictedInkPoint, "predictor");
}
bool ShouldUsePlatformDelegatedInk() {
return base::FeatureList::IsEnabled(kUsePlatformDelegatedInk);
}
bool UseSurfaceLayerForVideo() {
#if BUILDFLAG(IS_ANDROID)
// SurfaceLayer video should work fine with new heuristic.
if (base::FeatureList::IsEnabled(kWebViewNewInvalidateHeuristic))
return true;
// Allow enabling UseSurfaceLayerForVideo if webview is using surface control.
if (::features::IsAndroidSurfaceControlEnabled()) {
return true;
}
return base::FeatureList::IsEnabled(kUseSurfaceLayerForVideoDefault);
#else
return true;
#endif
}
#if BUILDFLAG(IS_ANDROID)
bool UseRealVideoColorSpaceForDisplay() {
// We need Android S for proper color space support in SurfaceControl.
if (base::android::BuildInfo::GetInstance()->sdk_int() <
base::android::SdkVersion::SDK_VERSION_S)
return false;
return base::FeatureList::IsEnabled(
features::kUseRealVideoColorSpaceForDisplay);
}
#endif
bool IsSurfaceSyncThrottling() {
return base::FeatureList::IsEnabled(kSurfaceSyncThrottling);
}
// Used by Viz to determine if viz::DisplayScheduler should dynamically adjust
// its frame deadline. Returns the percentile of historic draw times to base the
// deadline on. Or absl::nullopt if the feature is disabled.
absl::optional<double> IsDynamicSchedulerEnabledForDraw() {
if (!base::FeatureList::IsEnabled(kDynamicSchedulerForDraw))
return absl::nullopt;
double result = base::GetFieldTrialParamByFeatureAsDouble(
kDynamicSchedulerForDraw, kDynamicSchedulerPercentile, -1.0);
if (result < 0.0)
return absl::nullopt;
return result;
}
// Used by Viz to determine if the frame deadlines provided to CC should be
// dynamically adjusted. Returns the percentile of historic draw times to base
// the deadline on. Or absl::nullopt if the feature is disabled.
absl::optional<double> IsDynamicSchedulerEnabledForClients() {
if (!base::FeatureList::IsEnabled(kDynamicSchedulerForClients))
return absl::nullopt;
double result = base::GetFieldTrialParamByFeatureAsDouble(
kDynamicSchedulerForClients, kDynamicSchedulerPercentile, -1.0);
if (result < 0.0)
return absl::nullopt;
return result;
}
int MaxOverlaysConsidered() {
if (!IsOverlayPrioritizationEnabled()) {
return 1;
}
if (!base::FeatureList::IsEnabled(kUseMultipleOverlays)) {
return 1;
}
return base::GetFieldTrialParamByFeatureAsInt(kUseMultipleOverlays,
kMaxOverlaysParam, 8);
}
bool ShouldVideoDetectorIgnoreNonVideoFrames() {
return base::FeatureList::IsEnabled(kVideoDetectorIgnoreNonVideos);
}
} // namespace features