Index: content/browser/gpu/gpu_data_manager.cc |
=================================================================== |
--- content/browser/gpu/gpu_data_manager.cc (revision 112998) |
+++ content/browser/gpu/gpu_data_manager.cc (working copy) |
@@ -196,6 +196,7 @@ |
GpuDataManager::GpuDataManager() |
: complete_gpu_info_already_requested_(false), |
+ complete_gpu_info_available_(false), |
observer_list_(new GpuDataManagerObserverList), |
software_rendering_(false) { |
Initialize(); |
@@ -208,7 +209,10 @@ |
if (!user_flags_.skip_gpu_data_loading()) { |
content::GPUInfo gpu_info; |
gpu_info_collector::CollectPreliminaryGraphicsInfo(&gpu_info); |
- UpdateGpuInfo(gpu_info); |
+ { |
+ base::AutoLock auto_lock(gpu_info_lock_); |
+ gpu_info_ = gpu_info; |
+ } |
} |
#if defined(OS_MACOSX) |
@@ -229,7 +233,8 @@ |
void GpuDataManager::RequestCompleteGpuInfoIfNeeded() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (complete_gpu_info_already_requested_) |
+ |
+ if (complete_gpu_info_already_requested_ || complete_gpu_info_available_) |
return; |
complete_gpu_info_already_requested_ = true; |
@@ -240,20 +245,20 @@ |
} |
void GpuDataManager::UpdateGpuInfo(const content::GPUInfo& gpu_info) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ complete_gpu_info_available_ = true; |
+ complete_gpu_info_already_requested_ = true; |
{ |
base::AutoLock auto_lock(gpu_info_lock_); |
if (!Merge(&gpu_info_, gpu_info)) |
return; |
- } |
- |
- NotifyGpuInfoUpdate(); |
- |
- { |
- base::AutoLock auto_lock(gpu_info_lock_); |
content::GetContentClient()->SetGpuInfo(gpu_info_); |
} |
UpdateGpuFeatureFlags(); |
+ // We have to update GpuFeatureFlags before notify all the observers. |
+ NotifyGpuInfoUpdate(); |
} |
const content::GPUInfo& GpuDataManager::gpu_info() const { |
@@ -555,13 +560,7 @@ |
} |
void GpuDataManager::UpdateGpuFeatureFlags() { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&GpuDataManager::UpdateGpuFeatureFlags, |
- base::Unretained(this))); |
- return; |
- } |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
GpuBlacklist* gpu_blacklist = GetGpuBlacklist(); |
// We don't set a lock around modifying gpu_feature_flags_ since it's just an |
@@ -577,9 +576,6 @@ |
GpuBlacklist::kOsAny, NULL, gpu_info_); |
} |
- // Notify clients that GpuInfo state has changed |
- NotifyGpuInfoUpdate(); |
- |
uint32 flags = gpu_feature_flags_.flags(); |
uint32 max_entry_id = gpu_blacklist->max_entry_id(); |
bool disabled = false; |