OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "content/browser/gpu/gpu_data_manager.h" |
6 | 6 |
7 #if defined(OS_MACOSX) | 7 #if defined(OS_MACOSX) |
8 #include <CoreGraphics/CGDisplayConfiguration.h> | 8 #include <CoreGraphics/CGDisplayConfiguration.h> |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 | 189 |
190 void GpuDataManager::UserFlags::ApplyPolicies() { | 190 void GpuDataManager::UserFlags::ApplyPolicies() { |
191 if (disable_accelerated_compositing_) { | 191 if (disable_accelerated_compositing_) { |
192 disable_accelerated_2d_canvas_ = true; | 192 disable_accelerated_2d_canvas_ = true; |
193 disable_accelerated_layers_ = true; | 193 disable_accelerated_layers_ = true; |
194 } | 194 } |
195 } | 195 } |
196 | 196 |
197 GpuDataManager::GpuDataManager() | 197 GpuDataManager::GpuDataManager() |
198 : complete_gpu_info_already_requested_(false), | 198 : complete_gpu_info_already_requested_(false), |
| 199 complete_gpu_info_available_(false), |
199 observer_list_(new GpuDataManagerObserverList), | 200 observer_list_(new GpuDataManagerObserverList), |
200 software_rendering_(false) { | 201 software_rendering_(false) { |
201 Initialize(); | 202 Initialize(); |
202 } | 203 } |
203 | 204 |
204 void GpuDataManager::Initialize() { | 205 void GpuDataManager::Initialize() { |
205 // User flags need to be collected before any further initialization. | 206 // User flags need to be collected before any further initialization. |
206 user_flags_.Initialize(); | 207 user_flags_.Initialize(); |
207 | 208 |
208 if (!user_flags_.skip_gpu_data_loading()) { | 209 if (!user_flags_.skip_gpu_data_loading()) { |
209 content::GPUInfo gpu_info; | 210 content::GPUInfo gpu_info; |
210 gpu_info_collector::CollectPreliminaryGraphicsInfo(&gpu_info); | 211 gpu_info_collector::CollectPreliminaryGraphicsInfo(&gpu_info); |
211 UpdateGpuInfo(gpu_info); | 212 { |
| 213 base::AutoLock auto_lock(gpu_info_lock_); |
| 214 gpu_info_ = gpu_info; |
| 215 } |
212 } | 216 } |
213 | 217 |
214 #if defined(OS_MACOSX) | 218 #if defined(OS_MACOSX) |
215 CGDisplayRegisterReconfigurationCallback(DisplayReconfigCallback, this); | 219 CGDisplayRegisterReconfigurationCallback(DisplayReconfigCallback, this); |
216 #endif | 220 #endif |
217 } | 221 } |
218 | 222 |
219 GpuDataManager::~GpuDataManager() { | 223 GpuDataManager::~GpuDataManager() { |
220 #if defined(OS_MACOSX) | 224 #if defined(OS_MACOSX) |
221 CGDisplayRemoveReconfigurationCallback(DisplayReconfigCallback, this); | 225 CGDisplayRemoveReconfigurationCallback(DisplayReconfigCallback, this); |
222 #endif | 226 #endif |
223 } | 227 } |
224 | 228 |
225 // static | 229 // static |
226 GpuDataManager* GpuDataManager::GetInstance() { | 230 GpuDataManager* GpuDataManager::GetInstance() { |
227 return Singleton<GpuDataManager>::get(); | 231 return Singleton<GpuDataManager>::get(); |
228 } | 232 } |
229 | 233 |
230 void GpuDataManager::RequestCompleteGpuInfoIfNeeded() { | 234 void GpuDataManager::RequestCompleteGpuInfoIfNeeded() { |
231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
232 if (complete_gpu_info_already_requested_) | 236 |
| 237 if (complete_gpu_info_already_requested_ || complete_gpu_info_available_) |
233 return; | 238 return; |
234 complete_gpu_info_already_requested_ = true; | 239 complete_gpu_info_already_requested_ = true; |
235 | 240 |
236 GpuProcessHost::SendOnIO( | 241 GpuProcessHost::SendOnIO( |
237 0, | 242 0, |
238 content::CAUSE_FOR_GPU_LAUNCH_GPUDATAMANAGER_REQUESTCOMPLETEGPUINFOIFNEEDE
D, | 243 content::CAUSE_FOR_GPU_LAUNCH_GPUDATAMANAGER_REQUESTCOMPLETEGPUINFOIFNEEDE
D, |
239 new GpuMsg_CollectGraphicsInfo()); | 244 new GpuMsg_CollectGraphicsInfo()); |
240 } | 245 } |
241 | 246 |
242 void GpuDataManager::UpdateGpuInfo(const content::GPUInfo& gpu_info) { | 247 void GpuDataManager::UpdateGpuInfo(const content::GPUInfo& gpu_info) { |
| 248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 249 |
| 250 complete_gpu_info_available_ = true; |
| 251 complete_gpu_info_already_requested_ = true; |
243 { | 252 { |
244 base::AutoLock auto_lock(gpu_info_lock_); | 253 base::AutoLock auto_lock(gpu_info_lock_); |
245 if (!Merge(&gpu_info_, gpu_info)) | 254 if (!Merge(&gpu_info_, gpu_info)) |
246 return; | 255 return; |
247 } | |
248 | |
249 NotifyGpuInfoUpdate(); | |
250 | |
251 { | |
252 base::AutoLock auto_lock(gpu_info_lock_); | |
253 content::GetContentClient()->SetGpuInfo(gpu_info_); | 256 content::GetContentClient()->SetGpuInfo(gpu_info_); |
254 } | 257 } |
255 | 258 |
256 UpdateGpuFeatureFlags(); | 259 UpdateGpuFeatureFlags(); |
| 260 // We have to update GpuFeatureFlags before notify all the observers. |
| 261 NotifyGpuInfoUpdate(); |
257 } | 262 } |
258 | 263 |
259 const content::GPUInfo& GpuDataManager::gpu_info() const { | 264 const content::GPUInfo& GpuDataManager::gpu_info() const { |
260 base::AutoLock auto_lock(gpu_info_lock_); | 265 base::AutoLock auto_lock(gpu_info_lock_); |
261 return gpu_info_; | 266 return gpu_info_; |
262 } | 267 } |
263 | 268 |
264 Value* GpuDataManager::GetFeatureStatus() { | 269 Value* GpuDataManager::GetFeatureStatus() { |
265 bool gpu_access_blocked = !GpuAccessAllowed(); | 270 bool gpu_access_blocked = !GpuAccessAllowed(); |
266 | 271 |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 #endif | 553 #endif |
549 | 554 |
550 return info; | 555 return info; |
551 } | 556 } |
552 | 557 |
553 void GpuDataManager::NotifyGpuInfoUpdate() { | 558 void GpuDataManager::NotifyGpuInfoUpdate() { |
554 observer_list_->Notify(&GpuDataManager::Observer::OnGpuInfoUpdate); | 559 observer_list_->Notify(&GpuDataManager::Observer::OnGpuInfoUpdate); |
555 } | 560 } |
556 | 561 |
557 void GpuDataManager::UpdateGpuFeatureFlags() { | 562 void GpuDataManager::UpdateGpuFeatureFlags() { |
558 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 563 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
559 BrowserThread::PostTask( | |
560 BrowserThread::UI, FROM_HERE, | |
561 base::Bind(&GpuDataManager::UpdateGpuFeatureFlags, | |
562 base::Unretained(this))); | |
563 return; | |
564 } | |
565 | 564 |
566 GpuBlacklist* gpu_blacklist = GetGpuBlacklist(); | 565 GpuBlacklist* gpu_blacklist = GetGpuBlacklist(); |
567 // We don't set a lock around modifying gpu_feature_flags_ since it's just an | 566 // We don't set a lock around modifying gpu_feature_flags_ since it's just an |
568 // int. | 567 // int. |
569 if (!gpu_blacklist) { | 568 if (!gpu_blacklist) { |
570 gpu_feature_flags_.set_flags(0); | 569 gpu_feature_flags_.set_flags(0); |
571 return; | 570 return; |
572 } | 571 } |
573 | 572 |
574 { | 573 { |
575 base::AutoLock auto_lock(gpu_info_lock_); | 574 base::AutoLock auto_lock(gpu_info_lock_); |
576 gpu_feature_flags_ = gpu_blacklist->DetermineGpuFeatureFlags( | 575 gpu_feature_flags_ = gpu_blacklist->DetermineGpuFeatureFlags( |
577 GpuBlacklist::kOsAny, NULL, gpu_info_); | 576 GpuBlacklist::kOsAny, NULL, gpu_info_); |
578 } | 577 } |
579 | 578 |
580 // Notify clients that GpuInfo state has changed | |
581 NotifyGpuInfoUpdate(); | |
582 | |
583 uint32 flags = gpu_feature_flags_.flags(); | 579 uint32 flags = gpu_feature_flags_.flags(); |
584 uint32 max_entry_id = gpu_blacklist->max_entry_id(); | 580 uint32 max_entry_id = gpu_blacklist->max_entry_id(); |
585 bool disabled = false; | 581 bool disabled = false; |
586 if (flags == 0) { | 582 if (flags == 0) { |
587 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResultsPerEntry", | 583 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResultsPerEntry", |
588 0, max_entry_id + 1); | 584 0, max_entry_id + 1); |
589 } else { | 585 } else { |
590 std::vector<uint32> flag_entries; | 586 std::vector<uint32> flag_entries; |
591 gpu_blacklist->GetGpuFeatureFlagEntries( | 587 gpu_blacklist->GetGpuFeatureFlagEntries( |
592 GpuFeatureFlags::kGpuFeatureAll, flag_entries, disabled); | 588 GpuFeatureFlags::kGpuFeatureAll, flag_entries, disabled); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 bool GpuDataManager::supportsAccelerated2dCanvas() const { | 751 bool GpuDataManager::supportsAccelerated2dCanvas() const { |
756 if (gpu_info_.can_lose_context) | 752 if (gpu_info_.can_lose_context) |
757 return false; | 753 return false; |
758 #if defined(USE_SKIA) | 754 #if defined(USE_SKIA) |
759 return true; | 755 return true; |
760 #else | 756 #else |
761 return false; | 757 return false; |
762 #endif | 758 #endif |
763 } | 759 } |
764 | 760 |
OLD | NEW |