OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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.h" | 5 #include "content/browser/gpu/gpu_data_manager_impl.h" |
6 | 6 |
7 #if defined(OS_MACOSX) | 7 #if defined(OS_MACOSX) |
8 #include <ApplicationServices/ApplicationServices.h> | 8 #include <ApplicationServices/ApplicationServices.h> |
9 #endif // OS_MACOSX | 9 #endif // OS_MACOSX |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "base/version.h" | 21 #include "base/version.h" |
22 #include "content/browser/gpu/gpu_process_host.h" | 22 #include "content/browser/gpu/gpu_process_host.h" |
23 #include "content/browser/gpu/gpu_util.h" | 23 #include "content/browser/gpu/gpu_util.h" |
24 #include "content/common/gpu/gpu_messages.h" | 24 #include "content/common/gpu/gpu_messages.h" |
25 #include "content/gpu/gpu_info_collector.h" | 25 #include "content/gpu/gpu_info_collector.h" |
26 #include "content/public/browser/browser_thread.h" | 26 #include "content/public/browser/browser_thread.h" |
27 #include "content/public/browser/gpu_data_manager_observer.h" | 27 #include "content/public/browser/gpu_data_manager_observer.h" |
28 #include "content/public/common/content_client.h" | 28 #include "content/public/common/content_client.h" |
29 #include "content/public/common/content_constants.h" | 29 #include "content/public/common/content_constants.h" |
30 #include "content/public/common/content_switches.h" | 30 #include "content/public/common/content_switches.h" |
| 31 #include "gpu/command_buffer/service/gpu_switches.h" |
31 #include "grit/content_resources.h" | 32 #include "grit/content_resources.h" |
32 #include "ui/base/ui_base_switches.h" | 33 #include "ui/base/ui_base_switches.h" |
33 #include "ui/gl/gl_implementation.h" | 34 #include "ui/gl/gl_implementation.h" |
34 #include "ui/gl/gl_switches.h" | 35 #include "ui/gl/gl_switches.h" |
35 #include "ui/gl/gpu_switching_manager.h" | 36 #include "ui/gl/gpu_switching_manager.h" |
36 #include "webkit/plugins/plugin_switches.h" | 37 #include "webkit/plugins/plugin_switches.h" |
37 | 38 |
38 #if defined(OS_WIN) | 39 #if defined(OS_WIN) |
39 #include "base/win/windows_version.h" | 40 #include "base/win/windows_version.h" |
40 #endif | 41 #endif |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 GpuDataManagerImpl* GpuDataManagerImpl::GetInstance() { | 95 GpuDataManagerImpl* GpuDataManagerImpl::GetInstance() { |
95 return Singleton<GpuDataManagerImpl>::get(); | 96 return Singleton<GpuDataManagerImpl>::get(); |
96 } | 97 } |
97 | 98 |
98 void GpuDataManagerImpl::InitializeForTesting( | 99 void GpuDataManagerImpl::InitializeForTesting( |
99 const std::string& gpu_blacklist_json, | 100 const std::string& gpu_blacklist_json, |
100 const GPUInfo& gpu_info) { | 101 const GPUInfo& gpu_info) { |
101 // This function is for testing only, so disable histograms. | 102 // This function is for testing only, so disable histograms. |
102 update_histograms_ = false; | 103 update_histograms_ = false; |
103 | 104 |
104 InitializeImpl(gpu_blacklist_json, gpu_info); | 105 InitializeImpl(gpu_blacklist_json, "", "", gpu_info); |
105 } | 106 } |
106 | 107 |
107 GpuFeatureType GpuDataManagerImpl::GetBlacklistedFeatures() const { | 108 GpuFeatureType GpuDataManagerImpl::GetBlacklistedFeatures() const { |
108 if (software_rendering_) { | 109 if (software_rendering_) { |
109 GpuFeatureType flags; | 110 GpuFeatureType flags; |
110 | 111 |
111 // Skia's software rendering is probably more efficient than going through | 112 // Skia's software rendering is probably more efficient than going through |
112 // software emulation of the GPU, so use that. | 113 // software emulation of the GPU, so use that. |
113 flags = GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS; | 114 flags = GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS; |
114 return flags; | 115 return flags; |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 return; | 281 return; |
281 | 282 |
282 GPUInfo gpu_info; | 283 GPUInfo gpu_info; |
283 gpu_info_collector::CollectBasicGraphicsInfo(&gpu_info); | 284 gpu_info_collector::CollectBasicGraphicsInfo(&gpu_info); |
284 #if defined(ARCH_CPU_X86_FAMILY) | 285 #if defined(ARCH_CPU_X86_FAMILY) |
285 if (!gpu_info.gpu.vendor_id || !gpu_info.gpu.device_id) | 286 if (!gpu_info.gpu.vendor_id || !gpu_info.gpu.device_id) |
286 gpu_info.finalized = true; | 287 gpu_info.finalized = true; |
287 #endif | 288 #endif |
288 | 289 |
289 std::string gpu_blacklist_string; | 290 std::string gpu_blacklist_string; |
| 291 std::string gpu_switching_list_string; |
| 292 std::string gpu_driver_bug_list_string; |
290 if (!command_line->HasSwitch(switches::kIgnoreGpuBlacklist)) { | 293 if (!command_line->HasSwitch(switches::kIgnoreGpuBlacklist)) { |
291 const base::StringPiece gpu_blacklist_json = | 294 const base::StringPiece gpu_blacklist_json = |
292 GetContentClient()->GetDataResource( | 295 GetContentClient()->GetDataResource( |
293 IDR_GPU_BLACKLIST, ui::SCALE_FACTOR_NONE); | 296 IDR_GPU_BLACKLIST, ui::SCALE_FACTOR_NONE); |
294 gpu_blacklist_string = gpu_blacklist_json.as_string(); | 297 gpu_blacklist_string = gpu_blacklist_json.as_string(); |
| 298 const base::StringPiece gpu_switching_list_json = |
| 299 GetContentClient()->GetDataResource( |
| 300 IDR_GPU_SWITCHING_LIST, ui::SCALE_FACTOR_NONE); |
| 301 gpu_switching_list_string = gpu_switching_list_json.as_string(); |
295 } | 302 } |
296 | 303 if (!command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds)) { |
297 InitializeImpl(gpu_blacklist_string, gpu_info); | 304 const base::StringPiece gpu_driver_bug_list_json = |
| 305 GetContentClient()->GetDataResource( |
| 306 IDR_GPU_DRIVER_BUG_LIST, ui::SCALE_FACTOR_NONE); |
| 307 gpu_driver_bug_list_string = gpu_driver_bug_list_json.as_string(); |
| 308 } |
| 309 InitializeImpl(gpu_blacklist_string, |
| 310 gpu_switching_list_string, |
| 311 gpu_driver_bug_list_string, |
| 312 gpu_info); |
298 } | 313 } |
299 | 314 |
300 void GpuDataManagerImpl::UpdateGpuInfo(const GPUInfo& gpu_info) { | 315 void GpuDataManagerImpl::UpdateGpuInfo(const GPUInfo& gpu_info) { |
301 // No further update of gpu_info if falling back to software renderer. | 316 // No further update of gpu_info if falling back to software renderer. |
302 if (software_rendering_) | 317 if (software_rendering_) |
303 return; | 318 return; |
304 | 319 |
305 GPUInfo my_gpu_info; | 320 GPUInfo my_gpu_info; |
306 { | 321 { |
307 base::AutoLock auto_lock(gpu_info_lock_); | 322 base::AutoLock auto_lock(gpu_info_lock_); |
308 gpu_info_collector::MergeGPUInfo(&gpu_info_, gpu_info); | 323 gpu_info_collector::MergeGPUInfo(&gpu_info_, gpu_info); |
309 complete_gpu_info_already_requested_ = | 324 complete_gpu_info_already_requested_ = |
310 complete_gpu_info_already_requested_ || gpu_info_.finalized; | 325 complete_gpu_info_already_requested_ || gpu_info_.finalized; |
311 my_gpu_info = gpu_info_; | 326 my_gpu_info = gpu_info_; |
312 } | 327 } |
313 | 328 |
314 GetContentClient()->SetGpuInfo(my_gpu_info); | 329 GetContentClient()->SetGpuInfo(my_gpu_info); |
315 | 330 |
316 if (gpu_blacklist_.get()) { | 331 if (gpu_blacklist_.get()) { |
317 GpuBlacklist::Decision decision = | 332 int features = gpu_blacklist_->MakeDecision( |
318 gpu_blacklist_->MakeBlacklistDecision( | 333 GpuControlList::kOsAny, "", my_gpu_info); |
319 GpuBlacklist::kOsAny, "", my_gpu_info); | |
320 if (update_histograms_) | 334 if (update_histograms_) |
321 UpdateStats(gpu_blacklist_.get(), decision.blacklisted_features); | 335 UpdateStats(gpu_blacklist_.get(), features); |
322 | 336 |
323 UpdateBlacklistedFeatures(decision.blacklisted_features); | 337 UpdateBlacklistedFeatures(static_cast<GpuFeatureType>(features)); |
324 if (decision.gpu_switching != GPU_SWITCHING_OPTION_UNKNOWN) { | 338 } |
| 339 if (gpu_switching_list_.get()) { |
| 340 int option = gpu_switching_list_->MakeDecision( |
| 341 GpuControlList::kOsAny, "", my_gpu_info); |
| 342 if (option != GPU_SWITCHING_OPTION_UNKNOWN) { |
325 // Blacklist decision should not overwrite commandline switch from users. | 343 // Blacklist decision should not overwrite commandline switch from users. |
326 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 344 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
327 if (!command_line->HasSwitch(switches::kGpuSwitching)) | 345 if (!command_line->HasSwitch(switches::kGpuSwitching)) |
328 gpu_switching_ = decision.gpu_switching; | 346 gpu_switching_ = static_cast<GpuSwitchingOption>(option); |
329 } | 347 } |
330 } | 348 } |
| 349 if (gpu_driver_bug_list_.get()) |
| 350 gpu_driver_bugs_ = gpu_driver_bug_list_->MakeDecision( |
| 351 GpuControlList::kOsAny, "", my_gpu_info); |
331 | 352 |
332 // We have to update GpuFeatureType before notify all the observers. | 353 // We have to update GpuFeatureType before notify all the observers. |
333 NotifyGpuInfoUpdate(); | 354 NotifyGpuInfoUpdate(); |
334 } | 355 } |
335 | 356 |
336 void GpuDataManagerImpl::UpdateVideoMemoryUsageStats( | 357 void GpuDataManagerImpl::UpdateVideoMemoryUsageStats( |
337 const GPUVideoMemoryUsageStats& video_memory_usage_stats) { | 358 const GPUVideoMemoryUsageStats& video_memory_usage_stats) { |
338 observer_list_->Notify(&GpuDataManagerObserver::OnVideoMemoryUsageStatsUpdate, | 359 observer_list_->Notify(&GpuDataManagerObserver::OnVideoMemoryUsageStatsUpdate, |
339 video_memory_usage_stats); | 360 video_memory_usage_stats); |
340 } | 361 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 | 515 |
495 std::string GpuDataManagerImpl::GetBlacklistVersion() const { | 516 std::string GpuDataManagerImpl::GetBlacklistVersion() const { |
496 if (gpu_blacklist_.get()) | 517 if (gpu_blacklist_.get()) |
497 return gpu_blacklist_->GetVersion(); | 518 return gpu_blacklist_->GetVersion(); |
498 return "0"; | 519 return "0"; |
499 } | 520 } |
500 | 521 |
501 base::ListValue* GpuDataManagerImpl::GetBlacklistReasons() const { | 522 base::ListValue* GpuDataManagerImpl::GetBlacklistReasons() const { |
502 ListValue* reasons = new ListValue(); | 523 ListValue* reasons = new ListValue(); |
503 if (gpu_blacklist_.get()) | 524 if (gpu_blacklist_.get()) |
504 gpu_blacklist_->GetBlacklistReasons(reasons); | 525 gpu_blacklist_->GetReasons(reasons); |
505 return reasons; | 526 return reasons; |
506 } | 527 } |
507 | 528 |
508 void GpuDataManagerImpl::AddLogMessage( | 529 void GpuDataManagerImpl::AddLogMessage( |
509 int level, const std::string& header, const std::string& message) { | 530 int level, const std::string& header, const std::string& message) { |
510 base::AutoLock auto_lock(log_messages_lock_); | 531 base::AutoLock auto_lock(log_messages_lock_); |
511 DictionaryValue* dict = new DictionaryValue(); | 532 DictionaryValue* dict = new DictionaryValue(); |
512 dict->SetInteger("level", level); | 533 dict->SetInteger("level", level); |
513 dict->SetString("header", header); | 534 dict->SetString("header", header); |
514 dict->SetString("message", message); | 535 dict->SetString("message", message); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 } | 644 } |
624 | 645 |
625 GpuDataManagerImpl::~GpuDataManagerImpl() { | 646 GpuDataManagerImpl::~GpuDataManagerImpl() { |
626 #if defined(OS_MACOSX) | 647 #if defined(OS_MACOSX) |
627 CGDisplayRemoveReconfigurationCallback(DisplayReconfigCallback, this); | 648 CGDisplayRemoveReconfigurationCallback(DisplayReconfigCallback, this); |
628 #endif | 649 #endif |
629 } | 650 } |
630 | 651 |
631 void GpuDataManagerImpl::InitializeImpl( | 652 void GpuDataManagerImpl::InitializeImpl( |
632 const std::string& gpu_blacklist_json, | 653 const std::string& gpu_blacklist_json, |
| 654 const std::string& gpu_switching_list_json, |
| 655 const std::string& gpu_driver_bug_list_json, |
633 const GPUInfo& gpu_info) { | 656 const GPUInfo& gpu_info) { |
| 657 std::string browser_version_string = ProcessVersionString( |
| 658 GetContentClient()->GetProduct()); |
| 659 CHECK(!browser_version_string.empty()); |
| 660 |
634 if (!gpu_blacklist_json.empty()) { | 661 if (!gpu_blacklist_json.empty()) { |
635 std::string browser_version_string = ProcessVersionString( | 662 gpu_blacklist_.reset(GpuBlacklist::Create()); |
636 GetContentClient()->GetProduct()); | 663 gpu_blacklist_->LoadList( |
637 CHECK(!browser_version_string.empty()); | 664 browser_version_string, gpu_blacklist_json, |
638 gpu_blacklist_.reset(new GpuBlacklist()); | 665 GpuControlList::kCurrentOsOnly); |
639 bool succeed = gpu_blacklist_->LoadGpuBlacklist( | 666 } |
640 browser_version_string, | 667 if (!gpu_switching_list_json.empty()) { |
641 gpu_blacklist_json, | 668 gpu_switching_list_.reset(GpuSwitchingList::Create()); |
642 GpuBlacklist::kCurrentOsOnly); | 669 gpu_switching_list_->LoadList( |
643 CHECK(succeed); | 670 browser_version_string, gpu_switching_list_json, |
| 671 GpuControlList::kCurrentOsOnly); |
| 672 } |
| 673 if (!gpu_driver_bug_list_json.empty()) { |
| 674 gpu_driver_bug_list_.reset(GpuDriverBugList::Create()); |
| 675 gpu_driver_bug_list_->LoadList( |
| 676 browser_version_string, gpu_driver_bug_list_json, |
| 677 GpuControlList::kCurrentOsOnly); |
644 } | 678 } |
645 | 679 |
646 { | 680 { |
647 base::AutoLock auto_lock(gpu_info_lock_); | 681 base::AutoLock auto_lock(gpu_info_lock_); |
648 gpu_info_ = gpu_info; | 682 gpu_info_ = gpu_info; |
649 } | 683 } |
650 UpdateGpuInfo(gpu_info); | 684 UpdateGpuInfo(gpu_info); |
651 UpdateGpuSwitchingManager(gpu_info); | 685 UpdateGpuSwitchingManager(gpu_info); |
652 UpdatePreliminaryBlacklistedFeatures(); | 686 UpdatePreliminaryBlacklistedFeatures(); |
653 } | 687 } |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 | 840 |
807 void GpuDataManagerImpl::Notify3DAPIBlocked(const GURL& url, | 841 void GpuDataManagerImpl::Notify3DAPIBlocked(const GURL& url, |
808 int render_process_id, | 842 int render_process_id, |
809 int render_view_id, | 843 int render_view_id, |
810 ThreeDAPIType requester) { | 844 ThreeDAPIType requester) { |
811 observer_list_->Notify(&GpuDataManagerObserver::DidBlock3DAPIs, | 845 observer_list_->Notify(&GpuDataManagerObserver::DidBlock3DAPIs, |
812 url, render_process_id, render_view_id, requester); | 846 url, render_process_id, render_view_id, requester); |
813 } | 847 } |
814 | 848 |
815 } // namespace content | 849 } // namespace content |
OLD | NEW |