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

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

Issue 1892303003: Added the Vulkan Context Provider implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 #elif defined(USE_X11) 71 #elif defined(USE_X11)
72 #include "content/browser/compositor/software_output_device_x11.h" 72 #include "content/browser/compositor/software_output_device_x11.h"
73 #elif defined(OS_MACOSX) 73 #elif defined(OS_MACOSX)
74 #include "content/browser/compositor/browser_compositor_overlay_candidate_valida tor_mac.h" 74 #include "content/browser/compositor/browser_compositor_overlay_candidate_valida tor_mac.h"
75 #include "content/browser/compositor/software_output_device_mac.h" 75 #include "content/browser/compositor/software_output_device_mac.h"
76 #include "ui/base/cocoa/remote_layer_api.h" 76 #include "ui/base/cocoa/remote_layer_api.h"
77 #elif defined(OS_ANDROID) 77 #elif defined(OS_ANDROID)
78 #include "content/browser/compositor/browser_compositor_overlay_candidate_valida tor_android.h" 78 #include "content/browser/compositor/browser_compositor_overlay_candidate_valida tor_android.h"
79 #endif 79 #endif
80 80
81 #if defined(ENABLE_VULKAN)
82 #include "cc/output/vulkan_derived_context_provider.h"
83 #include "cc/output/vulkan_in_process_context_provider.h"
84 #include "content/browser/compositor/vulkan_browser_compositor_output_surface.h"
85 #endif
86
81 using cc::ContextProvider; 87 using cc::ContextProvider;
82 using gpu::gles2::GLES2Interface; 88 using gpu::gles2::GLES2Interface;
83 89
84 static const int kNumRetriesBeforeSoftwareFallback = 4; 90 static const int kNumRetriesBeforeSoftwareFallback = 4;
85 91
86 namespace content { 92 namespace content {
87 93
88 struct GpuProcessTransportFactory::PerCompositorData { 94 struct GpuProcessTransportFactory::PerCompositorData {
89 int surface_id; 95 int surface_id;
90 BrowserCompositorOutputSurface* surface; 96 BrowserCompositorOutputSurface* surface;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 output_surface_map_.Remove(data->surface_id); 222 output_surface_map_.Remove(data->surface_id);
217 data->surface = nullptr; 223 data->surface = nullptr;
218 } 224 }
219 225
220 #if defined(OS_WIN) 226 #if defined(OS_WIN)
221 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( 227 gfx::RenderingWindowManager::GetInstance()->UnregisterParent(
222 compositor->widget()); 228 compositor->widget());
223 #endif 229 #endif
224 230
225 bool create_gpu_output_surface = 231 bool create_gpu_output_surface =
232 #if defined(ENABLE_VULKAN)
233 !SharedVulkanContextProvider() &&
234 #endif
piman 2016/04/19 01:36:42 create_gpu_output_surface really means "don't fall
David Yen 2016/04/19 22:20:28 Seems we need to check the switch everytime Shared
226 ShouldCreateGpuOutputSurface(compositor.get()); 235 ShouldCreateGpuOutputSurface(compositor.get());
227 if (create_gpu_output_surface) { 236 if (create_gpu_output_surface) {
228 CauseForGpuLaunch cause = 237 CauseForGpuLaunch cause =
229 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE; 238 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
230 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( 239 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
231 cause, base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 240 cause, base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
232 callback_factory_.GetWeakPtr(), compositor, 241 callback_factory_.GetWeakPtr(), compositor,
233 create_gpu_output_surface, 0)); 242 create_gpu_output_surface, 0));
234 } else { 243 } else {
235 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0); 244 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE; 327 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
319 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( 328 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
320 cause, base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 329 cause, base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
321 callback_factory_.GetWeakPtr(), compositor, 330 callback_factory_.GetWeakPtr(), compositor,
322 create_gpu_output_surface, num_attempts + 1)); 331 create_gpu_output_surface, num_attempts + 1));
323 return; 332 return;
324 } 333 }
325 } 334 }
326 335
327 std::unique_ptr<BrowserCompositorOutputSurface> surface; 336 std::unique_ptr<BrowserCompositorOutputSurface> surface;
328 if (!create_gpu_output_surface) { 337 #if defined(ENABLE_VULKAN)
338 scoped_refptr<cc::VulkanInProcessContextProvider> vulkan_context_provider =
339 SharedVulkanContextProvider();
340 if (vulkan_context_provider) {
341 surface = make_scoped_ptr(new VulkanBrowserCompositorOutputSurface(
342 cc::VulkanDerivedContextProvider::Create(vulkan_context_provider,
343 compositor.get()->widget()),
344 compositor->vsync_manager()));
345 } else
346 #endif
347 if (!create_gpu_output_surface) {
329 surface = base::WrapUnique(new SoftwareBrowserCompositorOutputSurface( 348 surface = base::WrapUnique(new SoftwareBrowserCompositorOutputSurface(
330 CreateSoftwareOutputDevice(compositor.get()), 349 CreateSoftwareOutputDevice(compositor.get()),
331 compositor->vsync_manager(), compositor->task_runner().get())); 350 compositor->vsync_manager(), compositor->task_runner().get()));
332 } else { 351 } else {
333 DCHECK(context_provider); 352 DCHECK(context_provider);
334 ContextProvider::Capabilities capabilities = 353 ContextProvider::Capabilities capabilities =
335 context_provider->ContextCapabilities(); 354 context_provider->ContextCapabilities();
336 if (!data->surface_id) { 355 if (!data->surface_id) {
337 surface = base::WrapUnique(new OffscreenBrowserCompositorOutputSurface( 356 surface = base::WrapUnique(new OffscreenBrowserCompositorOutputSurface(
338 context_provider, shared_worker_context_provider_, 357 context_provider, shared_worker_context_provider_,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 // SurfaceDisplayOutputSurface set up to draw to the display's surface. 402 // SurfaceDisplayOutputSurface set up to draw to the display's surface.
384 cc::SurfaceManager* manager = surface_manager_.get(); 403 cc::SurfaceManager* manager = surface_manager_.get();
385 std::unique_ptr<cc::OnscreenDisplayClient> display_client( 404 std::unique_ptr<cc::OnscreenDisplayClient> display_client(
386 new cc::OnscreenDisplayClient( 405 new cc::OnscreenDisplayClient(
387 std::move(surface), manager, HostSharedBitmapManager::current(), 406 std::move(surface), manager, HostSharedBitmapManager::current(),
388 BrowserGpuMemoryBufferManager::current(), 407 BrowserGpuMemoryBufferManager::current(),
389 compositor->GetRendererSettings(), compositor->task_runner(), 408 compositor->GetRendererSettings(), compositor->task_runner(),
390 compositor->surface_id_allocator()->id_namespace())); 409 compositor->surface_id_allocator()->id_namespace()));
391 410
392 std::unique_ptr<cc::SurfaceDisplayOutputSurface> output_surface( 411 std::unique_ptr<cc::SurfaceDisplayOutputSurface> output_surface(
393 new cc::SurfaceDisplayOutputSurface( 412 #if defined(ENABLE_VULKAN)
394 manager, compositor->surface_id_allocator(), context_provider, 413 vulkan_context_provider
395 shared_worker_context_provider_)); 414 ? new cc::SurfaceDisplayOutputSurface(
415 manager, compositor->surface_id_allocator(),
416 static_cast<scoped_refptr<cc::VulkanContextProvider>>(
417 vulkan_context_provider))
418 :
419 #endif
420 new cc::SurfaceDisplayOutputSurface(
421 manager, compositor->surface_id_allocator(), context_provider,
422 shared_worker_context_provider_));
396 display_client->set_surface_output_surface(output_surface.get()); 423 display_client->set_surface_output_surface(output_surface.get());
397 output_surface->set_display_client(display_client.get()); 424 output_surface->set_display_client(display_client.get());
398 display_client->display()->Resize(compositor->size()); 425 display_client->display()->Resize(compositor->size());
399 data->display_client = std::move(display_client); 426 data->display_client = std::move(display_client);
400 compositor->SetOutputSurface(std::move(output_surface)); 427 compositor->SetOutputSurface(std::move(output_surface));
401 } 428 }
402 429
403 std::unique_ptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( 430 std::unique_ptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector(
404 ui::Compositor* source_compositor, 431 ui::Compositor* source_compositor,
405 ui::Layer* target_layer) { 432 ui::Layer* target_layer) {
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 703
677 FOR_EACH_OBSERVER(ImageTransportFactoryObserver, 704 FOR_EACH_OBSERVER(ImageTransportFactoryObserver,
678 observer_list_, 705 observer_list_,
679 OnLostResources()); 706 OnLostResources());
680 707
681 // Kill things that use the shared context before killing the shared context. 708 // Kill things that use the shared context before killing the shared context.
682 lost_gl_helper.reset(); 709 lost_gl_helper.reset();
683 lost_shared_main_thread_contexts = NULL; 710 lost_shared_main_thread_contexts = NULL;
684 } 711 }
685 712
713 #if defined(ENABLE_VULKAN)
714 scoped_refptr<cc::VulkanInProcessContextProvider>
715 GpuProcessTransportFactory::SharedVulkanContextProvider() {
716 if (!shared_vulkan_context_provider_initialized_) {
717 shared_vulkan_context_provider_ =
718 cc::VulkanInProcessContextProvider::Create();
719 if (!shared_vulkan_context_provider_->Initialize())
720 shared_vulkan_context_provider_ = nullptr;
721
722 shared_vulkan_context_provider_initialized_ = true;
723 }
724 return shared_vulkan_context_provider_;
725 }
726 #endif
727
686 } // namespace content 728 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698