Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/gpu/gpu_data_manager_impl_private.h" | 5 #include "content/browser/gpu/gpu_data_manager_impl_private.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 313 }; | 313 }; |
| 314 | 314 |
| 315 } // namespace anonymous | 315 } // namespace anonymous |
| 316 | 316 |
| 317 void GpuDataManagerImplPrivate::InitializeForTesting( | 317 void GpuDataManagerImplPrivate::InitializeForTesting( |
| 318 const std::string& gpu_blacklist_json, | 318 const std::string& gpu_blacklist_json, |
| 319 const gpu::GPUInfo& gpu_info) { | 319 const gpu::GPUInfo& gpu_info) { |
| 320 // This function is for testing only, so disable histograms. | 320 // This function is for testing only, so disable histograms. |
| 321 update_histograms_ = false; | 321 update_histograms_ = false; |
| 322 | 322 |
| 323 // Prevent all further initialization. | |
| 324 finalized_ = true; | |
| 325 | |
| 323 InitializeImpl(gpu_blacklist_json, std::string(), std::string(), gpu_info); | 326 InitializeImpl(gpu_blacklist_json, std::string(), std::string(), gpu_info); |
| 324 } | 327 } |
| 325 | 328 |
| 326 bool GpuDataManagerImplPrivate::IsFeatureBlacklisted(int feature) const { | 329 bool GpuDataManagerImplPrivate::IsFeatureBlacklisted(int feature) const { |
| 327 #if defined(OS_CHROMEOS) | 330 #if defined(OS_CHROMEOS) |
| 328 if (feature == gpu::GPU_FEATURE_TYPE_PANEL_FITTING && | 331 if (feature == gpu::GPU_FEATURE_TYPE_PANEL_FITTING && |
| 329 CommandLine::ForCurrentProcess()->HasSwitch( | 332 CommandLine::ForCurrentProcess()->HasSwitch( |
| 330 switches::kDisablePanelFitting)) { | 333 switches::kDisablePanelFitting)) { |
| 331 return true; | 334 return true; |
| 332 } | 335 } |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 526 std::string* gl_version) { | 529 std::string* gl_version) { |
| 527 DCHECK(gl_vendor && gl_renderer && gl_version); | 530 DCHECK(gl_vendor && gl_renderer && gl_version); |
| 528 | 531 |
| 529 *gl_vendor = gpu_info_.gl_vendor; | 532 *gl_vendor = gpu_info_.gl_vendor; |
| 530 *gl_renderer = gpu_info_.gl_renderer; | 533 *gl_renderer = gpu_info_.gl_renderer; |
| 531 *gl_version = gpu_info_.gl_version_string; | 534 *gl_version = gpu_info_.gl_version_string; |
| 532 } | 535 } |
| 533 | 536 |
| 534 void GpuDataManagerImplPrivate::Initialize() { | 537 void GpuDataManagerImplPrivate::Initialize() { |
| 535 TRACE_EVENT0("startup", "GpuDataManagerImpl::Initialize"); | 538 TRACE_EVENT0("startup", "GpuDataManagerImpl::Initialize"); |
| 536 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 539 if (finalized_) { |
| 537 if (command_line->HasSwitch(switches::kSkipGpuDataLoading) && | 540 DLOG(INFO) << "GpuDataManagerImpl marked as finalized; skipping Initialize"; |
| 538 !command_line->HasSwitch(switches::kUseGpuInTests)) | 541 return; |
| 542 } | |
| 543 | |
| 544 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
| 545 if (command_line->HasSwitch(switches::kSkipGpuDataLoading)) | |
| 539 return; | 546 return; |
| 540 | 547 |
| 541 gpu::GPUInfo gpu_info; | 548 gpu::GPUInfo gpu_info; |
| 542 { | 549 if (command_line->GetSwitchValueASCII( |
| 550 switches::kUseGL) == gfx::kGLImplementationOSMesaName) { | |
| 551 // If using the OSMesa GL implementation, use fake vendor and device ids to | |
| 552 // make sure it never gets blacklisted. This is better than simply | |
| 553 // cancelling GPUInfo gathering as it allows us to proceed with loading the | |
| 554 // blacklist below which may have non-device specific entries we want to | |
| 555 // apply anyways (e.g., OS version blacklisting). | |
| 556 gpu_info.gpu.vendor_id = 0xffff; | |
| 557 gpu_info.gpu.device_id = 0xffff; | |
| 558 | |
| 559 // Hardcode some values otherwise some blacklisting rules in | |
| 560 // kSoftwareRenderingListJson result in a positive match as GpuControlList | |
| 561 // assumes a match (by design) when a property is required for the | |
| 562 // verification yet not present in the GpuInfo. | |
| 563 gpu_info.driver_vendor = | |
| 564 gfx::kGLImplementationOSMesaName; // Bypass rule #74. | |
|
Vangelis Kokkevis
2013/10/08 23:09:48
I think that it would be better to modify the blac
gab
2013/10/09 18:13:02
The problem is that if we leave gpu_info empty, th
| |
| 565 gpu_info.driver_date = "2013.8"; // Bypass rules #12 and #55. | |
| 566 gpu_info.driver_version = "9.0.3"; // Bypass rule #23. | |
| 567 } else { | |
| 543 TRACE_EVENT0("startup", | 568 TRACE_EVENT0("startup", |
| 544 "GpuDataManagerImpl::Initialize:CollectBasicGraphicsInfo"); | 569 "GpuDataManagerImpl::Initialize:CollectBasicGraphicsInfo"); |
| 545 gpu::CollectBasicGraphicsInfo(&gpu_info); | 570 gpu::CollectBasicGraphicsInfo(&gpu_info); |
| 546 } | 571 } |
| 547 #if defined(ARCH_CPU_X86_FAMILY) | 572 #if defined(ARCH_CPU_X86_FAMILY) |
| 548 if (!gpu_info.gpu.vendor_id || !gpu_info.gpu.device_id) | 573 if (!gpu_info.gpu.vendor_id || !gpu_info.gpu.device_id) |
| 549 gpu_info.finalized = true; | 574 gpu_info.finalized = true; |
| 550 #endif | 575 #endif |
| 551 | 576 |
| 552 std::string gpu_blacklist_string; | 577 std::string gpu_blacklist_string; |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 966 gpu_switching_(gpu::GPU_SWITCHING_OPTION_AUTOMATIC), | 991 gpu_switching_(gpu::GPU_SWITCHING_OPTION_AUTOMATIC), |
| 967 observer_list_(new GpuDataManagerObserverList), | 992 observer_list_(new GpuDataManagerObserverList), |
| 968 use_swiftshader_(false), | 993 use_swiftshader_(false), |
| 969 card_blacklisted_(false), | 994 card_blacklisted_(false), |
| 970 update_histograms_(true), | 995 update_histograms_(true), |
| 971 window_count_(0), | 996 window_count_(0), |
| 972 domain_blocking_enabled_(true), | 997 domain_blocking_enabled_(true), |
| 973 owner_(owner), | 998 owner_(owner), |
| 974 display_count_(0), | 999 display_count_(0), |
| 975 gpu_process_accessible_(true), | 1000 gpu_process_accessible_(true), |
| 976 use_software_compositor_(false) { | 1001 use_software_compositor_(false), |
| 1002 finalized_(false) { | |
| 977 DCHECK(owner_); | 1003 DCHECK(owner_); |
| 978 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 1004 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 979 if (command_line->HasSwitch(switches::kDisableAcceleratedCompositing)) { | 1005 if (command_line->HasSwitch(switches::kDisableAcceleratedCompositing)) { |
| 980 command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas); | 1006 command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas); |
| 981 command_line->AppendSwitch(switches::kDisableAcceleratedLayers); | 1007 command_line->AppendSwitch(switches::kDisableAcceleratedLayers); |
| 982 } | 1008 } |
| 983 if (command_line->HasSwitch(switches::kDisableGpu)) | 1009 if (command_line->HasSwitch(switches::kDisableGpu)) |
| 984 DisableHardwareAcceleration(); | 1010 DisableHardwareAcceleration(); |
| 985 if (command_line->HasSwitch(switches::kEnableSoftwareCompositing)) | 1011 if (command_line->HasSwitch(switches::kEnableSoftwareCompositing)) |
| 986 use_software_compositor_ = true; | 1012 use_software_compositor_ = true; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1011 | 1037 |
| 1012 void GpuDataManagerImplPrivate::InitializeImpl( | 1038 void GpuDataManagerImplPrivate::InitializeImpl( |
| 1013 const std::string& gpu_blacklist_json, | 1039 const std::string& gpu_blacklist_json, |
| 1014 const std::string& gpu_switching_list_json, | 1040 const std::string& gpu_switching_list_json, |
| 1015 const std::string& gpu_driver_bug_list_json, | 1041 const std::string& gpu_driver_bug_list_json, |
| 1016 const gpu::GPUInfo& gpu_info) { | 1042 const gpu::GPUInfo& gpu_info) { |
| 1017 std::string browser_version_string = ProcessVersionString( | 1043 std::string browser_version_string = ProcessVersionString( |
| 1018 GetContentClient()->GetProduct()); | 1044 GetContentClient()->GetProduct()); |
| 1019 CHECK(!browser_version_string.empty()); | 1045 CHECK(!browser_version_string.empty()); |
| 1020 | 1046 |
| 1047 const bool log_gpu_control_list_decisions = | |
| 1048 CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1049 switches::kLogGpuControlListDecisions); | |
| 1050 | |
| 1021 if (!gpu_blacklist_json.empty()) { | 1051 if (!gpu_blacklist_json.empty()) { |
| 1022 gpu_blacklist_.reset(gpu::GpuBlacklist::Create()); | 1052 gpu_blacklist_.reset(gpu::GpuBlacklist::Create()); |
| 1053 if (log_gpu_control_list_decisions) | |
| 1054 gpu_blacklist_->enable_control_list_logging("gpu_blacklist"); | |
| 1023 bool success = gpu_blacklist_->LoadList( | 1055 bool success = gpu_blacklist_->LoadList( |
| 1024 browser_version_string, gpu_blacklist_json, | 1056 browser_version_string, gpu_blacklist_json, |
| 1025 gpu::GpuControlList::kCurrentOsOnly); | 1057 gpu::GpuControlList::kCurrentOsOnly); |
| 1026 DCHECK(success); | 1058 DCHECK(success); |
| 1027 } | 1059 } |
| 1028 if (!gpu_switching_list_json.empty()) { | 1060 if (!gpu_switching_list_json.empty()) { |
| 1029 gpu_switching_list_.reset(gpu::GpuSwitchingList::Create()); | 1061 gpu_switching_list_.reset(gpu::GpuSwitchingList::Create()); |
| 1062 if (log_gpu_control_list_decisions) | |
| 1063 gpu_switching_list_->enable_control_list_logging("gpu_switching_list"); | |
| 1030 bool success = gpu_switching_list_->LoadList( | 1064 bool success = gpu_switching_list_->LoadList( |
| 1031 browser_version_string, gpu_switching_list_json, | 1065 browser_version_string, gpu_switching_list_json, |
| 1032 gpu::GpuControlList::kCurrentOsOnly); | 1066 gpu::GpuControlList::kCurrentOsOnly); |
| 1033 DCHECK(success); | 1067 DCHECK(success); |
| 1034 } | 1068 } |
| 1035 if (!gpu_driver_bug_list_json.empty()) { | 1069 if (!gpu_driver_bug_list_json.empty()) { |
| 1036 gpu_driver_bug_list_.reset(gpu::GpuDriverBugList::Create()); | 1070 gpu_driver_bug_list_.reset(gpu::GpuDriverBugList::Create()); |
| 1071 if (log_gpu_control_list_decisions) | |
| 1072 gpu_driver_bug_list_->enable_control_list_logging("gpu_driver_bug_list"); | |
| 1037 bool success = gpu_driver_bug_list_->LoadList( | 1073 bool success = gpu_driver_bug_list_->LoadList( |
| 1038 browser_version_string, gpu_driver_bug_list_json, | 1074 browser_version_string, gpu_driver_bug_list_json, |
| 1039 gpu::GpuControlList::kCurrentOsOnly); | 1075 gpu::GpuControlList::kCurrentOsOnly); |
| 1040 DCHECK(success); | 1076 DCHECK(success); |
| 1041 } | 1077 } |
| 1042 | 1078 |
| 1043 gpu_info_ = gpu_info; | 1079 gpu_info_ = gpu_info; |
| 1044 UpdateGpuInfo(gpu_info); | 1080 UpdateGpuInfo(gpu_info); |
| 1045 UpdateGpuSwitchingManager(gpu_info); | 1081 UpdateGpuSwitchingManager(gpu_info); |
| 1046 UpdatePreliminaryBlacklistedFeatures(); | 1082 UpdatePreliminaryBlacklistedFeatures(); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1226 | 1262 |
| 1227 void GpuDataManagerImplPrivate::OnGpuProcessInitFailure() { | 1263 void GpuDataManagerImplPrivate::OnGpuProcessInitFailure() { |
| 1228 gpu_process_accessible_ = false; | 1264 gpu_process_accessible_ = false; |
| 1229 gpu_info_.finalized = true; | 1265 gpu_info_.finalized = true; |
| 1230 complete_gpu_info_already_requested_ = true; | 1266 complete_gpu_info_already_requested_ = true; |
| 1231 // Some observers might be waiting. | 1267 // Some observers might be waiting. |
| 1232 NotifyGpuInfoUpdate(); | 1268 NotifyGpuInfoUpdate(); |
| 1233 } | 1269 } |
| 1234 | 1270 |
| 1235 } // namespace content | 1271 } // namespace content |
| OLD | NEW |