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

Side by Side Diff: content/browser/compositor/gpu_process_transport_factory.cc

Issue 1821863002: Hook up ui::Compositor to Display's BeginFrameSource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix Display member destruction order Created 4 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/compositor/gpu_process_transport_factory.h" 5 #include "content/browser/compositor/gpu_process_transport_factory.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
15 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
16 #include "base/thread_task_runner_handle.h" 15 #include "base/thread_task_runner_handle.h"
17 #include "base/threading/simple_thread.h" 16 #include "base/threading/simple_thread.h"
18 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
19 #include "build/build_config.h" 18 #include "build/build_config.h"
20 #include "cc/base/histograms.h" 19 #include "cc/base/histograms.h"
21 #include "cc/output/compositor_frame.h" 20 #include "cc/output/compositor_frame.h"
22 #include "cc/output/output_surface.h" 21 #include "cc/output/output_surface.h"
23 #include "cc/raster/single_thread_task_graph_runner.h" 22 #include "cc/raster/single_thread_task_graph_runner.h"
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 callback_factory_.GetWeakPtr(), compositor, 321 callback_factory_.GetWeakPtr(), compositor,
323 create_gpu_output_surface, num_attempts + 1)); 322 create_gpu_output_surface, num_attempts + 1));
324 return; 323 return;
325 } 324 }
326 } 325 }
327 326
328 std::unique_ptr<BrowserCompositorOutputSurface> surface; 327 std::unique_ptr<BrowserCompositorOutputSurface> surface;
329 if (!create_gpu_output_surface) { 328 if (!create_gpu_output_surface) {
330 surface = base::WrapUnique(new SoftwareBrowserCompositorOutputSurface( 329 surface = base::WrapUnique(new SoftwareBrowserCompositorOutputSurface(
331 CreateSoftwareOutputDevice(compositor.get()), 330 CreateSoftwareOutputDevice(compositor.get()),
332 compositor->vsync_manager())); 331 compositor->vsync_manager(), compositor->task_runner().get()));
333 } else { 332 } else {
334 DCHECK(context_provider); 333 DCHECK(context_provider);
335 ContextProvider::Capabilities capabilities = 334 ContextProvider::Capabilities capabilities =
336 context_provider->ContextCapabilities(); 335 context_provider->ContextCapabilities();
337 if (!data->surface_id) { 336 if (!data->surface_id) {
338 surface = base::WrapUnique(new OffscreenBrowserCompositorOutputSurface( 337 surface = base::WrapUnique(new OffscreenBrowserCompositorOutputSurface(
339 context_provider, shared_worker_context_provider_, 338 context_provider, shared_worker_context_provider_,
340 compositor->vsync_manager(), 339 compositor->vsync_manager(), compositor->task_runner().get(),
341 std::unique_ptr<BrowserCompositorOverlayCandidateValidator>())); 340 std::unique_ptr<BrowserCompositorOverlayCandidateValidator>()));
342 } else if (capabilities.gpu.surfaceless) { 341 } else if (capabilities.gpu.surfaceless) {
343 GLenum target = GL_TEXTURE_2D; 342 GLenum target = GL_TEXTURE_2D;
344 GLenum format = GL_RGB; 343 GLenum format = GL_RGB;
345 #if defined(OS_MACOSX) 344 #if defined(OS_MACOSX)
346 target = GL_TEXTURE_RECTANGLE_ARB; 345 target = GL_TEXTURE_RECTANGLE_ARB;
347 format = GL_RGBA; 346 format = GL_RGBA;
348 #endif 347 #endif
349 surface = 348 surface =
350 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface( 349 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface(
351 context_provider, shared_worker_context_provider_, 350 context_provider, shared_worker_context_provider_,
352 data->surface_id, compositor->vsync_manager(), 351 data->surface_id, compositor->vsync_manager(),
352 compositor->task_runner().get(),
353 CreateOverlayCandidateValidator(compositor->widget()), target, 353 CreateOverlayCandidateValidator(compositor->widget()), target,
354 format, BrowserGpuMemoryBufferManager::current())); 354 format, BrowserGpuMemoryBufferManager::current()));
355 } else { 355 } else {
356 std::unique_ptr<BrowserCompositorOverlayCandidateValidator> validator; 356 std::unique_ptr<BrowserCompositorOverlayCandidateValidator> validator;
357 #if !defined(OS_MACOSX) 357 #if !defined(OS_MACOSX)
358 // Overlays are only supported on surfaceless output surfaces on Mac. 358 // Overlays are only supported on surfaceless output surfaces on Mac.
359 validator = CreateOverlayCandidateValidator(compositor->widget()); 359 validator = CreateOverlayCandidateValidator(compositor->widget());
360 #endif 360 #endif
361 surface = base::WrapUnique(new GpuBrowserCompositorOutputSurface( 361 surface = base::WrapUnique(new GpuBrowserCompositorOutputSurface(
362 context_provider, shared_worker_context_provider_, 362 context_provider, shared_worker_context_provider_,
363 compositor->vsync_manager(), std::move(validator))); 363 compositor->vsync_manager(), compositor->task_runner().get(),
364 std::move(validator)));
364 } 365 }
365 } 366 }
366 367
367 // TODO(piman): Use GpuSurfaceTracker to map ids to surfaces instead of an 368 // TODO(piman): Use GpuSurfaceTracker to map ids to surfaces instead of an
368 // output_surface_map_ here. 369 // output_surface_map_ here.
369 output_surface_map_.AddWithID(surface.get(), data->surface_id); 370 output_surface_map_.AddWithID(surface.get(), data->surface_id);
370 data->surface = surface.get(); 371 data->surface = surface.get();
371 if (data->reflector) 372 if (data->reflector)
372 data->reflector->OnSourceSurfaceReady(data->surface); 373 data->reflector->OnSourceSurfaceReady(data->surface);
373 374
374 #if defined(OS_WIN) 375 #if defined(OS_WIN)
375 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( 376 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild(
376 compositor->widget()); 377 compositor->widget());
377 #endif 378 #endif
378 379
379 // This gets a bit confusing. Here we have a ContextProvider in the |surface| 380 // This gets a bit confusing. Here we have a ContextProvider in the |surface|
380 // configured to render directly to this widget. We need to make an 381 // configured to render directly to this widget. We need to make an
381 // OnscreenDisplayClient associated with that context, then return a 382 // OnscreenDisplayClient associated with that context, then return a
382 // SurfaceDisplayOutputSurface set up to draw to the display's surface. 383 // SurfaceDisplayOutputSurface set up to draw to the display's surface.
383 cc::SurfaceManager* manager = surface_manager_.get(); 384 cc::SurfaceManager* manager = surface_manager_.get();
384 std::unique_ptr<cc::OnscreenDisplayClient> display_client( 385 std::unique_ptr<cc::OnscreenDisplayClient> display_client(
385 new cc::OnscreenDisplayClient( 386 new cc::OnscreenDisplayClient(
386 std::move(surface), manager, HostSharedBitmapManager::current(), 387 std::move(surface), manager, HostSharedBitmapManager::current(),
387 BrowserGpuMemoryBufferManager::current(), 388 BrowserGpuMemoryBufferManager::current(),
388 compositor->GetRendererSettings(), compositor->task_runner())); 389 compositor->GetRendererSettings(), compositor->task_runner(),
390 compositor->surface_id_allocator()->id_namespace()));
389 391
390 std::unique_ptr<cc::SurfaceDisplayOutputSurface> output_surface( 392 std::unique_ptr<cc::SurfaceDisplayOutputSurface> output_surface(
391 new cc::SurfaceDisplayOutputSurface( 393 new cc::SurfaceDisplayOutputSurface(
392 manager, compositor->surface_id_allocator(), context_provider, 394 manager, compositor->surface_id_allocator(), context_provider,
393 shared_worker_context_provider_)); 395 shared_worker_context_provider_));
394 display_client->set_surface_output_surface(output_surface.get()); 396 display_client->set_surface_output_surface(output_surface.get());
395 output_surface->set_display_client(display_client.get()); 397 output_surface->set_display_client(display_client.get());
396 display_client->display()->Resize(compositor->size()); 398 display_client->display()->Resize(compositor->size());
397 data->display_client = std::move(display_client); 399 data->display_client = std::move(display_client);
398 compositor->SetOutputSurface(std::move(output_surface)); 400 compositor->SetOutputSurface(std::move(output_surface));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 output_surface_map_.Remove(data->surface_id); 435 output_surface_map_.Remove(data->surface_id);
434 if (data->surface_id) 436 if (data->surface_id)
435 GpuSurfaceTracker::Get()->RemoveSurface(data->surface_id); 437 GpuSurfaceTracker::Get()->RemoveSurface(data->surface_id);
436 delete data; 438 delete data;
437 per_compositor_data_.erase(it); 439 per_compositor_data_.erase(it);
438 if (per_compositor_data_.empty()) { 440 if (per_compositor_data_.empty()) {
439 // Destroying the GLHelper may cause some async actions to be cancelled, 441 // Destroying the GLHelper may cause some async actions to be cancelled,
440 // causing things to request a new GLHelper. Due to crbug.com/176091 the 442 // causing things to request a new GLHelper. Due to crbug.com/176091 the
441 // GLHelper created in this case would be lost/leaked if we just reset() 443 // GLHelper created in this case would be lost/leaked if we just reset()
442 // on the |gl_helper_| variable directly. So instead we call reset() on a 444 // on the |gl_helper_| variable directly. So instead we call reset() on a
443 // local scoped_ptr. 445 // local std::unique_ptr.
444 std::unique_ptr<GLHelper> helper = std::move(gl_helper_); 446 std::unique_ptr<GLHelper> helper = std::move(gl_helper_);
445 447
446 // If there are any observer left at this point, make sure they clean up 448 // If there are any observer left at this point, make sure they clean up
447 // before we destroy the GLHelper. 449 // before we destroy the GLHelper.
448 FOR_EACH_OBSERVER( 450 FOR_EACH_OBSERVER(
449 ImageTransportFactoryObserver, observer_list_, OnLostResources()); 451 ImageTransportFactoryObserver, observer_list_, OnLostResources());
450 452
451 helper.reset(); 453 helper.reset();
452 DCHECK(!gl_helper_) << "Destroying the GLHelper should not cause a new " 454 DCHECK(!gl_helper_) << "Destroying the GLHelper should not cause a new "
453 "GLHelper to be created."; 455 "GLHelper to be created.";
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 FOR_EACH_OBSERVER(ImageTransportFactoryObserver, 677 FOR_EACH_OBSERVER(ImageTransportFactoryObserver,
676 observer_list_, 678 observer_list_,
677 OnLostResources()); 679 OnLostResources());
678 680
679 // Kill things that use the shared context before killing the shared context. 681 // Kill things that use the shared context before killing the shared context.
680 lost_gl_helper.reset(); 682 lost_gl_helper.reset();
681 lost_shared_main_thread_contexts = NULL; 683 lost_shared_main_thread_contexts = NULL;
682 } 684 }
683 685
684 } // namespace content 686 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698