OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/gpu/browser_gpu_channel_host_factory.h" | 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/profiler/scoped_tracker.h" | 10 #include "base/profiler/scoped_tracker.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "ipc/ipc_channel_handle.h" | 29 #include "ipc/ipc_channel_handle.h" |
30 #include "ipc/message_filter.h" | 30 #include "ipc/message_filter.h" |
31 | 31 |
32 namespace content { | 32 namespace content { |
33 | 33 |
34 BrowserGpuChannelHostFactory* BrowserGpuChannelHostFactory::instance_ = NULL; | 34 BrowserGpuChannelHostFactory* BrowserGpuChannelHostFactory::instance_ = NULL; |
35 | 35 |
36 class BrowserGpuChannelHostFactory::EstablishRequest | 36 class BrowserGpuChannelHostFactory::EstablishRequest |
37 : public base::RefCountedThreadSafe<EstablishRequest> { | 37 : public base::RefCountedThreadSafe<EstablishRequest> { |
38 public: | 38 public: |
39 static scoped_refptr<EstablishRequest> Create(CauseForGpuLaunch cause, | 39 static scoped_refptr<EstablishRequest> Create(gpu::CauseForGpuLaunch cause, |
40 int gpu_client_id, | 40 int gpu_client_id, |
41 uint64_t gpu_client_tracing_id, | 41 uint64_t gpu_client_tracing_id, |
42 int gpu_host_id); | 42 int gpu_host_id); |
43 void Wait(); | 43 void Wait(); |
44 void Cancel(); | 44 void Cancel(); |
45 | 45 |
46 int gpu_host_id() { return gpu_host_id_; } | 46 int gpu_host_id() { return gpu_host_id_; } |
47 IPC::ChannelHandle& channel_handle() { return channel_handle_; } | 47 IPC::ChannelHandle& channel_handle() { return channel_handle_; } |
48 gpu::GPUInfo gpu_info() { return gpu_info_; } | 48 gpu::GPUInfo gpu_info() { return gpu_info_; } |
49 | 49 |
50 private: | 50 private: |
51 friend class base::RefCountedThreadSafe<EstablishRequest>; | 51 friend class base::RefCountedThreadSafe<EstablishRequest>; |
52 explicit EstablishRequest(CauseForGpuLaunch cause, | 52 explicit EstablishRequest(gpu::CauseForGpuLaunch cause, |
53 int gpu_client_id, | 53 int gpu_client_id, |
54 uint64_t gpu_client_tracing_id, | 54 uint64_t gpu_client_tracing_id, |
55 int gpu_host_id); | 55 int gpu_host_id); |
56 ~EstablishRequest() {} | 56 ~EstablishRequest() {} |
57 void EstablishOnIO(); | 57 void EstablishOnIO(); |
58 void OnEstablishedOnIO(const IPC::ChannelHandle& channel_handle, | 58 void OnEstablishedOnIO(const IPC::ChannelHandle& channel_handle, |
59 const gpu::GPUInfo& gpu_info); | 59 const gpu::GPUInfo& gpu_info); |
60 void FinishOnIO(); | 60 void FinishOnIO(); |
61 void FinishOnMain(); | 61 void FinishOnMain(); |
62 | 62 |
63 base::WaitableEvent event_; | 63 base::WaitableEvent event_; |
64 CauseForGpuLaunch cause_for_gpu_launch_; | 64 gpu::CauseForGpuLaunch cause_for_gpu_launch_; |
65 const int gpu_client_id_; | 65 const int gpu_client_id_; |
66 const uint64_t gpu_client_tracing_id_; | 66 const uint64_t gpu_client_tracing_id_; |
67 int gpu_host_id_; | 67 int gpu_host_id_; |
68 bool reused_gpu_process_; | 68 bool reused_gpu_process_; |
69 IPC::ChannelHandle channel_handle_; | 69 IPC::ChannelHandle channel_handle_; |
70 gpu::GPUInfo gpu_info_; | 70 gpu::GPUInfo gpu_info_; |
71 bool finished_; | 71 bool finished_; |
72 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; | 72 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
73 }; | 73 }; |
74 | 74 |
75 scoped_refptr<BrowserGpuChannelHostFactory::EstablishRequest> | 75 scoped_refptr<BrowserGpuChannelHostFactory::EstablishRequest> |
76 BrowserGpuChannelHostFactory::EstablishRequest::Create( | 76 BrowserGpuChannelHostFactory::EstablishRequest::Create( |
77 CauseForGpuLaunch cause, | 77 gpu::CauseForGpuLaunch cause, |
78 int gpu_client_id, | 78 int gpu_client_id, |
79 uint64_t gpu_client_tracing_id, | 79 uint64_t gpu_client_tracing_id, |
80 int gpu_host_id) { | 80 int gpu_host_id) { |
81 scoped_refptr<EstablishRequest> establish_request = new EstablishRequest( | 81 scoped_refptr<EstablishRequest> establish_request = new EstablishRequest( |
82 cause, gpu_client_id, gpu_client_tracing_id, gpu_host_id); | 82 cause, gpu_client_id, gpu_client_tracing_id, gpu_host_id); |
83 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | 83 scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
84 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | 84 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); |
85 // PostTask outside the constructor to ensure at least one reference exists. | 85 // PostTask outside the constructor to ensure at least one reference exists. |
86 task_runner->PostTask( | 86 task_runner->PostTask( |
87 FROM_HERE, | 87 FROM_HERE, |
88 base::Bind(&BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO, | 88 base::Bind(&BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO, |
89 establish_request)); | 89 establish_request)); |
90 return establish_request; | 90 return establish_request; |
91 } | 91 } |
92 | 92 |
93 BrowserGpuChannelHostFactory::EstablishRequest::EstablishRequest( | 93 BrowserGpuChannelHostFactory::EstablishRequest::EstablishRequest( |
94 CauseForGpuLaunch cause, | 94 gpu::CauseForGpuLaunch cause, |
95 int gpu_client_id, | 95 int gpu_client_id, |
96 uint64_t gpu_client_tracing_id, | 96 uint64_t gpu_client_tracing_id, |
97 int gpu_host_id) | 97 int gpu_host_id) |
98 : event_(false, false), | 98 : event_(false, false), |
99 cause_for_gpu_launch_(cause), | 99 cause_for_gpu_launch_(cause), |
100 gpu_client_id_(gpu_client_id), | 100 gpu_client_id_(gpu_client_id), |
101 gpu_client_tracing_id_(gpu_client_tracing_id), | 101 gpu_client_tracing_id_(gpu_client_tracing_id), |
102 gpu_host_id_(gpu_host_id), | 102 gpu_host_id_(gpu_host_id), |
103 reused_gpu_process_(false), | 103 reused_gpu_process_(false), |
104 finished_(false), | 104 finished_(false), |
105 main_task_runner_(base::ThreadTaskRunnerHandle::Get()) { | 105 main_task_runner_(base::ThreadTaskRunnerHandle::Get()) {} |
106 } | |
107 | 106 |
108 void BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO() { | 107 void BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO() { |
109 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. | 108 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. |
110 tracked_objects::ScopedTracker tracking_profile( | 109 tracked_objects::ScopedTracker tracking_profile( |
111 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 110 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
112 "477117 " | 111 "477117 " |
113 "BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO")); | 112 "BrowserGpuChannelHostFactory::EstablishRequest::EstablishOnIO")); |
114 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); | 113 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
115 if (!host) { | 114 if (!host) { |
116 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, | 115 host = GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 } | 204 } |
206 | 205 |
207 bool BrowserGpuChannelHostFactory::CanUseForTesting() { | 206 bool BrowserGpuChannelHostFactory::CanUseForTesting() { |
208 return GpuDataManager::GetInstance()->GpuAccessAllowed(NULL); | 207 return GpuDataManager::GetInstance()->GpuAccessAllowed(NULL); |
209 } | 208 } |
210 | 209 |
211 void BrowserGpuChannelHostFactory::Initialize(bool establish_gpu_channel) { | 210 void BrowserGpuChannelHostFactory::Initialize(bool establish_gpu_channel) { |
212 DCHECK(!instance_); | 211 DCHECK(!instance_); |
213 instance_ = new BrowserGpuChannelHostFactory(); | 212 instance_ = new BrowserGpuChannelHostFactory(); |
214 if (establish_gpu_channel) { | 213 if (establish_gpu_channel) { |
215 instance_->EstablishGpuChannel(CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP, | 214 instance_->EstablishGpuChannel(gpu::CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP, |
216 base::Closure()); | 215 base::Closure()); |
217 } | 216 } |
218 } | 217 } |
219 | 218 |
220 void BrowserGpuChannelHostFactory::Terminate() { | 219 void BrowserGpuChannelHostFactory::Terminate() { |
221 DCHECK(instance_); | 220 DCHECK(instance_); |
222 delete instance_; | 221 delete instance_; |
223 instance_ = NULL; | 222 instance_ = NULL; |
224 } | 223 } |
225 | 224 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 if (!shm->CreateAnonymous(size)) | 273 if (!shm->CreateAnonymous(size)) |
275 return scoped_ptr<base::SharedMemory>(); | 274 return scoped_ptr<base::SharedMemory>(); |
276 return shm; | 275 return shm; |
277 } | 276 } |
278 | 277 |
279 // Blocking the UI thread to open a GPU channel is not supported on Android. | 278 // Blocking the UI thread to open a GPU channel is not supported on Android. |
280 // (Opening the initial channel to a child process involves handling a reply | 279 // (Opening the initial channel to a child process involves handling a reply |
281 // task on the UI thread first, so we cannot block here.) | 280 // task on the UI thread first, so we cannot block here.) |
282 #if !defined(OS_ANDROID) | 281 #if !defined(OS_ANDROID) |
283 GpuChannelHost* BrowserGpuChannelHostFactory::EstablishGpuChannelSync( | 282 GpuChannelHost* BrowserGpuChannelHostFactory::EstablishGpuChannelSync( |
284 CauseForGpuLaunch cause_for_gpu_launch) { | 283 gpu::CauseForGpuLaunch cause_for_gpu_launch) { |
285 EstablishGpuChannel(cause_for_gpu_launch, base::Closure()); | 284 EstablishGpuChannel(cause_for_gpu_launch, base::Closure()); |
286 | 285 |
287 if (pending_request_.get()) | 286 if (pending_request_.get()) |
288 pending_request_->Wait(); | 287 pending_request_->Wait(); |
289 | 288 |
290 return gpu_channel_.get(); | 289 return gpu_channel_.get(); |
291 } | 290 } |
292 #endif | 291 #endif |
293 | 292 |
294 void BrowserGpuChannelHostFactory::EstablishGpuChannel( | 293 void BrowserGpuChannelHostFactory::EstablishGpuChannel( |
295 CauseForGpuLaunch cause_for_gpu_launch, | 294 gpu::CauseForGpuLaunch cause_for_gpu_launch, |
296 const base::Closure& callback) { | 295 const base::Closure& callback) { |
297 if (gpu_channel_.get() && gpu_channel_->IsLost()) { | 296 if (gpu_channel_.get() && gpu_channel_->IsLost()) { |
298 DCHECK(!pending_request_.get()); | 297 DCHECK(!pending_request_.get()); |
299 // Recreate the channel if it has been lost. | 298 // Recreate the channel if it has been lost. |
300 gpu_channel_->DestroyChannel(); | 299 gpu_channel_->DestroyChannel(); |
301 gpu_channel_ = NULL; | 300 gpu_channel_ = NULL; |
302 } | 301 } |
303 | 302 |
304 if (!gpu_channel_.get() && !pending_request_.get()) { | 303 if (!gpu_channel_.get() && !pending_request_.get()) { |
305 // We should only get here if the context was lost. | 304 // We should only get here if the context was lost. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } | 367 } |
369 | 368 |
370 // static | 369 // static |
371 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO( | 370 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO( |
372 int gpu_client_id, | 371 int gpu_client_id, |
373 const base::FilePath& cache_dir) { | 372 const base::FilePath& cache_dir) { |
374 ShaderCacheFactory::GetInstance()->SetCacheInfo(gpu_client_id, cache_dir); | 373 ShaderCacheFactory::GetInstance()->SetCacheInfo(gpu_client_id, cache_dir); |
375 } | 374 } |
376 | 375 |
377 } // namespace content | 376 } // namespace content |
OLD | NEW |