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

Side by Side Diff: services/ui/gpu/gpu_main.cc

Issue 2539893002: Mus: Implement GpuMain mojo interface (Closed)
Patch Set: Addressed Sadrul's comments Created 4 years 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 unified diff | Download patch
« no previous file with comments | « services/ui/gpu/gpu_main.h ('k') | services/ui/gpu/gpu_service_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "services/ui/gpu/gpu_main.h" 5 #include "services/ui/gpu/gpu_main.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "gpu/ipc/common/gpu_memory_buffer_support.h" 9 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
10 #include "gpu/ipc/gpu_in_process_thread_service.h"
10 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" 11 #include "gpu/ipc/service/gpu_memory_buffer_factory.h"
11 #include "gpu/ipc/service/gpu_watchdog_thread.h" 12 #include "gpu/ipc/service/gpu_watchdog_thread.h"
12 #include "services/ui/gpu/gpu_service_internal.h" 13 #include "services/ui/gpu/gpu_service_internal.h"
13 14
14 namespace { 15 namespace {
15 16
16 #if defined(OS_WIN) 17 #if defined(OS_WIN)
17 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() { 18 std::unique_ptr<base::MessagePump> CreateMessagePumpWin() {
18 base::MessagePumpForGpu::InitFactory(); 19 base::MessagePumpForGpu::InitFactory();
19 return base::MessageLoop::CreateMessagePumpForType( 20 return base::MessageLoop::CreateMessagePumpForType(
(...skipping 13 matching lines...) Expand all
33 #if defined(OS_MACOSX) 34 #if defined(OS_MACOSX)
34 std::unique_ptr<base::MessagePump> CreateMessagePumpMac() { 35 std::unique_ptr<base::MessagePump> CreateMessagePumpMac() {
35 return base::MakeUnique<base::MessagePumpCFRunLoop>(); 36 return base::MakeUnique<base::MessagePumpCFRunLoop>();
36 } 37 }
37 #endif // defined(OS_MACOSX) 38 #endif // defined(OS_MACOSX)
38 39
39 } // namespace 40 } // namespace
40 41
41 namespace ui { 42 namespace ui {
42 43
43 GpuMain::GpuMain() 44 GpuMain::GpuMain(mojom::GpuMainRequest request)
44 : gpu_thread_("GpuThread"), 45 : gpu_thread_("GpuThread"),
45 io_thread_("GpuIOThread"), 46 io_thread_("GpuIOThread"),
46 compositor_thread_("DisplayCompositorThread"), 47 compositor_thread_("DisplayCompositorThread"),
47 weak_factory_(this) { 48 binding_(this, std::move(request)) {
48 base::Thread::Options thread_options; 49 base::Thread::Options thread_options;
49 50
50 #if defined(OS_WIN) 51 #if defined(OS_WIN)
51 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpWin); 52 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpWin);
52 #elif defined(USE_X11) 53 #elif defined(USE_X11)
53 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpX11); 54 thread_options.message_pump_factory = base::Bind(&CreateMessagePumpX11);
54 #elif defined(USE_OZONE) 55 #elif defined(USE_OZONE)
55 thread_options.message_loop_type = base::MessageLoop::TYPE_UI; 56 thread_options.message_loop_type = base::MessageLoop::TYPE_UI;
56 #elif defined(OS_LINUX) 57 #elif defined(OS_LINUX)
57 thread_options.message_loop_type = base::MessageLoop::TYPE_DEFAULT; 58 thread_options.message_loop_type = base::MessageLoop::TYPE_DEFAULT;
(...skipping 21 matching lines...) Expand all
79 80
80 // Start the compositor thread. 81 // Start the compositor thread.
81 compositor_thread_.Start(); 82 compositor_thread_.Start();
82 } 83 }
83 84
84 GpuMain::~GpuMain() { 85 GpuMain::~GpuMain() {
85 // Unretained() is OK here since the thread/task runner is owned by |this|. 86 // Unretained() is OK here since the thread/task runner is owned by |this|.
86 compositor_thread_.task_runner()->PostTask( 87 compositor_thread_.task_runner()->PostTask(
87 FROM_HERE, 88 FROM_HERE,
88 base::Bind(&GpuMain::TearDownOnCompositorThread, base::Unretained(this))); 89 base::Bind(&GpuMain::TearDownOnCompositorThread, base::Unretained(this)));
90
89 // Block the main thread until the compositor thread terminates which blocks 91 // Block the main thread until the compositor thread terminates which blocks
90 // on the gpu thread. The Stop must be initiated from here instead of the gpu 92 // on the gpu thread. The Stop must be initiated from here instead of the gpu
91 // thread to avoid deadlock. 93 // thread to avoid deadlock.
92 compositor_thread_.Stop(); 94 compositor_thread_.Stop();
93 95
94 gpu_thread_.task_runner()->PostTask( 96 gpu_thread_.task_runner()->PostTask(
95 FROM_HERE, 97 FROM_HERE,
96 base::Bind(&GpuMain::TearDownOnGpuThread, base::Unretained(this))); 98 base::Bind(&GpuMain::TearDownOnGpuThread, base::Unretained(this)));
97 gpu_thread_.Stop(); 99 gpu_thread_.Stop();
98 io_thread_.Stop(); 100 io_thread_.Stop();
99 } 101 }
100 102
101 void GpuMain::OnStart() { 103 void GpuMain::OnStart() {
104 // |this| will outlive the gpu thread and so it's safe to use
105 // base::Unretained here.
102 gpu_thread_.task_runner()->PostTask( 106 gpu_thread_.task_runner()->PostTask(
103 FROM_HERE, 107 FROM_HERE,
104 base::Bind(&GpuMain::InitOnGpuThread, weak_factory_.GetWeakPtr(), 108 base::Bind(&GpuMain::InitOnGpuThread, base::Unretained(this),
105 io_thread_.task_runner(), compositor_thread_.task_runner())); 109 io_thread_.task_runner(), compositor_thread_.task_runner()));
106 } 110 }
107 111
108 void GpuMain::Create(mojom::GpuServiceInternalRequest request) { 112 void GpuMain::CreateGpuService(mojom::GpuServiceInternalRequest request,
113 const CreateGpuServiceCallback& callback) {
114 // |this| will outlive the gpu thread and so it's safe to use
115 // base::Unretained here.
109 gpu_thread_.task_runner()->PostTask( 116 gpu_thread_.task_runner()->PostTask(
110 FROM_HERE, 117 FROM_HERE,
111 base::Bind(&GpuMain::CreateOnGpuThread, weak_factory_.GetWeakPtr(), 118 base::Bind(&GpuMain::CreateGpuServiceOnGpuThread, base::Unretained(this),
112 base::Passed(std::move(request)))); 119 base::Passed(std::move(request)),
120 base::ThreadTaskRunnerHandle::Get(), callback));
121 }
122
123 void GpuMain::CreateDisplayCompositor(
124 cc::mojom::DisplayCompositorRequest request,
125 cc::mojom::DisplayCompositorClientPtr client) {
126 if (!gpu_service_internal_) {
127 pending_display_compositor_request_ = std::move(request);
128 pending_display_compositor_client_info_ = client.PassInterface();
129 return;
130 }
131 CreateDisplayCompositorInternal(std::move(request), client.PassInterface());
113 } 132 }
114 133
115 void GpuMain::InitOnGpuThread( 134 void GpuMain::InitOnGpuThread(
116 scoped_refptr<base::SingleThreadTaskRunner> io_runner, 135 scoped_refptr<base::SingleThreadTaskRunner> io_runner,
117 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { 136 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) {
118 gpu_init_.reset(new gpu::GpuInit()); 137 gpu_init_.reset(new gpu::GpuInit());
119 gpu_init_->set_sandbox_helper(this); 138 gpu_init_->set_sandbox_helper(this);
120 bool success = gpu_init_->InitializeAndStartSandbox( 139 bool success = gpu_init_->InitializeAndStartSandbox(
121 *base::CommandLine::ForCurrentProcess()); 140 *base::CommandLine::ForCurrentProcess());
122 if (success) { 141 if (!success)
123 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { 142 return;
124 gpu_memory_buffer_factory_ = 143
125 gpu::GpuMemoryBufferFactory::CreateNativeType(); 144 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) {
126 } 145 gpu_memory_buffer_factory_ =
127 gpu_service_internal_.reset(new GpuServiceInternal( 146 gpu::GpuMemoryBufferFactory::CreateNativeType();
128 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(),
129 gpu_memory_buffer_factory_.get(), io_runner, compositor_runner));
130 } 147 }
148
149 gpu_service_internal_ = base::MakeUnique<GpuServiceInternal>(
150 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(),
151 gpu_memory_buffer_factory_.get(), io_runner);
152 gpu_service_internal_->Initialize();
153 }
154
155 void GpuMain::CreateDisplayCompositorInternal(
156 cc::mojom::DisplayCompositorRequest request,
157 cc::mojom::DisplayCompositorClientPtrInfo client_info) {
158 DCHECK(!gpu_command_service_);
159 gpu_command_service_ = new gpu::GpuInProcessThreadService(
160 gpu_thread_.task_runner(), gpu_service_internal_->sync_point_manager(),
161 gpu_service_internal_->mailbox_manager(),
162 gpu_service_internal_->share_group());
163
164 // |gpu_memory_buffer_factory_| is null in tests.
165 gpu::ImageFactory* image_factory =
166 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory()
167 : nullptr;
168
169 mojom::GpuServiceInternalPtr gpu_service;
170 mojom::GpuServiceInternalRequest gpu_service_request =
171 mojo::GetProxy(&gpu_service);
172
173 CreateGpuService(std::move(gpu_service_request), CreateGpuServiceCallback());
174
175 compositor_thread_.task_runner()->PostTask(
176 FROM_HERE, base::Bind(&GpuMain::CreateDisplayCompositorOnCompositorThread,
177 base::Unretained(this), image_factory,
178 base::Passed(gpu_service.PassInterface()),
179 base::Passed(std::move(request)),
180 base::Passed(std::move(client_info))));
181 }
182
183 void GpuMain::CreateDisplayCompositorOnCompositorThread(
184 gpu::ImageFactory* image_factory,
185 mojom::GpuServiceInternalPtrInfo gpu_service_info,
186 cc::mojom::DisplayCompositorRequest request,
187 cc::mojom::DisplayCompositorClientPtrInfo client_info) {
188 DCHECK(!display_compositor_);
189 cc::mojom::DisplayCompositorClientPtr client;
190 client.Bind(std::move(client_info));
191
192 gpu_internal_.Bind(std::move(gpu_service_info));
193
194 display_compositor_ = base::MakeUnique<DisplayCompositor>(
195 gpu_command_service_, base::MakeUnique<MusGpuMemoryBufferManager>(
196 gpu_internal_.get(), 1 /* client_id */),
197 image_factory, std::move(request), std::move(client));
131 } 198 }
132 199
133 void GpuMain::TearDownOnCompositorThread() { 200 void GpuMain::TearDownOnCompositorThread() {
134 if (gpu_service_internal_) 201 display_compositor_.reset();
135 gpu_service_internal_->DestroyDisplayCompositor(); 202 gpu_internal_.reset();
136 } 203 }
137 204
138 void GpuMain::TearDownOnGpuThread() { 205 void GpuMain::TearDownOnGpuThread() {
139 gpu_service_internal_.reset(); 206 gpu_service_internal_.reset();
140 gpu_memory_buffer_factory_.reset(); 207 gpu_memory_buffer_factory_.reset();
141 gpu_init_.reset(); 208 gpu_init_.reset();
142 } 209 }
143 210
144 void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { 211 void GpuMain::CreateGpuServiceOnGpuThread(
145 if (gpu_service_internal_) 212 mojom::GpuServiceInternalRequest request,
146 gpu_service_internal_->Add(std::move(request)); 213 scoped_refptr<base::SingleThreadTaskRunner> origin_runner,
214 const CreateGpuServiceCallback& callback) {
215 gpu_service_internal_->Bind(std::move(request));
216
217 if (pending_display_compositor_request_.is_pending()) {
218 CreateDisplayCompositorInternal(
219 std::move(pending_display_compositor_request_),
220 std::move(pending_display_compositor_client_info_));
221 }
222
223 if (!callback.is_null()) {
224 origin_runner->PostTask(
225 FROM_HERE, base::Bind(callback, gpu_service_internal_->gpu_info()));
226 }
147 } 227 }
148 228
149 void GpuMain::PreSandboxStartup() { 229 void GpuMain::PreSandboxStartup() {
150 // TODO(sad): https://crbug.com/645602 230 // TODO(sad): https://crbug.com/645602
151 } 231 }
152 232
153 bool GpuMain::EnsureSandboxInitialized( 233 bool GpuMain::EnsureSandboxInitialized(
154 gpu::GpuWatchdogThread* watchdog_thread) { 234 gpu::GpuWatchdogThread* watchdog_thread) {
155 // TODO(sad): https://crbug.com/645602 235 // TODO(sad): https://crbug.com/645602
156 return true; 236 return true;
157 } 237 }
158 238
159 } // namespace ui 239 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/gpu/gpu_main.h ('k') | services/ui/gpu/gpu_service_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698