#include "gpu/config/gpu_finch_features.h"
#include "arkweb/build/features/features.h"
#include <string_view>
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/logging.h"
#include "build/build_config.h"
#include "gpu/config/gpu_feature_info.h"
#include "gpu/config/gpu_switches.h"
#include "ui/gl/gl_features.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/gl/gl_switches.h"
#include "ui/gl/gl_utils.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/android_info.h"
#include "base/android/device_info.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/pattern.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/system/sys_info.h"
#include "ui/gfx/android/android_surface_control_compat.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "base/mac/mac_util.h"
#include "base/system/sys_info.h"
#endif
#include "arkweb/chromium_ext/gpu/config/gpu_finch_features_ext.h"
namespace features {
namespace {
#if BUILDFLAG(IS_ANDROID)
bool IsDeviceBlocked(std::string_view field, std::string_view block_list) {
auto disable_patterns = base::SplitString(
block_list, "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
for (const auto& disable_pattern : disable_patterns) {
if (base::MatchPattern(field, disable_pattern))
return true;
}
return false;
}
#endif
}
BASE_FEATURE(kAggressiveShaderCacheLimits, base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kAndroidSurfaceControl, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewSurfaceControl, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewSurfaceControlForTV, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kWebViewThreadSafeMediaDefault, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kLimitAImageReaderMaxSizeToOne, base::FEATURE_ENABLED_BY_DEFAULT);
const base::FeatureParam<std::string> kLimitAImageReaderMaxSizeToOneBlocklist{
&kLimitAImageReaderMaxSizeToOne, "LimitAImageReaderMaxSizeToOneBlocklist",
"MIBOX|*ODROID*"};
BASE_FEATURE(kRelaxLimitAImageReaderMaxSizeToOne,
base::FEATURE_ENABLED_BY_DEFAULT);
const base::FeatureParam<std::string>
kRelaxLimitAImageReaderMaxSizeToOneSoCBlocklist{
&kRelaxLimitAImageReaderMaxSizeToOne,
"RelaxLimitAImageReaderMaxSizeToOneSoCBlocklist", "*Broadcom*"};
const base::FeatureParam<std::string>
kRelaxLimitAImageReaderMaxSizeToOneManufacturerBlocklist{
&kRelaxLimitAImageReaderMaxSizeToOne,
"RelaxLimitAImageReaderMaxSizeToOneManufacturerBlocklist",
"*Broadcom*"};
const base::FeatureParam<std::string>
kRelaxLimitAImageReaderMaxSizeToOneDeviceBlocklist{
&kRelaxLimitAImageReaderMaxSizeToOne,
"RelaxLimitAImageReaderMaxSizeToOneDeviceBlocklist", ""};
const base::FeatureParam<std::string>
kRelaxLimitAImageReaderMaxSizeToOneModelBlocklist{
&kRelaxLimitAImageReaderMaxSizeToOne,
"RelaxLimitAImageReaderMaxSizeToOneModelBlocklist", ""};
BASE_FEATURE(kUseHardwareBufferUsageFlagsFromVulkan,
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kAllowHardwareBufferUsageFlagsFromVulkanForScanout,
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kDefaultEnableGpuRasterization,
#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \
BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_OHOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kEnableMSAAOnNewIntelGPUs,
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kNoUndamagedOverlayPromotion, base::FEATURE_DISABLED_BY_DEFAULT);
#endif
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_IOS)
BASE_FEATURE(kAdjustGpuProcessPriority, base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kClearGrShaderDiskCacheOnInvalidPrefix,
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kGpuShaderDiskCache, base::FEATURE_ENABLED_BY_DEFAULT);
bool IsShaderDiskCacheEnabled(const base::CommandLine* command_line) {
if (command_line->HasSwitch(switches::kDisableGpuShaderDiskCache)) {
return false;
}
return base::FeatureList::IsEnabled(kGpuShaderDiskCache);
}
BASE_FEATURE(kVulkan,
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(ARKWEB_VULKAN)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kEnableDrDc,
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_OHOS)
base::FEATURE_ENABLED_BY_DEFAULT
#elif BUILDFLAG(IS_MAC)
base::FEATURE_DISABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \
BUILDFLAG(IS_ANDROID) || BUILDFLAG(USE_WEBGPU_ON_VULKAN_VIA_GL_INTEROP)
#define WEBGPU_ENABLED base::FEATURE_ENABLED_BY_DEFAULT
#else
#define WEBGPU_ENABLED base::FEATURE_DISABLED_BY_DEFAULT
#endif
BASE_FEATURE(kWebGPUService, WEBGPU_ENABLED);
BASE_FEATURE(kWebGPUBlobCache, WEBGPU_ENABLED);
#undef WEBGPU_ENABLED
// --force-fieldtrial-params=WebGPU.Enabled:DisabledToggles/toggle1%2Ctoggle2
const base::FeatureParam<std::string> kWebGPUDisabledToggles{
&kWebGPUService, "DisabledToggles", ""};
const base::FeatureParam<std::string> kWebGPUEnabledToggles{
&kWebGPUService, "EnabledToggles", ""};
// --force-fieldtrial-params=WebGPU.Enabled:UnsafeFeatures/timestamp-query%2Cshader-f16
const base::FeatureParam<std::string> kWebGPUUnsafeFeatures{
&kWebGPUService, "UnsafeFeatures", ""};
const base::FeatureParam<bool> kWebGPUSpontaneousWireServer{
&kWebGPUService, "DawnSpontaneousWireServer", true};
// --force-fieldtrial-params=WebGPU.Enabled:UnsafeWGSLFeatures/feature_1%2Cfeature_2
const base::FeatureParam<std::string> kWGSLUnsafeFeatures{
&kWebGPUService, "UnsafeWGSLFeatures", ""};
BASE_FEATURE(kWebGPUEnableRangeAnalysisForRobustness,
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebGPUUseSpirv14, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kWebGPUDecomposeUniformBuffers, base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(ARKWEB_COMPOSITE_RENDER)
const base::FeatureParam<std::string> kVulkanBlockListByHardware{
&kVulkan, "BlockListByHardware", ""};
const base::FeatureParam<std::string> kVulkanBlockListByBrand{
&kVulkan, "BlockListByBrand", ""};
const base::FeatureParam<std::string> kVulkanBlockListByDevice{
&kVulkan, "BlockListByDevice", ""};
const base::FeatureParam<std::string> kVulkanBlockListByAndroidBuildId{
&kVulkan, "BlockListByAndroidBuildId", ""};
const base::FeatureParam<std::string> kVulkanBlockListByManufacturer{
&kVulkan, "BlockListByManufacturer", ""};
const base::FeatureParam<std::string> kVulkanBlockListByModel{
&kVulkan, "BlockListByModel", ""};
const base::FeatureParam<std::string> kVulkanBlockListByBoard{
&kVulkan, "BlockListByBoard", ""};
const base::FeatureParam<std::string> kVulkanBlockListByAndroidBuildFP{
&kVulkan, "BlockListByAndroidBuildFP", ""};
const base::FeatureParam<std::string> kDrDcBlockListByDevice{
&kEnableDrDc, "BlockListByDevice",
"LF9810_2GB|amber|chopin|secret|a03|SO-51B|on7xelte|j7xelte|F41B|doha|"
"rk322x_box|a20s|HWMAR|HWSTK-HF|HWPOT-H|b2q|channel|galahad|a32|ellis|"
"dandelion|tonga|RMX3231|ASUS_I006D|ASUS_I004D|bacon"};
const base::FeatureParam<std::string> kDrDcBlockListByModel{
&kEnableDrDc, "BlockListByModel",
"SM-J400M|SM-J415F|ONEPLUS A3003|OCTAStream*"};
const base::FeatureParam<std::string> kDrDcBlockListByHardware{
&kEnableDrDc, "BlockListByHardware", ""};
const base::FeatureParam<std::string> kDrDcBlockListByBrand{
&kEnableDrDc, "BlockListByBrand", "HONOR"};
const base::FeatureParam<std::string> kDrDcBlockListByAndroidBuildId{
&kEnableDrDc, "BlockListByAndroidBuildId", ""};
const base::FeatureParam<std::string> kDrDcBlockListByManufacturer{
&kEnableDrDc, "BlockListByManufacturer", ""};
const base::FeatureParam<std::string> kDrDcBlockListByBoard{
&kEnableDrDc, "BlockListByBoard", ""};
const base::FeatureParam<std::string> kDrDcBlockListByAndroidBuildFP{
&kEnableDrDc, "BlockListByAndroidBuildFP", ""};
#endif
BASE_FEATURE(kSkiaGraphite,
#if BUILDFLAG(IS_APPLE)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kSkiaGraphiteSmallPathAtlas, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kSkiaGraphitePrecompilation, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kConditionallySkipGpuChannelFlush,
#if BUILDFLAG(IS_CHROMEOS)
base::FEATURE_DISABLED_BY_DEFAULT
#else
base::FEATURE_ENABLED_BY_DEFAULT
#endif
);
const base::FeatureParam<bool> kSkiaGraphiteDawnSkipValidation{
&kSkiaGraphite, "dawn_skip_validation", !DCHECK_IS_ON()};
const base::FeatureParam<bool> kSkiaGraphiteDawnBackendValidation{
&kSkiaGraphite, "dawn_backend_validation", false};
const base::FeatureParam<bool> kSkiaGraphiteDawnBackendDebugLabels{
&kSkiaGraphite, "dawn_backend_debug_labels", DCHECK_IS_ON()};
BASE_FEATURE_PARAM(bool,
kSkiaGraphiteDawnUsePersistentCache,
&kSkiaGraphite,
"dawn_use_persistent_cache",
BUILDFLAG(IS_ANDROID));
const base::FeatureParam<int> kSkiaGraphiteMaxPendingRecordings{
&kSkiaGraphite, "max_pending_recordings", 100};
const base::FeatureParam<int> kSkiaGraphiteMinPathSizeForMsaa{
&kSkiaGraphiteSmallPathAtlas, "min_path_size_for_msaa", 0};
BASE_FEATURE_PARAM(bool,
kSkiaGraphiteEnableDeferredSubmit,
&kSkiaGraphite,
"enable_deferred_submit",
true);
const base::FeatureParam<bool> kSkiaGraphiteEnableMSAAOnNewerIntel{
&kSkiaGraphite, "enable_msaa_on_newer_intel", true};
#if BUILDFLAG(IS_WIN)
const base::FeatureParam<bool> kSkiaGraphiteDawnDumpWCOnD3DError{
&kSkiaGraphite, "dawn_dumpwc_d3d_errors", false};
const base::FeatureParam<bool> kSkiaGraphiteDawnDisableD3DShaderOptimizations{
&kSkiaGraphite, "dawn_disable_d3d_shader_optimizations", false};
const base::FeatureParam<bool> kSkiaGraphiteDawnD3D11DelayFlush{
&kSkiaGraphite, "dawn_d3d11_delay_flush", true};
BASE_FEATURE(kSkiaGraphiteDawnUseD3D12, base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kNoDiscardableMemoryForGpuDecodePath,
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kIncreasedCmdBufferParseSlice, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kPruneOldTransferCacheEntries, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDeferredOverlaysRelease,
"DeferredOverlayRelease",
base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kD3DBackingUploadWithUpdateSubresource,
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kHandleOverlaysSwapFailure, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kGPUBlockListTestGroup, base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<int> kGPUBlockListTestGroupId{&kGPUBlockListTestGroup,
"test_group", 0};
BASE_FEATURE(kGPUDriverBugListTestGroup, base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<int> kGPUDriverBugListTestGroupId{
&kGPUDriverBugListTestGroup, "test_group", 0};
bool IsUsingVulkan() {
#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(ARKWEB_COMPOSITE_RENDER)
base::FeatureList* feature_list = base::FeatureList::GetInstance();
if (feature_list &&
feature_list->IsFeatureOverriddenFromCommandLine(
features::kVulkan.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE))
return true;
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kWebViewDrawFunctorUsesVulkan)) {
return true;
}
if (base::android::android_info::sdk_int() <
base::android::android_info::SDK_VERSION_Q) {
return false;
}
if (!base::FeatureList::IsEnabled(kVulkan))
return false;
if (IsDeviceBlocked(base::android::android_info::hardware(),
kVulkanBlockListByHardware.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::brand(),
kVulkanBlockListByBrand.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::device(),
kVulkanBlockListByDevice.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::android_build_id(),
kVulkanBlockListByAndroidBuildId.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::manufacturer(),
kVulkanBlockListByManufacturer.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::model(),
kVulkanBlockListByModel.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::board(),
kVulkanBlockListByBoard.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::android_build_fp(),
kVulkanBlockListByAndroidBuildFP.Get())) {
return false;
}
return true;
#elif BUILDFLAG(ARKWEB_VULKAN)
return features::IsEnableVulkan();
#else
return base::FeatureList::IsEnabled(kVulkan);
#endif
}
bool IsUsingThreadSafeMediaForWebView() {
#if BUILDFLAG(IS_ANDROID)
if (LimitAImageReaderMaxSizeToOne()) {
return false;
}
return base::FeatureList::IsEnabled(kWebViewThreadSafeMediaDefault);
#else
return false;
#endif
}
bool NeedThreadSafeAndroidMedia() {
return ShouldEnableDrDc() || IsUsingThreadSafeMediaForWebView();
}
namespace {
bool IsSkiaGraphiteSupportedByDevice(const base::CommandLine* command_line) {
#if BUILDFLAG(IS_APPLE)
const bool is_angle_metal_enabled =
UsePassthroughCommandDecoder() &&
(base::FeatureList::IsEnabled(features::kDefaultANGLEMetal) ||
command_line->GetSwitchValueASCII(switches::kUseANGLE) ==
gl::kANGLEImplementationMetalName);
if (!is_angle_metal_enabled) {
return false;
}
#if BUILDFLAG(IS_MAC)
auto model_name_split = base::SysInfo::SplitHardwareModelNameDoNotUse(
base::SysInfo::HardwareModelName());
if (model_name_split.has_value()) {
const bool is_imac_15_1 = model_name_split->category == "iMac" &&
model_name_split->model == 15 &&
model_name_split->variant == 1;
if (!is_imac_15_1) {
static constexpr struct {
std::string category;
int32_t min_supported_model;
} kModelSupportData[] = {
{"MacBookPro", 13}, {"MacBookAir", 8}, {"MacBook", 9},
{"iMac", 17}, {"iMacPro", 1}, {"Macmini", 8},
};
for (const auto& [category, min_supported_model] : kModelSupportData) {
if (model_name_split->category == category) {
if (model_name_split->model < min_supported_model) {
return false;
}
break;
}
}
}
}
#endif
return true;
#elif BUILDFLAG(IS_ANDROID)
if (base::android::device_info::is_desktop()) {
return false;
}
return IsUsingVulkan();
#elif BUILDFLAG(IS_CHROMEOS)
return IsUsingVulkan();
#elif BUILDFLAG(IS_OHOS)
return base::FeatureList::IsEnabled(kEnableDrDc);
#elif BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
return false;
#elif BUILDFLAG(IS_WIN)
return true;
#else
if (base::FeatureList::IsEnabled(features::kSkiaGraphite)) {
LOG(ERROR) << "Enabling Graphite on a not-yet-supported platform is "
"disallowed for safety";
}
return false;
#endif
}
}
bool IsSkiaGraphiteEnabled(const base::CommandLine* command_line) {
if (command_line->HasSwitch(switches::kDisableSkiaGraphite)) {
return false;
}
if (command_line->HasSwitch(switches::kEnableSkiaGraphite)) {
return true;
}
if (!IsSkiaGraphiteSupportedByDevice(command_line)) {
return false;
}
return base::FeatureList::IsEnabled(features::kSkiaGraphite);
}
bool IsDrDcEnabled(const gpu::GpuFeatureInfo& gpu_feature_info) {
return gpu_feature_info.status_values
[gpu::GPU_FEATURE_TYPE_DIRECT_RENDERING_DISPLAY_COMPOSITOR] ==
gpu::kGpuFeatureStatusEnabled;
}
bool ShouldEnableDrDc() {
#if BUILDFLAG(IS_ANDROID)
if (base::android::android_info::sdk_int() <
base::android::android_info::SDK_VERSION_P) {
return false;
}
if (LimitAImageReaderMaxSizeToOne()) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::device(),
kDrDcBlockListByDevice.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::model(),
kDrDcBlockListByModel.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::hardware(),
kDrDcBlockListByHardware.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::brand(),
kDrDcBlockListByBrand.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::android_build_id(),
kDrDcBlockListByAndroidBuildId.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::manufacturer(),
kDrDcBlockListByManufacturer.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::board(),
kDrDcBlockListByBoard.Get())) {
return false;
}
if (IsDeviceBlocked(base::android::android_info::android_build_fp(),
kDrDcBlockListByAndroidBuildFP.Get())) {
return false;
}
if (base::android::device_info::is_desktop()) {
return false;
}
#endif
#if BUILDFLAG(ARKWEB_DRDC)
return features::IsDrDcForVulkan();
#else
return base::FeatureList::IsEnabled(kEnableDrDc);
#endif
}
bool IsSkiaGraphitePrecompilationEnabled(
const base::CommandLine* command_line) {
if (!IsSkiaGraphiteEnabled(command_line)) {
return false;
}
if (command_line->HasSwitch(switches::kDisableSkiaGraphitePrecompilation)) {
return false;
}
if (command_line->HasSwitch(switches::kEnableSkiaGraphitePrecompilation)) {
return true;
}
return base::FeatureList::IsEnabled(features::kSkiaGraphitePrecompilation);
}
bool EnablePurgeGpuImageDecodeCache() {
return !base::FeatureList::IsEnabled(kPruneOldTransferCacheEntries);
}
bool EnablePruneOldTransferCacheEntries() {
return base::FeatureList::IsEnabled(kPruneOldTransferCacheEntries);
}
#if BUILDFLAG(IS_ANDROID)
bool IsAndroidSurfaceControlEnabled() {
#if BUILDFLAG(ARKWEB_COMPOSITE_RENDER)
return false;
#endif
if (base::android::android_info::sdk_int() <=
base::android::android_info::SDK_VERSION_S &&
(IsDeviceBlocked(base::android::android_info::device(), "capri|caprip") ||
IsDeviceBlocked(base::android::android_info::model(),
"SM-F9*|SM-W202?|SCV44|SCG05|SCG11|SC-55B"))) {
return false;
}
if (!gfx::SurfaceControl::IsSupported())
return false;
if (LimitAImageReaderMaxSizeToOne())
return false;
if (base::SysInfo::GetAndroidHardwareEGL() == "swiftshader" ||
base::SysInfo::GetAndroidHardwareEGL() == "emulation") {
return false;
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableAndroidNativeFenceSyncForTesting)) {
return false;
}
if (IsUsingThreadSafeMediaForWebView()) {
if (base::android::device_info::is_tv()) {
return base::FeatureList::IsEnabled(kWebViewSurfaceControlForTV);
} else {
return base::FeatureList::IsEnabled(kWebViewSurfaceControl);
}
}
return base::FeatureList::IsEnabled(kAndroidSurfaceControl);
}
bool LimitAImageReaderMaxSizeToOne() {
if (base::android::device_info::is_tv()) {
if (IsDeviceBlocked(
base::android::android_info::soc_manufacturer(),
kRelaxLimitAImageReaderMaxSizeToOneSoCBlocklist.Get())) {
return false;
}
if (IsDeviceBlocked(
base::android::android_info::manufacturer(),
kRelaxLimitAImageReaderMaxSizeToOneManufacturerBlocklist.Get())) {
return false;
}
if (IsDeviceBlocked(
base::android::android_info::device(),
kRelaxLimitAImageReaderMaxSizeToOneDeviceBlocklist.Get())) {
return false;
}
if (IsDeviceBlocked(
base::android::android_info::model(),
kRelaxLimitAImageReaderMaxSizeToOneModelBlocklist.Get())) {
return false;
}
return true;
}
return (IsDeviceBlocked(base::android::android_info::model(),
kLimitAImageReaderMaxSizeToOneBlocklist.Get()));
}
bool IncreaseBufferCountForHighFrameRate() {
constexpr base::ByteCount RAM_8GB_CUTOFF = base::MiB(7200);
static bool increase =
base::android::android_info::sdk_int() >=
base::android::android_info::SDK_VERSION_R &&
IsAndroidSurfaceControlEnabled() &&
base::SysInfo::AmountOfPhysicalMemory() > RAM_8GB_CUTOFF;
return increase;
}
#endif
BASE_FEATURE(kSyncPointGraphValidation, base::FEATURE_DISABLED_BY_DEFAULT);
bool IsSyncPointGraphValidationEnabled() {
return base::FeatureList::IsEnabled(kSyncPointGraphValidation);
}
BASE_FEATURE(kANGLEPerContextBlobCache, base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_APPLE)
BASE_FEATURE(kIOSurfaceMultiThreading, base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kGraphiteContextIsThreadSafe,
#if BUILDFLAG(IS_MAC)
base::FEATURE_ENABLED_BY_DEFAULT);
#else
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
bool IsGraphiteContextThreadSafe() {
return base::FeatureList::IsEnabled(features::kGraphiteContextIsThreadSafe);
}
BASE_FEATURE(kWebGPUCompatibilityMode, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWebGPUAndroidOpenGLES, base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kWebGPUQualcommWindows, base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kConfigurableGPUWatchdogTimeout,
base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<int> kConfigurableGPUWatchdogTimeoutSeconds{
&kConfigurableGPUWatchdogTimeout, "watchdog_timeout_seconds", 30};
}