#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 {
const char kDynamicSchedulerPercentile[] = "percentile";
}
namespace features {
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);
#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kDynamicColorGamut,
"DynamicColorGamut",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kVizFrameSubmissionForWebView,
"VizFrameSubmissionForWebView",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kUseRealBuffersForPageFlipTest,
"UseRealBuffersForPageFlipTest",
base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_FUCHSIA)
BASE_FEATURE(kUseSkiaOutputDeviceBufferQueue,
"UseSkiaOutputDeviceBufferQueue",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kWebRtcLogCapturePipeline,
"WebRtcLogCapturePipeline",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kUseSetPresentDuration,
"UseSetPresentDuration",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kUsePlatformDelegatedInk,
"UsePlatformDelegatedInk",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewVulkanIntermediateBuffer,
"WebViewVulkanIntermediateBuffer",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kUseSurfaceLayerForVideoDefault,
"UseSurfaceLayerForVideoDefault",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewNewInvalidateHeuristic,
"WebViewNewInvalidateHeuristic",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kUseRealVideoColorSpaceForDisplay,
"UseRealVideoColorSpaceForDisplay",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
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";
BASE_FEATURE(kDynamicSchedulerForDraw,
"DynamicSchedulerForDraw",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDynamicSchedulerForClients,
"DynamicSchedulerForClients",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_APPLE)
BASE_FEATURE(kCALayerNewLimit,
"CALayerNewLimit",
base::FEATURE_ENABLED_BY_DEFAULT);
const base::FeatureParam<int> kCALayerNewLimitDefault{&kCALayerNewLimit,
"default", -1};
const base::FeatureParam<int> kCALayerNewLimitManyVideos{&kCALayerNewLimit,
"many-videos", -1};
#endif
#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_OZONE)
BASE_FEATURE(kCanSkipRenderPassOverlay,
"CanSkipRenderPassOverlay",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kAllowBypassRenderPassQuads,
"AllowBypassRenderPassQuads",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kAllowUndamagedNonrootRenderPassToSkip,
"AllowUndamagedNonrootRenderPassToSkip",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kAggressiveFrameCulling,
"AggressiveFrameCulling",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kEagerSurfaceGarbageCollection,
"EagerSurfaceGarbageCollection",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kOverrideThrottledFrameRateParams,
"OverrideThrottledFrameRateParams",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kBufferQueueImageSetPurgeable,
"BufferQueueImageSetPurgeable",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kRendererAllocatesImages,
"RendererAllocatesImages",
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kEvictSubtree, "EvictSubtree", base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kOnBeginFrameAcks,
"OnBeginFrameAcks",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kOnBeginFrameAllowLateAcks,
"OnBeginFrameAllowLateAcks",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDrawImmediatelyWhenInteractive,
"DrawImmediatelyWhenInteractive",
#if BUILDFLAG(IS_OHOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsDelegatedCompositingEnabled() {
return base::FeatureList::IsEnabled(kDelegatedCompositing);
}
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
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)
if (base::FeatureList::IsEnabled(kWebViewNewInvalidateHeuristic))
return true;
if (::features::IsAndroidSurfaceControlEnabled()) {
return true;
}
return base::FeatureList::IsEnabled(kUseSurfaceLayerForVideoDefault);
#else
return true;
#endif
}
#if BUILDFLAG(IS_ANDROID)
bool UseRealVideoColorSpaceForDisplay() {
if (base::android::BuildInfo::GetInstance()->sdk_int() <
base::android::SdkVersion::SDK_VERSION_S)
return false;
return base::FeatureList::IsEnabled(
features::kUseRealVideoColorSpaceForDisplay);
}
#endif
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;
}
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 (!base::FeatureList::IsEnabled(kUseMultipleOverlays)) {
return 1;
}
return base::GetFieldTrialParamByFeatureAsInt(kUseMultipleOverlays,
kMaxOverlaysParam, 8);
}
bool ShouldVideoDetectorIgnoreNonVideoFrames() {
return base::FeatureList::IsEnabled(kVideoDetectorIgnoreNonVideos);
}
bool ShouldOverrideThrottledFrameRateParams() {
return base::FeatureList::IsEnabled(kOverrideThrottledFrameRateParams);
}
bool ShouldRendererAllocateImages() {
return base::FeatureList::IsEnabled(kRendererAllocatesImages);
}
bool IsOnBeginFrameAcksEnabled() {
return base::FeatureList::IsEnabled(features::kOnBeginFrameAcks);
}
bool ShouldDrawImmediatelyWhenInteractive() {
return base::FeatureList::IsEnabled(
features::kDrawImmediatelyWhenInteractive);
}
}