| Index: chrome/test/gpu/gpu_pixel_browsertest.cc | 
| =================================================================== | 
| --- chrome/test/gpu/gpu_pixel_browsertest.cc	(revision 69024) | 
| +++ chrome/test/gpu/gpu_pixel_browsertest.cc	(working copy) | 
| @@ -7,6 +7,7 @@ | 
|  | 
| #include "app/app_switches.h" | 
| #include "app/gfx/gl/gl_implementation.h" | 
| +#include "base/callback.h" | 
| #include "base/command_line.h" | 
| #include "base/file_path.h" | 
| #include "base/file_util.h" | 
| @@ -78,6 +79,51 @@ | 
| browser->window()->SetBounds(window_rect); | 
| } | 
|  | 
| +// Observes when any GPU info has been collected and quits the current message | 
| +// loop. | 
| +class GPUInfoCollectedObserver { | 
| + public: | 
| +  explicit GPUInfoCollectedObserver(GpuProcessHostUIShim* gpu_host_shim) | 
| +      : gpu_host_shim_(gpu_host_shim), | 
| +        gpu_info_collected_(false) { | 
| +    gpu_host_shim_->set_gpu_info_collected_callback( | 
| +        NewCallback(this, &GPUInfoCollectedObserver::OnGpuInfoCollected)); | 
| +  } | 
| + | 
| +  void OnGpuInfoCollected() { | 
| +    gpu_info_collected_ = true; | 
| +    gpu_host_shim_->set_gpu_info_collected_callback(NULL); | 
| +    MessageLoopForUI::current()->Quit(); | 
| +  } | 
| + | 
| +  bool gpu_info_collected() { return gpu_info_collected_; } | 
| + | 
| + private: | 
| +  GpuProcessHostUIShim* gpu_host_shim_; | 
| +  bool gpu_info_collected_; | 
| +}; | 
| + | 
| +// Collects info about the GPU. Iff the info is collected, |client_info| will be | 
| +// set and true will be returned. This info may be partial or complete. This | 
| +// will return false if we are running in a virtualized environment. | 
| +bool CollectGPUInfo(GPUInfo* client_info) { | 
| +  CHECK(client_info); | 
| +  GpuProcessHostUIShim* gpu_host_shim = GpuProcessHostUIShim::GetInstance(); | 
| +  if (!gpu_host_shim) | 
| +    return false; | 
| +  GPUInfo info = gpu_host_shim->gpu_info(); | 
| +  if (info.progress() == GPUInfo::kUninitialized) { | 
| +    GPUInfoCollectedObserver observer(gpu_host_shim); | 
| +    gpu_host_shim->CollectGraphicsInfoAsynchronously(); | 
| +    ui_test_utils::RunMessageLoop(); | 
| +    if (!observer.gpu_info_collected()) | 
| +      return false; | 
| +    info = gpu_host_shim->gpu_info(); | 
| +  } | 
| +  *client_info = info; | 
| +  return true; | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| // Test fixture for GPU image comparison tests. | 
| @@ -156,15 +202,16 @@ | 
| #error "Not implemented for this platform" | 
| #endif | 
| if (using_gpu_) { | 
| -      const GPUInfo& info = GpuProcessHostUIShim::GetInstance()->gpu_info(); | 
| -      if (info.progress() != GPUInfo::kComplete) { | 
| +      GPUInfo info; | 
| +      if (!CollectGPUInfo(&info)) { | 
| LOG(ERROR) << "Could not get gpu info"; | 
| return false; | 
| } | 
| -      img_name = StringPrintf("%s_%s_%x-%x.png", | 
| +      img_name = base::StringPrintf("%s_%s_%04x-%04x.png", | 
| img_name.c_str(), os_label, info.vendor_id(), info.device_id()); | 
| } else { | 
| -      img_name = StringPrintf("%s_%s_mesa.png", img_name.c_str(), os_label); | 
| +      img_name = base::StringPrintf("%s_%s_mesa.png", | 
| +          img_name.c_str(), os_label); | 
| } | 
|  | 
| // Read the reference image and verify the images' dimensions are equal. | 
|  |