| // Copyright (c) 2012 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 "chrome/browser/gpu/gpu_feature_checker.h" |
| |
| #include "base/logging.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/gpu_data_manager.h" |
| |
| namespace { |
| |
| // A false return value is always valid, but a true one is only valid if full |
| // GPU info has been collected in a GPU process. |
| bool IsFeatureAllowed(content::GpuDataManager* manager, |
| gpu::GpuFeatureType feature) { |
| return (manager->GpuAccessAllowed(NULL) && |
| !manager->IsFeatureBlacklisted(feature)); |
| } |
| |
| } // namespace |
| |
| GPUFeatureChecker::GPUFeatureChecker(gpu::GpuFeatureType feature, |
| FeatureAvailableCallback callback) |
| : feature_(feature), |
| callback_(callback) { |
| } |
| |
| GPUFeatureChecker::~GPUFeatureChecker() { |
| } |
| |
| void GPUFeatureChecker::CheckGPUFeatureAvailability() { |
| CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| |
| bool finalized = true; |
| #if defined(OS_LINUX) |
| // On Windows and Mac, so far we can always make the final WebGL blacklisting |
| // decision based on partial GPU info; on Linux, we need to launch the GPU |
| // process to collect full GPU info and make the final decision. |
| finalized = false; |
| #endif |
| |
| content::GpuDataManager* manager = content::GpuDataManager::GetInstance(); |
| if (manager->IsCompleteGpuInfoAvailable()) |
| finalized = true; |
| |
| bool feature_allowed = IsFeatureAllowed(manager, feature_); |
| if (!feature_allowed) |
| finalized = true; |
| |
| if (finalized) { |
| callback_.Run(feature_allowed); |
| } else { |
| // Matched with a Release in OnGpuInfoUpdate. |
| AddRef(); |
| |
| manager->AddObserver(this); |
| manager->RequestCompleteGpuInfoIfNeeded(); |
| } |
| } |
| |
| void GPUFeatureChecker::OnGpuInfoUpdate() { |
| content::GpuDataManager* manager = content::GpuDataManager::GetInstance(); |
| manager->RemoveObserver(this); |
| bool feature_allowed = IsFeatureAllowed(manager, feature_); |
| callback_.Run(feature_allowed); |
| |
| // Matches the AddRef in HasFeature(). |
| Release(); |
| } |