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

Side by Side Diff: content/browser/gpu/browser_gpu_channel_host_factory.cc

Issue 2197613003: gpu: Introduce GpuChannelEstablishFactory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 4 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 unified diff | Download patch
OLDNEW
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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 210
211 bool BrowserGpuChannelHostFactory::CanUseForTesting() { 211 bool BrowserGpuChannelHostFactory::CanUseForTesting() {
212 return GpuDataManager::GetInstance()->GpuAccessAllowed(NULL); 212 return GpuDataManager::GetInstance()->GpuAccessAllowed(NULL);
213 } 213 }
214 214
215 void BrowserGpuChannelHostFactory::Initialize(bool establish_gpu_channel) { 215 void BrowserGpuChannelHostFactory::Initialize(bool establish_gpu_channel) {
216 DCHECK(!instance_); 216 DCHECK(!instance_);
217 instance_ = new BrowserGpuChannelHostFactory(); 217 instance_ = new BrowserGpuChannelHostFactory();
218 if (establish_gpu_channel) { 218 if (establish_gpu_channel) {
219 instance_->EstablishGpuChannel(CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP, 219 instance_->EstablishGpuChannel(CAUSE_FOR_GPU_LAUNCH_BROWSER_STARTUP,
220 base::Closure()); 220 gpu::GpuChannelEstablishedCallback());
221 } 221 }
222 } 222 }
223 223
224 void BrowserGpuChannelHostFactory::Terminate() { 224 void BrowserGpuChannelHostFactory::Terminate() {
225 DCHECK(instance_); 225 DCHECK(instance_);
226 delete instance_; 226 delete instance_;
227 instance_ = NULL; 227 instance_ = NULL;
228 } 228 }
229 229
230 BrowserGpuChannelHostFactory::BrowserGpuChannelHostFactory() 230 BrowserGpuChannelHostFactory::BrowserGpuChannelHostFactory()
(...skipping 19 matching lines...) Expand all
250 gpu_client_id_, cache_dir)); 250 gpu_client_id_, cache_dir));
251 } 251 }
252 } 252 }
253 } 253 }
254 254
255 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() { 255 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() {
256 DCHECK(IsMainThread()); 256 DCHECK(IsMainThread());
257 if (pending_request_.get()) 257 if (pending_request_.get())
258 pending_request_->Cancel(); 258 pending_request_->Cancel();
259 for (size_t n = 0; n < established_callbacks_.size(); n++) 259 for (size_t n = 0; n < established_callbacks_.size(); n++)
260 established_callbacks_[n].Run(); 260 established_callbacks_[n].Run(nullptr);
261 shutdown_event_->Signal(); 261 shutdown_event_->Signal();
262 if (gpu_channel_) { 262 if (gpu_channel_) {
263 gpu_channel_->DestroyChannel(); 263 gpu_channel_->DestroyChannel();
264 gpu_channel_ = NULL; 264 gpu_channel_ = NULL;
265 } 265 }
266 } 266 }
267 267
268 bool BrowserGpuChannelHostFactory::IsMainThread() { 268 bool BrowserGpuChannelHostFactory::IsMainThread() {
269 return BrowserThread::CurrentlyOn(BrowserThread::UI); 269 return BrowserThread::CurrentlyOn(BrowserThread::UI);
270 } 270 }
(...skipping 11 matching lines...) Expand all
282 return shm; 282 return shm;
283 } 283 }
284 284
285 // Blocking the UI thread to open a GPU channel is not supported on Android. 285 // Blocking the UI thread to open a GPU channel is not supported on Android.
286 // (Opening the initial channel to a child process involves handling a reply 286 // (Opening the initial channel to a child process involves handling a reply
287 // task on the UI thread first, so we cannot block here.) 287 // task on the UI thread first, so we cannot block here.)
288 #if !defined(OS_ANDROID) 288 #if !defined(OS_ANDROID)
289 scoped_refptr<gpu::GpuChannelHost> 289 scoped_refptr<gpu::GpuChannelHost>
290 BrowserGpuChannelHostFactory::EstablishGpuChannelSync( 290 BrowserGpuChannelHostFactory::EstablishGpuChannelSync(
291 CauseForGpuLaunch cause_for_gpu_launch) { 291 CauseForGpuLaunch cause_for_gpu_launch) {
292 EstablishGpuChannel(cause_for_gpu_launch, base::Closure()); 292 EstablishGpuChannel(cause_for_gpu_launch,
293 gpu::GpuChannelEstablishedCallback());
293 294
294 if (pending_request_.get()) 295 if (pending_request_.get())
295 pending_request_->Wait(); 296 pending_request_->Wait();
296 297
297 return gpu_channel_; 298 return gpu_channel_;
298 } 299 }
299 #endif 300 #endif
300 301
301 void BrowserGpuChannelHostFactory::EstablishGpuChannel( 302 void BrowserGpuChannelHostFactory::EstablishGpuChannel(
302 CauseForGpuLaunch cause_for_gpu_launch, 303 CauseForGpuLaunch cause_for_gpu_launch,
303 const base::Closure& callback) { 304 const gpu::GpuChannelEstablishedCallback& callback) {
304 #if defined(MOJO_RUNNER_CLIENT) 305 #if defined(MOJO_RUNNER_CLIENT)
305 DCHECK(!shell::ShellIsRemote()); 306 DCHECK(!shell::ShellIsRemote());
306 #endif 307 #endif
307 if (gpu_channel_.get() && gpu_channel_->IsLost()) { 308 if (gpu_channel_.get() && gpu_channel_->IsLost()) {
308 DCHECK(!pending_request_.get()); 309 DCHECK(!pending_request_.get());
309 // Recreate the channel if it has been lost. 310 // Recreate the channel if it has been lost.
310 gpu_channel_->DestroyChannel(); 311 gpu_channel_->DestroyChannel();
311 gpu_channel_ = NULL; 312 gpu_channel_ = NULL;
312 } 313 }
313 314
314 if (!gpu_channel_.get() && !pending_request_.get()) { 315 if (!gpu_channel_.get() && !pending_request_.get()) {
315 // We should only get here if the context was lost. 316 // We should only get here if the context was lost.
316 pending_request_ = EstablishRequest::Create( 317 pending_request_ = EstablishRequest::Create(
317 cause_for_gpu_launch, gpu_client_id_, 318 cause_for_gpu_launch, gpu_client_id_,
318 gpu_client_tracing_id_, 319 gpu_client_tracing_id_,
319 gpu_host_id_); 320 gpu_host_id_);
320 } 321 }
321 322
322 if (!callback.is_null()) { 323 if (!callback.is_null()) {
323 if (gpu_channel_.get()) 324 if (gpu_channel_.get())
324 callback.Run(); 325 callback.Run(gpu_channel_);
325 else 326 else
326 established_callbacks_.push_back(callback); 327 established_callbacks_.push_back(callback);
327 } 328 }
328 } 329 }
329 330
330 gpu::GpuChannelHost* BrowserGpuChannelHostFactory::GetGpuChannel() { 331 gpu::GpuChannelHost* BrowserGpuChannelHostFactory::GetGpuChannel() {
331 if (gpu_channel_.get() && !gpu_channel_->IsLost()) 332 if (gpu_channel_.get() && !gpu_channel_->IsLost())
332 return gpu_channel_.get(); 333 return gpu_channel_.get();
333 334
334 return NULL; 335 return NULL;
(...skipping 19 matching lines...) Expand all
354 gpu_host_id_ = pending_request_->gpu_host_id(); 355 gpu_host_id_ = pending_request_->gpu_host_id();
355 pending_request_ = NULL; 356 pending_request_ = NULL;
356 357
357 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/466866 is 358 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/466866 is
358 // fixed. 359 // fixed.
359 tracked_objects::ScopedTracker tracking_profile2( 360 tracked_objects::ScopedTracker tracking_profile2(
360 FROM_HERE_WITH_EXPLICIT_FUNCTION( 361 FROM_HERE_WITH_EXPLICIT_FUNCTION(
361 "466866 BrowserGpuChannelHostFactory::GpuChannelEstablished2")); 362 "466866 BrowserGpuChannelHostFactory::GpuChannelEstablished2"));
362 363
363 for (size_t n = 0; n < established_callbacks_.size(); n++) 364 for (size_t n = 0; n < established_callbacks_.size(); n++)
364 established_callbacks_[n].Run(); 365 established_callbacks_[n].Run(gpu_channel_);
365 366
366 established_callbacks_.clear(); 367 established_callbacks_.clear();
367 } 368 }
368 369
369 // static 370 // static
370 void BrowserGpuChannelHostFactory::AddFilterOnIO( 371 void BrowserGpuChannelHostFactory::AddFilterOnIO(
371 int host_id, 372 int host_id,
372 scoped_refptr<IPC::MessageFilter> filter) { 373 scoped_refptr<IPC::MessageFilter> filter) {
373 DCHECK_CURRENTLY_ON(BrowserThread::IO); 374 DCHECK_CURRENTLY_ON(BrowserThread::IO);
374 375
375 GpuProcessHost* host = GpuProcessHost::FromID(host_id); 376 GpuProcessHost* host = GpuProcessHost::FromID(host_id);
376 if (host) 377 if (host)
377 host->AddFilter(filter.get()); 378 host->AddFilter(filter.get());
378 } 379 }
379 380
380 // static 381 // static
381 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO( 382 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO(
382 int gpu_client_id, 383 int gpu_client_id,
383 const base::FilePath& cache_dir) { 384 const base::FilePath& cache_dir) {
384 ShaderCacheFactory::GetInstance()->SetCacheInfo(gpu_client_id, cache_dir); 385 ShaderCacheFactory::GetInstance()->SetCacheInfo(gpu_client_id, cache_dir);
385 } 386 }
386 387
387 } // namespace content 388 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698