Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3563)

Unified Diff: chrome/browser/gpu_process_host.cc

Issue 6189008: GPU service respects --single-process (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/gpu/gpu_channel.h » ('j') | chrome/gpu/gpu_channel.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/gpu_process_host.cc
===================================================================
--- chrome/browser/gpu_process_host.cc (revision 71128)
+++ chrome/browser/gpu_process_host.cc (working copy)
@@ -22,6 +22,7 @@
#include "chrome/common/gpu_info.h"
#include "chrome/common/gpu_messages.h"
#include "chrome/common/render_messages.h"
+#include "chrome/gpu/gpu_thread.h"
#include "grit/browser_resources.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_switches.h"
@@ -83,6 +84,35 @@
}
} // anonymous namespace
+class GpuMainThread : public base::Thread {
+ public:
+ explicit GpuMainThread(const std::string& channel_id)
+ : base::Thread("CrGpuMain"),
+ channel_id_(channel_id) {
+ }
+
+ ~GpuMainThread() {
+ Stop();
+ }
+
+ protected:
+ virtual void Init() {
+ // Must be created on GPU thread.
+ gpu_thread_.reset(new GpuThread(channel_id_));
+ gpu_thread_->Init(base::Time::Now());
+ }
+
+ virtual void CleanUp() {
+ // Must be destroyed on GPU thread.
+ gpu_thread_.reset();
+ }
+
+ private:
+ scoped_ptr<GpuThread> gpu_thread_;
+ std::string channel_id_;
+ DISALLOW_COPY_AND_ASSIGN(GpuMainThread);
+};
+
GpuProcessHost::GpuProcessHost()
: BrowserChildProcessHost(GPU_PROCESS, NULL),
initialized_(false),
@@ -543,48 +573,61 @@
bool GpuProcessHost::LaunchGpuProcess() {
const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
- CommandLine::StringType gpu_launcher =
- browser_command_line.GetSwitchValueNative(switches::kGpuLauncher);
- FilePath exe_path = ChildProcessHost::GetChildPath(gpu_launcher.empty());
- if (exe_path.empty())
- return false;
+ // If the single-process switch is present, just launch the GPU service in a
+ // new thread in the browser process.
+ if (browser_command_line.HasSwitch(switches::kSingleProcess)) {
+ GpuMainThread* thread = new GpuMainThread(channel_id());
- CommandLine* cmd_line = new CommandLine(exe_path);
- cmd_line->AppendSwitchASCII(switches::kProcessType, switches::kGpuProcess);
- cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
+ base::Thread::Options options;
+ options.message_loop_type = MessageLoop::TYPE_UI;
- // Propagate relevant command line switches.
- static const char* const kSwitchNames[] = {
- switches::kUseGL,
- switches::kDisableGpuVsync,
- switches::kDisableGpuWatchdog,
- switches::kDisableLogging,
- switches::kEnableAcceleratedDecoding,
- switches::kEnableLogging,
-#if defined(OS_MACOSX)
- switches::kEnableSandboxLogging,
-#endif
- switches::kGpuStartupDialog,
- switches::kLoggingLevel,
- switches::kNoGpuSandbox,
- switches::kNoSandbox,
- };
- cmd_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
- arraysize(kSwitchNames));
+ if (!thread->StartWithOptions(options))
+ return false;
+ } else {
+ CommandLine::StringType gpu_launcher =
+ browser_command_line.GetSwitchValueNative(switches::kGpuLauncher);
- // If specified, prepend a launcher program to the command line.
- if (!gpu_launcher.empty())
- cmd_line->PrependWrapper(gpu_launcher);
+ FilePath exe_path = ChildProcessHost::GetChildPath(gpu_launcher.empty());
+ if (exe_path.empty())
+ return false;
- Launch(
+ CommandLine* cmd_line = new CommandLine(exe_path);
+ cmd_line->AppendSwitchASCII(switches::kProcessType, switches::kGpuProcess);
+ cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
+
+ // Propagate relevant command line switches.
+ static const char* const kSwitchNames[] = {
+ switches::kUseGL,
+ switches::kDisableGpuVsync,
+ switches::kDisableGpuWatchdog,
+ switches::kDisableLogging,
+ switches::kEnableAcceleratedDecoding,
+ switches::kEnableLogging,
+ #if defined(OS_MACOSX)
+ switches::kEnableSandboxLogging,
+ #endif
+ switches::kGpuStartupDialog,
+ switches::kLoggingLevel,
+ switches::kNoGpuSandbox,
+ switches::kNoSandbox,
+ };
+ cmd_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
+ arraysize(kSwitchNames));
+
+ // If specified, prepend a launcher program to the command line.
+ if (!gpu_launcher.empty())
+ cmd_line->PrependWrapper(gpu_launcher);
+
+ Launch(
#if defined(OS_WIN)
- FilePath(),
+ FilePath(),
#elif defined(OS_POSIX)
- false, // Never use the zygote (GPU plugin can't be sandboxed).
- base::environment_vector(),
+ false, // Never use the zygote (GPU plugin can't be sandboxed).
+ base::environment_vector(),
#endif
- cmd_line);
+ cmd_line);
+ }
UMA_HISTOGRAM_ENUMERATION("GPU.GPUProcessLifetimeEvents",
LAUNCED, GPU_PROCESS_LIFETIME_EVENT_MAX);
« no previous file with comments | « no previous file | chrome/gpu/gpu_channel.h » ('j') | chrome/gpu/gpu_channel.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698