Index: content/gpu/gpu_main.cc |
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc |
index 894c64894399a994b09acb031c1897c3249897e5..1f68ee508aec77df54a8e28ccdc1b748f281907c 100644 |
--- a/content/gpu/gpu_main.cc |
+++ b/content/gpu/gpu_main.cc |
@@ -66,8 +66,18 @@ namespace content { |
namespace { |
+void GetGpuInfoFromCommandLine(gpu::GPUInfo& gpu_info, |
+ const CommandLine& command_line); |
bool WarmUpSandbox(const CommandLine& command_line); |
+ |
+#if !defined(OS_MACOSX) |
+bool CollectGraphicsInfo(gpu::GPUInfo& gpu_info); |
+#endif |
+ |
#if defined(OS_LINUX) |
+#if !defined(OS_CHROMEOS) |
+bool CanAccessNvidiaDeviceFile(); |
+#endif |
bool StartSandboxLinux(const gpu::GPUInfo&, GpuWatchdogThread*, bool); |
#elif defined(OS_WIN) |
bool StartSandboxWindows(const sandbox::SandboxInterfaceInfo*); |
@@ -201,22 +211,7 @@ int GpuMain(const MainFunctionParams& parameters) { |
gpu::GPUInfo gpu_info; |
// Get vendor_id, device_id, driver_version from browser process through |
// commandline switches. |
- DCHECK(command_line.HasSwitch(switches::kGpuVendorID) && |
- command_line.HasSwitch(switches::kGpuDeviceID) && |
- command_line.HasSwitch(switches::kGpuDriverVersion)); |
- bool success = base::HexStringToUInt( |
- command_line.GetSwitchValueASCII(switches::kGpuVendorID), |
- &gpu_info.gpu.vendor_id); |
- DCHECK(success); |
- success = base::HexStringToUInt( |
- command_line.GetSwitchValueASCII(switches::kGpuDeviceID), |
- &gpu_info.gpu.device_id); |
- DCHECK(success); |
- gpu_info.driver_vendor = |
- command_line.GetSwitchValueASCII(switches::kGpuDriverVendor); |
- gpu_info.driver_version = |
- command_line.GetSwitchValueASCII(switches::kGpuDriverVersion); |
- GetContentClient()->SetGpuInfo(gpu_info); |
+ GetGpuInfoFromCommandLine(gpu_info, command_line); |
base::TimeDelta collect_context_time; |
base::TimeDelta initialize_one_off_time; |
@@ -273,20 +268,8 @@ int GpuMain(const MainFunctionParams& parameters) { |
base::TimeTicks before_collect_context_graphics_info = |
base::TimeTicks::Now(); |
#if !defined(OS_MACOSX) |
- gpu::CollectInfoResult result = |
- gpu::CollectContextGraphicsInfo(&gpu_info); |
- switch (result) { |
- case gpu::kCollectInfoFatalFailure: |
- LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal)."; |
- dead_on_arrival = true; |
- break; |
- case gpu::kCollectInfoNonFatalFailure: |
- VLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal)."; |
- break; |
- case gpu::kCollectInfoSuccess: |
- break; |
- } |
- GetContentClient()->SetGpuInfo(gpu_info); |
+ if (!CollectGraphicsInfo(gpu_info)) |
+ dead_on_arrival = true; |
#if defined(OS_CHROMEOS) || defined(OS_ANDROID) |
// Recompute gpu driver bug workarounds - this is specifically useful |
@@ -301,19 +284,15 @@ int GpuMain(const MainFunctionParams& parameters) { |
initialized_gl_context = true; |
#if !defined(OS_CHROMEOS) |
if (gpu_info.gpu.vendor_id == 0x10de && // NVIDIA |
- gpu_info.driver_vendor == "NVIDIA") { |
- base::ThreadRestrictions::AssertIOAllowed(); |
- if (access("/dev/nvidiactl", R_OK) != 0) { |
- VLOG(1) << "NVIDIA device file /dev/nvidiactl access denied"; |
- dead_on_arrival = true; |
- } |
- } |
+ gpu_info.driver_vendor == "NVIDIA" && |
+ !CanAccessNvidiaDeviceFile()) |
+ dead_on_arrival = true; |
#endif // !defined(OS_CHROMEOS) |
#endif // defined(OS_LINUX) |
#endif // !defined(OS_MACOSX) |
collect_context_time = |
base::TimeTicks::Now() - before_collect_context_graphics_info; |
- } else { |
+ } else { // gl_initialized |
VLOG(1) << "gfx::GLSurface::InitializeOneOff failed"; |
dead_on_arrival = true; |
} |
@@ -384,7 +363,69 @@ int GpuMain(const MainFunctionParams& parameters) { |
namespace { |
+void GetGpuInfoFromCommandLine(gpu::GPUInfo& gpu_info, |
+ const CommandLine& command_line) { |
+ DCHECK(command_line.HasSwitch(switches::kGpuVendorID) && |
+ command_line.HasSwitch(switches::kGpuDeviceID) && |
+ command_line.HasSwitch(switches::kGpuDriverVersion)); |
+ bool success = base::HexStringToUInt( |
+ command_line.GetSwitchValueASCII(switches::kGpuVendorID), |
+ &gpu_info.gpu.vendor_id); |
+ DCHECK(success); |
+ success = base::HexStringToUInt( |
+ command_line.GetSwitchValueASCII(switches::kGpuDeviceID), |
+ &gpu_info.gpu.device_id); |
+ DCHECK(success); |
+ gpu_info.driver_vendor = |
+ command_line.GetSwitchValueASCII(switches::kGpuDriverVendor); |
+ gpu_info.driver_version = |
+ command_line.GetSwitchValueASCII(switches::kGpuDriverVersion); |
+ GetContentClient()->SetGpuInfo(gpu_info); |
+} |
+ |
+bool WarmUpSandbox(const CommandLine& command_line) { |
+ { |
+ TRACE_EVENT0("gpu", "Warm up rand"); |
+ // Warm up the random subsystem, which needs to be done pre-sandbox on all |
+ // platforms. |
+ (void) base::RandUint64(); |
+ } |
+ return true; |
+} |
+ |
+#if !defined(OS_MACOSX) |
+bool CollectGraphicsInfo(gpu::GPUInfo& gpu_info) { |
+ bool res = true; |
+ gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info); |
+ switch (result) { |
+ case gpu::kCollectInfoFatalFailure: |
+ LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal)."; |
+ res = false; |
+ break; |
+ case gpu::kCollectInfoNonFatalFailure: |
+ VLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal)."; |
+ break; |
+ case gpu::kCollectInfoSuccess: |
+ break; |
+ } |
+ GetContentClient()->SetGpuInfo(gpu_info); |
+ return res; |
+} |
+#endif |
+ |
#if defined(OS_LINUX) |
+#if !defined(OS_CHROMEOS) |
+bool CanAccessNvidiaDeviceFile() { |
+ bool res = true; |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ if (access("/dev/nvidiactl", R_OK) != 0) { |
+ VLOG(1) << "NVIDIA device file /dev/nvidiactl access denied"; |
+ res = false; |
+ } |
+ return res; |
+} |
+#endif |
+ |
void CreateDummyGlContext() { |
scoped_refptr<gfx::GLSurface> surface( |
gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size())); |
@@ -409,19 +450,7 @@ void CreateDummyGlContext() { |
VLOG(1) << "gfx::GLContext::MakeCurrent failed"; |
} |
} |
-#endif |
-bool WarmUpSandbox(const CommandLine& command_line) { |
- { |
- TRACE_EVENT0("gpu", "Warm up rand"); |
- // Warm up the random subsystem, which needs to be done pre-sandbox on all |
- // platforms. |
- (void) base::RandUint64(); |
- } |
- return true; |
-} |
- |
-#if defined(OS_LINUX) |
void WarmUpSandboxNvidia(const gpu::GPUInfo& gpu_info, |
bool should_initialize_gl_context) { |
// We special case Optimus since the vendor_id we see may not be Nvidia. |