// Copyright 2019 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. #include "ui/gl/gl_features.h" #include "base/command_line.h" #include "base/feature_list.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "ui/gl/gl_switches.h" #if defined(OS_ANDROID) #include "base/android/build_info.h" #include "base/metrics/field_trial_params.h" #include "base/strings/pattern.h" #include "base/strings/string_split.h" #endif namespace features { namespace { const base::Feature kGpuVsync{"GpuVsync", base::FEATURE_ENABLED_BY_DEFAULT}; #if defined(OS_ANDROID) const base::FeatureParam kPassthroughCommandDecoderBlockListByBrand{ &kDefaultPassthroughCommandDecoder, "BlockListByBrand", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByDevice{ &kDefaultPassthroughCommandDecoder, "BlockListByDevice", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByAndroidBuildId{ &kDefaultPassthroughCommandDecoder, "BlockListByAndroidBuildId", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByManufacturer{ &kDefaultPassthroughCommandDecoder, "BlockListByManufacturer", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByModel{ &kDefaultPassthroughCommandDecoder, "BlockListByModel", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByBoard{ &kDefaultPassthroughCommandDecoder, "BlockListByBoard", ""}; const base::FeatureParam kPassthroughCommandDecoderBlockListByAndroidBuildFP{ &kDefaultPassthroughCommandDecoder, "BlockListByAndroidBuildFP", ""}; bool IsDeviceBlocked(const char* field, const std::string& 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 } // namespace // Use the passthrough command decoder by default. This can be overridden with // the --use-cmd-decoder=passthrough or --use-cmd-decoder=validating flags. // Feature lives in ui/gl because it affects the GL binding initialization on // platforms that would otherwise not default to using EGL bindings. // Launched on Windows, still experimental on other platforms. const base::Feature kDefaultPassthroughCommandDecoder { "DefaultPassthroughCommandDecoder", #if defined(OS_WIN) || defined(OS_FUCHSIA) || \ ((defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \ !defined(CHROMECAST_BUILD)) base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT #endif }; bool UseGpuVsync() { return !base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableGpuVsync) && base::FeatureList::IsEnabled(kGpuVsync); } bool UsePassthroughCommandDecoder() { if (!base::FeatureList::IsEnabled(kDefaultPassthroughCommandDecoder)) return false; #if defined(OS_ANDROID) // Check block list against build info. const auto* build_info = base::android::BuildInfo::GetInstance(); if (IsDeviceBlocked(build_info->brand(), kPassthroughCommandDecoderBlockListByBrand.Get())) return false; if (IsDeviceBlocked(build_info->device(), kPassthroughCommandDecoderBlockListByDevice.Get())) return false; if (IsDeviceBlocked( build_info->android_build_id(), kPassthroughCommandDecoderBlockListByAndroidBuildId.Get())) return false; if (IsDeviceBlocked(build_info->manufacturer(), kPassthroughCommandDecoderBlockListByManufacturer.Get())) return false; if (IsDeviceBlocked(build_info->model(), kPassthroughCommandDecoderBlockListByModel.Get())) return false; if (IsDeviceBlocked(build_info->board(), kPassthroughCommandDecoderBlockListByBoard.Get())) return false; if (IsDeviceBlocked( build_info->android_build_fp(), kPassthroughCommandDecoderBlockListByAndroidBuildFP.Get())) return false; #endif // defined(OS_ANDROID) return true; } } // namespace features