OLD | NEW |
---|---|
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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
105 io_thread_.task_runner(), compositor_thread_.task_runner())); | 106 io_thread_.task_runner(), compositor_thread_.task_runner())); |
106 } | 107 } |
107 | 108 |
108 void GpuMain::Create(mojom::GpuServiceInternalRequest request) { | 109 void GpuMain::Create(mojom::GpuServiceInternalRequest request) { |
109 gpu_thread_.task_runner()->PostTask( | 110 gpu_thread_.task_runner()->PostTask( |
110 FROM_HERE, | 111 FROM_HERE, |
111 base::Bind(&GpuMain::CreateOnGpuThread, weak_factory_.GetWeakPtr(), | 112 base::Bind(&GpuMain::CreateOnGpuThread, weak_factory_.GetWeakPtr(), |
112 base::Passed(std::move(request)))); | 113 base::Passed(std::move(request)))); |
113 } | 114 } |
114 | 115 |
116 void GpuMain::Create(cc::mojom::DisplayCompositorFactoryRequest request) { | |
117 // TODO(fsamuel): This must be called AFTER GpuServiceInternal has been | |
118 // initialized. | |
sadrul
2016/11/29 19:46:41
DCHECK()?
Fady Samuel
2016/11/29 20:08:58
GpuMain doesn't know about GpuServiceInternal::Ini
| |
119 gpu_command_service_ = new gpu::GpuInProcessThreadService( | |
120 gpu_thread_.task_runner(), gpu_service_internal_->sync_point_manager(), | |
121 gpu_service_internal_->mailbox_manager(), | |
122 gpu_service_internal_->share_group()); | |
123 | |
124 // |gpu_memory_buffer_factory_| is null in tests. | |
125 gpu::ImageFactory* image_factory = | |
126 gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() | |
127 : nullptr; | |
128 | |
129 compositor_thread_.task_runner()->PostTask( | |
130 FROM_HERE, | |
131 base::Bind(&GpuMain::InitOnCompositorThread, base::Unretained(this), | |
132 image_factory, compositor_thread_.task_runner(), | |
133 base::Passed(std::move(request)))); | |
134 } | |
135 | |
115 void GpuMain::InitOnGpuThread( | 136 void GpuMain::InitOnGpuThread( |
116 scoped_refptr<base::SingleThreadTaskRunner> io_runner, | 137 scoped_refptr<base::SingleThreadTaskRunner> io_runner, |
117 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { | 138 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner) { |
118 gpu_init_.reset(new gpu::GpuInit()); | 139 gpu_init_.reset(new gpu::GpuInit()); |
119 gpu_init_->set_sandbox_helper(this); | 140 gpu_init_->set_sandbox_helper(this); |
120 bool success = gpu_init_->InitializeAndStartSandbox( | 141 bool success = gpu_init_->InitializeAndStartSandbox( |
121 *base::CommandLine::ForCurrentProcess()); | 142 *base::CommandLine::ForCurrentProcess()); |
122 if (success) { | 143 if (!success) |
123 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { | 144 return; |
124 gpu_memory_buffer_factory_ = | 145 |
125 gpu::GpuMemoryBufferFactory::CreateNativeType(); | 146 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { |
126 } | 147 gpu_memory_buffer_factory_ = |
127 gpu_service_internal_.reset(new GpuServiceInternal( | 148 gpu::GpuMemoryBufferFactory::CreateNativeType(); |
128 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | |
129 gpu_memory_buffer_factory_.get(), io_runner, compositor_runner)); | |
130 } | 149 } |
150 | |
151 gpu_service_internal_ = base::MakeUnique<GpuServiceInternal>( | |
152 gpu_init_->gpu_info(), gpu_init_->TakeWatchdogThread(), | |
153 gpu_memory_buffer_factory_.get(), io_runner); | |
154 } | |
155 | |
156 void GpuMain::InitOnCompositorThread( | |
157 gpu::ImageFactory* image_factory, | |
158 scoped_refptr<base::SingleThreadTaskRunner> compositor_runner, | |
159 cc::mojom::DisplayCompositorFactoryRequest request) { | |
160 DCHECK(!display_compositor_factory_); | |
161 display_compositor_factory_ = base::MakeUnique<DisplayCompositorFactory>( | |
162 this, gpu_command_service_, compositor_runner, image_factory, | |
163 std::move(request)); | |
131 } | 164 } |
132 | 165 |
133 void GpuMain::TearDownOnCompositorThread() { | 166 void GpuMain::TearDownOnCompositorThread() { |
134 if (gpu_service_internal_) | 167 display_compositor_factory_.reset(); |
135 gpu_service_internal_->DestroyDisplayCompositor(); | |
136 } | 168 } |
137 | 169 |
138 void GpuMain::TearDownOnGpuThread() { | 170 void GpuMain::TearDownOnGpuThread() { |
139 gpu_service_internal_.reset(); | 171 gpu_service_internal_.reset(); |
140 gpu_memory_buffer_factory_.reset(); | 172 gpu_memory_buffer_factory_.reset(); |
141 gpu_init_.reset(); | 173 gpu_init_.reset(); |
142 } | 174 } |
143 | 175 |
144 void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { | 176 void GpuMain::CreateOnGpuThread(mojom::GpuServiceInternalRequest request) { |
145 if (gpu_service_internal_) | 177 if (gpu_service_internal_) |
146 gpu_service_internal_->Add(std::move(request)); | 178 gpu_service_internal_->Bind(std::move(request)); |
147 } | 179 } |
148 | 180 |
149 void GpuMain::PreSandboxStartup() { | 181 void GpuMain::PreSandboxStartup() { |
150 // TODO(sad): https://crbug.com/645602 | 182 // TODO(sad): https://crbug.com/645602 |
151 } | 183 } |
152 | 184 |
153 bool GpuMain::EnsureSandboxInitialized( | 185 bool GpuMain::EnsureSandboxInitialized( |
154 gpu::GpuWatchdogThread* watchdog_thread) { | 186 gpu::GpuWatchdogThread* watchdog_thread) { |
155 // TODO(sad): https://crbug.com/645602 | 187 // TODO(sad): https://crbug.com/645602 |
156 return true; | 188 return true; |
157 } | 189 } |
158 | 190 |
191 std::unique_ptr<gpu::GpuMemoryBufferManager> | |
192 GpuMain::CreateGpuMemoryBufferManager() { | |
193 if (!gpu_service_internal_) | |
194 return nullptr; | |
195 | |
196 if (!gpu_internal_) { | |
197 mojom::GpuServiceInternalRequest gpu_service_request = | |
198 mojo::GetProxy(&gpu_internal_); | |
199 | |
200 Create(std::move(gpu_service_request)); | |
201 } | |
202 | |
203 return base::MakeUnique<MusGpuMemoryBufferManager>(gpu_internal_.get(), | |
204 1 /* client_id */); | |
205 } | |
206 | |
159 } // namespace ui | 207 } // namespace ui |
OLD | NEW |