diff options
author | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-14 21:26:41 +0000 |
---|---|---|
committer | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-14 21:26:41 +0000 |
commit | 4d34088de51cfa721881b7a0d3991cd44354f457 (patch) | |
tree | 83087ab89e2b4fda223801dab8f368c589db85b2 | |
parent | b43734a17cbd7b23bfda66d834f801c759135c1e (diff) | |
download | chromium_src-4d34088de51cfa721881b7a0d3991cd44354f457.zip chromium_src-4d34088de51cfa721881b7a0d3991cd44354f457.tar.gz chromium_src-4d34088de51cfa721881b7a0d3991cd44354f457.tar.bz2 |
Enable GPU control lists in tests on Windows (other OSes will follow, but this is high priority for Windows and can't afford to be blocked on other OS' failures anymore).
Reland of https://codereview.chromium.org/23534006/ (see that and the bug for more details).
Also adding INFO-level logging to spell out each control list rule being applied on the bots (makes debugging and understanding failures much easier).
R=piman@chromium.org
TBR=jcivelli, piman, zmo
BUG=295799
Previously Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=224810
Reverted: https://src.chromium.org/viewvc/chrome?view=rev&revision=224845
Previously Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=227977
Reverted: https://src.chromium.org/viewvc/chrome?view=rev&revision=228014
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=228401
Reverted: https://src.chromium.org/viewvc/chrome?view=rev&revision=228431
Review URL: https://codereview.chromium.org/23703017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228530 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/gpu/chrome_gpu_util.cc | 6 | ||||
-rw-r--r-- | chrome/test/base/test_launcher_utils.cc | 4 | ||||
-rw-r--r-- | chrome/test/gpu/gpu_feature_browsertest.cc | 20 | ||||
-rw-r--r-- | content/browser/gpu/gpu_data_manager_impl_private.cc | 41 | ||||
-rw-r--r-- | content/browser/gpu/gpu_data_manager_impl_private.h | 3 | ||||
-rw-r--r-- | content/public/common/content_switches.cc | 6 | ||||
-rw-r--r-- | content/public/common/content_switches.h | 1 | ||||
-rw-r--r-- | content/public/test/browser_test_base.cc | 4 | ||||
-rw-r--r-- | gpu/config/gpu_control_list.cc | 14 | ||||
-rw-r--r-- | gpu/config/gpu_control_list.h | 15 | ||||
-rw-r--r-- | gpu/config/software_rendering_list_json.cc | 42 |
11 files changed, 133 insertions, 23 deletions
diff --git a/chrome/browser/gpu/chrome_gpu_util.cc b/chrome/browser/gpu/chrome_gpu_util.cc index 61da773..f59e46d 100644 --- a/chrome/browser/gpu/chrome_gpu_util.cc +++ b/chrome/browser/gpu/chrome_gpu_util.cc @@ -46,12 +46,6 @@ bool ShouldRunCompositingFieldTrial() { return false; #endif -#if defined(OS_WIN) - // Don't run the trial on Windows XP. - if (base::win::GetVersion() < base::win::VERSION_VISTA) - return false; -#endif - #if defined(OS_MACOSX) // Browser and content shell tests hang on 10.7 when the Apple software // renderer is used. These tests ignore the blacklist (which disables diff --git a/chrome/test/base/test_launcher_utils.cc b/chrome/test/base/test_launcher_utils.cc index 1f81ef9..afbfc58 100644 --- a/chrome/test/base/test_launcher_utils.cc +++ b/chrome/test/base/test_launcher_utils.cc @@ -47,9 +47,11 @@ void PrepareBrowserCommandLineForTests(CommandLine* command_line) { // Don't install default apps. command_line->AppendSwitch(switches::kDisableDefaultApps); +#if !defined(OS_WIN) // Don't collect GPU info, load GPU blacklist, or schedule a GPU blacklist - // auto-update. + // auto-update on non-Win bots for now (http://crbug.com/304833). command_line->AppendSwitch(switches::kSkipGpuDataLoading); +#endif #if defined(USE_AURA) // Disable window animations under Ash as the animations effect the diff --git a/chrome/test/gpu/gpu_feature_browsertest.cc b/chrome/test/gpu/gpu_feature_browsertest.cc index 6263e2d..0cbe428 100644 --- a/chrome/test/gpu/gpu_feature_browsertest.cc +++ b/chrome/test/gpu/gpu_feature_browsertest.cc @@ -216,7 +216,7 @@ class AcceleratedCompositingBlockedTest : public GpuFeatureTest { #endif IN_PROC_BROWSER_TEST_F(AcceleratedCompositingBlockedTest, - MAYBE_AcceleratedCompositingBlocked) { + MAYBE_AcceleratedCompositingBlocked) { EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted( gpu::GPU_FEATURE_TYPE_ACCELERATED_COMPOSITING)); @@ -367,11 +367,23 @@ IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DAllowed) { if (gpu::GPUTestBotConfig::CurrentConfigMatches("XP")) return; - EXPECT_FALSE(GpuDataManager::GetInstance()->IsFeatureBlacklisted( - gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS)); + bool is_blacklisted = false; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + // Blacklist rule #24 disables accelerated_2d_canvas on Linux. + // TODO(gab): Enable GPU control lists on Linux. + // is_blacklisted = true; +#elif defined(OS_WIN) + // Blacklist rule #67 disables accelerated_2d_canvas on XP. + if (base::win::GetVersion() < base::win::VERSION_VISTA) + is_blacklisted = true; +#endif + + EXPECT_EQ(is_blacklisted, + GpuDataManager::GetInstance()->IsFeatureBlacklisted( + gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS)); const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html")); - RunEventTest(url, kAcceleratedCanvasCreationEvent, true); + RunEventTest(url, kAcceleratedCanvasCreationEvent, !is_blacklisted); } IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DBlocked) { diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index d48c2fc..513a1d5 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc @@ -320,6 +320,9 @@ void GpuDataManagerImplPrivate::InitializeForTesting( // This function is for testing only, so disable histograms. update_histograms_ = false; + // Prevent all further initialization. + finalized_ = true; + InitializeImpl(gpu_blacklist_json, std::string(), std::string(), gpu_info); } @@ -533,13 +536,30 @@ void GpuDataManagerImplPrivate::GetGLStrings(std::string* gl_vendor, void GpuDataManagerImplPrivate::Initialize() { TRACE_EVENT0("startup", "GpuDataManagerImpl::Initialize"); - CommandLine* command_line = CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kSkipGpuDataLoading) && - !command_line->HasSwitch(switches::kUseGpuInTests)) + if (finalized_) { + DLOG(INFO) << "GpuDataManagerImpl marked as finalized; skipping Initialize"; + return; + } + + const CommandLine* command_line = CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kSkipGpuDataLoading)) return; gpu::GPUInfo gpu_info; - { + if (command_line->GetSwitchValueASCII( + switches::kUseGL) == gfx::kGLImplementationOSMesaName) { + // If using the OSMesa GL implementation, use fake vendor and device ids to + // make sure it never gets blacklisted. This is better than simply + // cancelling GPUInfo gathering as it allows us to proceed with loading the + // blacklist below which may have non-device specific entries we want to + // apply anyways (e.g., OS version blacklisting). + gpu_info.gpu.vendor_id = 0xffff; + gpu_info.gpu.device_id = 0xffff; + + // Also declare the driver_vendor to be osmesa to be able to specify + // exceptions based on driver_vendor==osmesa for some blacklist rules. + gpu_info.driver_vendor = gfx::kGLImplementationOSMesaName; + } else { TRACE_EVENT0("startup", "GpuDataManagerImpl::Initialize:CollectBasicGraphicsInfo"); gpu::CollectBasicGraphicsInfo(&gpu_info); @@ -973,7 +993,8 @@ GpuDataManagerImplPrivate::GpuDataManagerImplPrivate( owner_(owner), display_count_(0), gpu_process_accessible_(true), - use_software_compositor_(false) { + use_software_compositor_(false), + finalized_(false) { DCHECK(owner_); CommandLine* command_line = CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kDisableAcceleratedCompositing)) { @@ -1018,8 +1039,14 @@ void GpuDataManagerImplPrivate::InitializeImpl( GetContentClient()->GetProduct()); CHECK(!browser_version_string.empty()); + const bool log_gpu_control_list_decisions = + CommandLine::ForCurrentProcess()->HasSwitch( + switches::kLogGpuControlListDecisions); + if (!gpu_blacklist_json.empty()) { gpu_blacklist_.reset(gpu::GpuBlacklist::Create()); + if (log_gpu_control_list_decisions) + gpu_blacklist_->enable_control_list_logging("gpu_blacklist"); bool success = gpu_blacklist_->LoadList( browser_version_string, gpu_blacklist_json, gpu::GpuControlList::kCurrentOsOnly); @@ -1027,6 +1054,8 @@ void GpuDataManagerImplPrivate::InitializeImpl( } if (!gpu_switching_list_json.empty()) { gpu_switching_list_.reset(gpu::GpuSwitchingList::Create()); + if (log_gpu_control_list_decisions) + gpu_switching_list_->enable_control_list_logging("gpu_switching_list"); bool success = gpu_switching_list_->LoadList( browser_version_string, gpu_switching_list_json, gpu::GpuControlList::kCurrentOsOnly); @@ -1034,6 +1063,8 @@ void GpuDataManagerImplPrivate::InitializeImpl( } if (!gpu_driver_bug_list_json.empty()) { gpu_driver_bug_list_.reset(gpu::GpuDriverBugList::Create()); + if (log_gpu_control_list_decisions) + gpu_driver_bug_list_->enable_control_list_logging("gpu_driver_bug_list"); bool success = gpu_driver_bug_list_->LoadList( browser_version_string, gpu_driver_bug_list_json, gpu::GpuControlList::kCurrentOsOnly); diff --git a/content/browser/gpu/gpu_data_manager_impl_private.h b/content/browser/gpu/gpu_data_manager_impl_private.h index 8d15296..ed1b39c 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.h +++ b/content/browser/gpu/gpu_data_manager_impl_private.h @@ -247,6 +247,9 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { bool use_software_compositor_; + // True if all future Initialize calls should be ignored. + bool finalized_; + DISALLOW_COPY_AND_ASSIGN(GpuDataManagerImplPrivate); }; diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index b6a1704..b529058 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -633,6 +633,9 @@ const char kJavaScriptFlags[] = "js-flags"; // Load an NPAPI plugin from the specified path. const char kLoadPlugin[] = "load-plugin"; +// Logs GPU control list decisions when enforcing blacklist rules. +const char kLogGpuControlListDecisions[] = "log-gpu-control-list-decisions"; + // Sets the minimum log level. Valid values are from 0 to 3: // INFO = 0, WARNING = 1, LOG_ERROR = 2, LOG_FATAL = 3. const char kLoggingLevel[] = "log-level"; @@ -782,7 +785,8 @@ const char kSitePerProcess[] = "site-per-process"; // Skip gpu info collection, blacklist loading, and blacklist auto-update // scheduling at browser startup time. // Therefore, all GPU features are available, and about:gpu page shows empty -// content. The switch is intended only for tests. +// content. The switch is intended only for layout tests. +// TODO(gab): Get rid of this switch entirely. const char kSkipGpuDataLoading[] = "skip-gpu-data-loading"; // Specifies the request key for the continuous speech recognition webservice. diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 61268c1..9198905 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h @@ -189,6 +189,7 @@ extern const char kInProcessGPU[]; extern const char kInProcessPlugins[]; CONTENT_EXPORT extern const char kJavaScriptFlags[]; extern const char kLoadPlugin[]; +CONTENT_EXPORT extern const char kLogGpuControlListDecisions[]; CONTENT_EXPORT extern const char kLoggingLevel[]; CONTENT_EXPORT extern const char kLogNetLog[]; extern const char kLogPluginMessages[]; diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index cb5e3b8..5fed0cc 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc @@ -153,7 +153,9 @@ void BrowserTestBase::SetUp() { command_line->AppendSwitch(switches::kDomAutomationController); - command_line->AppendSwitch(switches::kSkipGpuDataLoading); + // It is sometimes useful when looking at browser test failures to know which + // GPU blacklisting decisions were made. + command_line->AppendSwitch(switches::kLogGpuControlListDecisions); #if defined(USE_AURA) // Use test contexts for browser tests unless they override and force us to diff --git a/gpu/config/gpu_control_list.cc b/gpu/config/gpu_control_list.cc index 1d45d72..0c645b5 100644 --- a/gpu/config/gpu_control_list.cc +++ b/gpu/config/gpu_control_list.cc @@ -10,6 +10,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/sys_info.h" #include "gpu/config/gpu_info.h" #include "gpu/config/gpu_util.h" @@ -1030,6 +1031,14 @@ GpuControlList::GpuControlListEntry::StringToMultiGpuCategory( return kMultiGpuCategoryNone; } +void GpuControlList::GpuControlListEntry::LogControlListMatch( + const std::string& control_list_logging_name) const { + static const char kControlListMatchMessage[] = + "Control list match for rule #%u in %s."; + LOG(INFO) << base::StringPrintf(kControlListMatchMessage, id_, + control_list_logging_name.c_str()); +} + bool GpuControlList::GpuControlListEntry::Contains( OsType os_type, const std::string& os_version, const GPUInfo& gpu_info) const { @@ -1185,7 +1194,8 @@ bool GpuControlList::GpuControlListEntry::StringToFeature( GpuControlList::GpuControlList() : max_entry_id_(0), needs_more_info_(false), - supports_feature_type_all_(false) { + supports_feature_type_all_(false), + control_list_logging_enabled_(false) { } GpuControlList::~GpuControlList() { @@ -1292,6 +1302,8 @@ std::set<int> GpuControlList::MakeDecision( for (size_t i = 0; i < entries_.size(); ++i) { if (entries_[i]->Contains(os, os_version, gpu_info)) { if (!entries_[i]->disabled()) { + if (control_list_logging_enabled_) + entries_[i]->LogControlListMatch(control_list_logging_name_); MergeFeatureSets(&possible_features, entries_[i]->features()); if (!entries_[i]->NeedsMoreInfo(gpu_info)) MergeFeatureSets(&features, entries_[i]->features()); diff --git a/gpu/config/gpu_control_list.h b/gpu/config/gpu_control_list.h index ced3b52..29a5f77 100644 --- a/gpu/config/gpu_control_list.h +++ b/gpu/config/gpu_control_list.h @@ -93,6 +93,13 @@ class GPU_EXPORT GpuControlList { // Register whether "all" is recognized as all features. void set_supports_feature_type_all(bool supported); + // Enables logging of control list decisions. + void enable_control_list_logging( + const std::string& control_list_logging_name) { + control_list_logging_enabled_ = true; + control_list_logging_name_ = control_list_logging_name; + } + private: friend class GpuControlListEntryTest; friend class MachineModelInfoTest; @@ -289,6 +296,11 @@ class GPU_EXPORT GpuControlList { const FeatureMap& feature_map, bool supports_feature_type_all); + // Logs a control list match for this rule in the list identified by + // |control_list_logging_name|. + void LogControlListMatch( + const std::string& control_list_logging_name) const; + // Determines if a given os/gc/machine_model/driver is included in the // Entry set. bool Contains(OsType os_type, const std::string& os_version, @@ -479,6 +491,9 @@ class GPU_EXPORT GpuControlList { // The features a GpuControlList recognizes and handles. FeatureMap feature_map_; bool supports_feature_type_all_; + + bool control_list_logging_enabled_; + std::string control_list_logging_name_; }; } // namespace gpu diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc index ae2b4a0..a454ded 100644 --- a/gpu/config/software_rendering_list_json.cc +++ b/gpu/config/software_rendering_list_json.cc @@ -18,7 +18,7 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( { "name": "software rendering list", // Please update the version number whenever you change this file. - "version": "6.11", + "version": "6.12", "entries": [ { "id": 1, @@ -138,6 +138,12 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( "op": ">=", "value": "7.15.10.1624" } + }, + { + "driver_vendor": { + "op": "=", + "value": "osmesa" + } } ], "features": [ @@ -329,6 +335,14 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( "op": "<", "value": "7.11" }, + "exceptions": [ + { + "driver_vendor": { + "op": "=", + "value": "osmesa" + } + } + ], "features": [ "all" ] @@ -766,6 +780,12 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( "op": ">=", "value": "7.15.10.1624" } + }, + { + "driver_vendor": { + "op": "=", + "value": "osmesa" + } } ], "features": [ @@ -1069,6 +1089,8 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( "all" ] }, +) // String split to avoid MSVC char limit. +LONG_STRING_CONST( { "id": 75, "description": "Texture sharing not supported on AMD Switchable GPUs due to driver issues", @@ -1081,8 +1103,6 @@ const char kSoftwareRenderingListJson[] = LONG_STRING_CONST( "texture_sharing" ] }, -) // String split to avoid MSVC char limit. -LONG_STRING_CONST( { "id": 76, "description": "WebGL is disabled on Android unless GPU reset notification is supported", @@ -1134,6 +1154,21 @@ LONG_STRING_CONST( "features": [ "accelerated_video_decode" ] + }, + { + "id": 79, + "description": "Disable force compositing mode on all Windows versions prior to Vista.", + "cr_bugs": [273920], + "os": { + "type": "win", + "version": { + "op": "<", + "value": "6.0" + } + }, + "features": [ + "force_compositing_mode" + ] } ] } @@ -1141,4 +1176,3 @@ LONG_STRING_CONST( ); // LONG_STRING_CONST macro } // namespace gpu - |