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/renderer_host/image_transport_factory.h" | 5 #include "content/browser/renderer_host/image_transport_factory.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 }; | 478 }; |
479 | 479 |
480 // Adapts a WebGraphicsContext3DCommandBufferImpl into a | 480 // Adapts a WebGraphicsContext3DCommandBufferImpl into a |
481 // cc::OutputSurface that also handles vsync parameter updates | 481 // cc::OutputSurface that also handles vsync parameter updates |
482 // arriving from the GPU process. | 482 // arriving from the GPU process. |
483 class BrowserCompositorOutputSurface | 483 class BrowserCompositorOutputSurface |
484 : public cc::OutputSurface, | 484 : public cc::OutputSurface, |
485 public base::NonThreadSafe { | 485 public base::NonThreadSafe { |
486 public: | 486 public: |
487 BrowserCompositorOutputSurface( | 487 BrowserCompositorOutputSurface( |
488 WebGraphicsContext3DCommandBufferImpl* context, | 488 scoped_ptr<WebKit::WebGraphicsContext3D> context, |
489 int surface_id, | 489 int surface_id, |
490 BrowserCompositorOutputSurfaceProxy* output_surface_proxy, | 490 BrowserCompositorOutputSurfaceProxy* output_surface_proxy, |
491 base::MessageLoopProxy* compositor_message_loop, | 491 base::MessageLoopProxy* compositor_message_loop, |
492 base::WeakPtr<ui::Compositor> compositor) | 492 base::WeakPtr<ui::Compositor> compositor) |
493 : OutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D>(context)), | 493 : OutputSurface(context.Pass()), |
494 surface_id_(surface_id), | 494 surface_id_(surface_id), |
495 output_surface_proxy_(output_surface_proxy), | 495 output_surface_proxy_(output_surface_proxy), |
496 compositor_message_loop_(compositor_message_loop), | 496 compositor_message_loop_(compositor_message_loop), |
497 compositor_(compositor) { | 497 compositor_(compositor) { |
498 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 498 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
499 if (command_line->HasSwitch(switches::kUIMaxFramesPending)) { | 499 if (command_line->HasSwitch(switches::kUIMaxFramesPending)) { |
500 std::string string_value = command_line->GetSwitchValueASCII( | 500 std::string string_value = command_line->GetSwitchValueASCII( |
501 switches::kUIMaxFramesPending); | 501 switches::kUIMaxFramesPending); |
502 int int_value; | 502 int int_value; |
503 if (base::StringToInt(string_value, &int_value)) | 503 if (base::StringToInt(string_value, &int_value)) |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 public: | 621 public: |
622 GpuProcessTransportFactory() | 622 GpuProcessTransportFactory() |
623 : callback_factory_(this) { | 623 : callback_factory_(this) { |
624 output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy(); | 624 output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy(); |
625 } | 625 } |
626 | 626 |
627 virtual ~GpuProcessTransportFactory() { | 627 virtual ~GpuProcessTransportFactory() { |
628 DCHECK(per_compositor_data_.empty()); | 628 DCHECK(per_compositor_data_.empty()); |
629 } | 629 } |
630 | 630 |
631 virtual WebGraphicsContext3DCommandBufferImpl* CreateOffscreenContext() | 631 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
632 OVERRIDE { | 632 CreateOffscreenCommandBufferContext() { |
633 base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> swap_client; | 633 base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> swap_client; |
634 return CreateContextCommon(swap_client, 0); | 634 return CreateContextCommon(swap_client, 0); |
635 } | 635 } |
636 | 636 |
| 637 virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext() |
| 638 OVERRIDE { |
| 639 return CreateOffscreenCommandBufferContext() |
| 640 .PassAs<WebKit::WebGraphicsContext3D>(); |
| 641 } |
| 642 |
637 virtual cc::OutputSurface* CreateOutputSurface( | 643 virtual cc::OutputSurface* CreateOutputSurface( |
638 ui::Compositor* compositor) OVERRIDE { | 644 ui::Compositor* compositor) OVERRIDE { |
639 PerCompositorData* data = per_compositor_data_[compositor]; | 645 PerCompositorData* data = per_compositor_data_[compositor]; |
640 if (!data) | 646 if (!data) |
641 data = CreatePerCompositorData(compositor); | 647 data = CreatePerCompositorData(compositor); |
642 WebGraphicsContext3DCommandBufferImpl* context = | |
643 CreateContextCommon(data->swap_client->AsWeakPtr(), | |
644 data->surface_id); | |
645 BrowserCompositorOutputSurface* surface = | 648 BrowserCompositorOutputSurface* surface = |
646 new BrowserCompositorOutputSurface( | 649 new BrowserCompositorOutputSurface( |
647 context, | 650 CreateContextCommon(data->swap_client->AsWeakPtr(), |
| 651 data->surface_id) |
| 652 .PassAs<WebKit::WebGraphicsContext3D>(), |
648 per_compositor_data_[compositor]->surface_id, | 653 per_compositor_data_[compositor]->surface_id, |
649 output_surface_proxy_.get(), | 654 output_surface_proxy_.get(), |
650 base::MessageLoopProxy::current(), | 655 base::MessageLoopProxy::current(), |
651 compositor->AsWeakPtr()); | 656 compositor->AsWeakPtr()); |
652 if (data->reflector.get()) { | 657 if (data->reflector.get()) { |
653 data->reflector->CreateSharedTexture(); | 658 data->reflector->CreateSharedTexture(); |
654 data->reflector->AttachToOutputSurface(surface); | 659 data->reflector->AttachToOutputSurface(surface); |
655 } | 660 } |
656 return surface; | 661 return surface; |
657 } | 662 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 #endif | 816 #endif |
812 tracker->SetSurfaceHandle( | 817 tracker->SetSurfaceHandle( |
813 data->surface_id, | 818 data->surface_id, |
814 gfx::GLSurfaceHandle(widget, gfx::NATIVE_DIRECT)); | 819 gfx::GLSurfaceHandle(widget, gfx::NATIVE_DIRECT)); |
815 | 820 |
816 per_compositor_data_[compositor] = data; | 821 per_compositor_data_[compositor] = data; |
817 | 822 |
818 return data; | 823 return data; |
819 } | 824 } |
820 | 825 |
821 WebGraphicsContext3DCommandBufferImpl* CreateContextCommon( | 826 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> CreateContextCommon( |
822 const base::WeakPtr<WebGraphicsContext3DSwapBuffersClient>& swap_client, | 827 const base::WeakPtr<WebGraphicsContext3DSwapBuffersClient>& swap_client, |
823 int surface_id) { | 828 int surface_id) { |
824 WebKit::WebGraphicsContext3D::Attributes attrs; | 829 WebKit::WebGraphicsContext3D::Attributes attrs; |
825 attrs.shareResources = true; | 830 attrs.shareResources = true; |
826 attrs.depth = false; | 831 attrs.depth = false; |
827 attrs.stencil = false; | 832 attrs.stencil = false; |
828 attrs.antialias = false; | 833 attrs.antialias = false; |
829 attrs.noAutomaticFlushes = true; | 834 attrs.noAutomaticFlushes = true; |
830 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); | 835 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); |
831 GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon"); | 836 GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon"); |
832 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( | 837 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
833 new WebGraphicsContext3DCommandBufferImpl( | 838 new WebGraphicsContext3DCommandBufferImpl( |
834 surface_id, | 839 surface_id, |
835 url, | 840 url, |
836 factory, | 841 factory, |
837 swap_client)); | 842 swap_client)); |
838 if (!context->InitializeWithDefaultBufferSizes( | 843 if (!context->InitializeWithDefaultBufferSizes( |
839 attrs, | 844 attrs, |
840 false, | 845 false, |
841 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) | 846 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) |
842 return NULL; | 847 return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>(); |
843 return context.release(); | 848 return context.Pass(); |
844 } | 849 } |
845 | 850 |
846 // Crash given that we are unable to show any UI whatsoever. On Windows we | 851 // Crash given that we are unable to show any UI whatsoever. On Windows we |
847 // also trigger code in breakpad causes a system process to show message box. | 852 // also trigger code in breakpad causes a system process to show message box. |
848 // In all cases a crash dump is generated. | 853 // In all cases a crash dump is generated. |
849 void FatalGPUError(const char* message) { | 854 void FatalGPUError(const char* message) { |
850 #if defined(OS_WIN) | 855 #if defined(OS_WIN) |
851 // 0xC01E0200 corresponds to STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE. | 856 // 0xC01E0200 corresponds to STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE. |
852 ::RaiseException(0xC01E0200, EXCEPTION_NONCONTINUABLE, 0, NULL); | 857 ::RaiseException(0xC01E0200, EXCEPTION_NONCONTINUABLE, 0, NULL); |
853 #else | 858 #else |
(...skipping 12 matching lines...) Expand all Loading... |
866 return provider; | 871 return provider; |
867 } | 872 } |
868 | 873 |
869 protected: | 874 protected: |
870 explicit MainThreadContextProvider(GpuProcessTransportFactory* factory) | 875 explicit MainThreadContextProvider(GpuProcessTransportFactory* factory) |
871 : factory_(factory) {} | 876 : factory_(factory) {} |
872 virtual ~MainThreadContextProvider() {} | 877 virtual ~MainThreadContextProvider() {} |
873 | 878 |
874 virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl> | 879 virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
875 CreateOffscreenContext3d() OVERRIDE { | 880 CreateOffscreenContext3d() OVERRIDE { |
876 return make_scoped_ptr(factory_->CreateOffscreenContext()); | 881 return factory_->CreateOffscreenCommandBufferContext(); |
877 } | 882 } |
878 | 883 |
879 virtual void OnLostContext() OVERRIDE { | 884 virtual void OnLostContext() OVERRIDE { |
880 base::MessageLoop::current()->PostTask( | 885 base::MessageLoop::current()->PostTask( |
881 FROM_HERE, | 886 FROM_HERE, |
882 base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, | 887 base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, |
883 factory_->callback_factory_.GetWeakPtr())); | 888 factory_->callback_factory_.GetWeakPtr())); |
884 } | 889 } |
885 | 890 |
886 private: | 891 private: |
(...skipping 23 matching lines...) Expand all Loading... |
910 return provider; | 915 return provider; |
911 } | 916 } |
912 | 917 |
913 protected: | 918 protected: |
914 explicit CompositorThreadContextProvider( | 919 explicit CompositorThreadContextProvider( |
915 GpuProcessTransportFactory* factory) : factory_(factory) {} | 920 GpuProcessTransportFactory* factory) : factory_(factory) {} |
916 virtual ~CompositorThreadContextProvider() {} | 921 virtual ~CompositorThreadContextProvider() {} |
917 | 922 |
918 virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl> | 923 virtual scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
919 CreateOffscreenContext3d() OVERRIDE { | 924 CreateOffscreenContext3d() OVERRIDE { |
920 return make_scoped_ptr(factory_->CreateOffscreenContext()); | 925 return factory_->CreateOffscreenCommandBufferContext(); |
921 } | 926 } |
922 | 927 |
923 private: | 928 private: |
924 GpuProcessTransportFactory* factory_; | 929 GpuProcessTransportFactory* factory_; |
925 }; | 930 }; |
926 | 931 |
927 virtual scoped_refptr<cc::ContextProvider> | 932 virtual scoped_refptr<cc::ContextProvider> |
928 OffscreenContextProviderForCompositorThread() OVERRIDE { | 933 OffscreenContextProviderForCompositorThread() OVERRIDE { |
929 if (!shared_contexts_compositor_thread_.get() || | 934 if (!shared_contexts_compositor_thread_.get() || |
930 shared_contexts_compositor_thread_->DestroyedOnMainThread()) { | 935 shared_contexts_compositor_thread_->DestroyedOnMainThread()) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 latency_info.swap_timestamp = base::TimeTicks::HighResNow(); | 994 latency_info.swap_timestamp = base::TimeTicks::HighResNow(); |
990 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); | 995 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); |
991 cc::OutputSurface::SwapBuffers(frame); | 996 cc::OutputSurface::SwapBuffers(frame); |
992 } | 997 } |
993 }; | 998 }; |
994 | 999 |
995 class SoftwareContextFactory : public ui::ContextFactory { | 1000 class SoftwareContextFactory : public ui::ContextFactory { |
996 public: | 1001 public: |
997 SoftwareContextFactory() {} | 1002 SoftwareContextFactory() {} |
998 virtual ~SoftwareContextFactory() {} | 1003 virtual ~SoftwareContextFactory() {} |
999 virtual WebKit::WebGraphicsContext3D* CreateOffscreenContext() OVERRIDE { | 1004 virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext() |
1000 return NULL; | 1005 OVERRIDE { |
| 1006 return scoped_ptr<WebKit::WebGraphicsContext3D>(); |
1001 } | 1007 } |
1002 virtual cc::OutputSurface* CreateOutputSurface( | 1008 virtual cc::OutputSurface* CreateOutputSurface( |
1003 ui::Compositor* compositor) OVERRIDE { | 1009 ui::Compositor* compositor) OVERRIDE { |
1004 #if defined(OS_WIN) | 1010 #if defined(OS_WIN) |
1005 scoped_ptr<SoftwareOutputDeviceWin> software_device( | 1011 scoped_ptr<SoftwareOutputDeviceWin> software_device( |
1006 new SoftwareOutputDeviceWin(compositor)); | 1012 new SoftwareOutputDeviceWin(compositor)); |
1007 return new SoftwareOutputSurface( | 1013 return new SoftwareOutputSurface( |
1008 software_device.PassAs<cc::SoftwareOutputDevice>()); | 1014 software_device.PassAs<cc::SoftwareOutputDevice>()); |
1009 #elif defined(USE_X11) | 1015 #elif defined(USE_X11) |
1010 scoped_ptr<SoftwareOutputDeviceX11> software_device( | 1016 scoped_ptr<SoftwareOutputDeviceX11> software_device( |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 delete g_factory; | 1071 delete g_factory; |
1066 g_factory = NULL; | 1072 g_factory = NULL; |
1067 } | 1073 } |
1068 | 1074 |
1069 // static | 1075 // static |
1070 ImageTransportFactory* ImageTransportFactory::GetInstance() { | 1076 ImageTransportFactory* ImageTransportFactory::GetInstance() { |
1071 return g_factory; | 1077 return g_factory; |
1072 } | 1078 } |
1073 | 1079 |
1074 } // namespace content | 1080 } // namespace content |
OLD | NEW |