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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 PerCompositorData* data = per_compositor_data_[compositor]; | 635 PerCompositorData* data = per_compositor_data_[compositor]; |
636 if (!data) | 636 if (!data) |
637 data = CreatePerCompositorData(compositor); | 637 data = CreatePerCompositorData(compositor); |
638 WebGraphicsContext3DCommandBufferImpl* context = | 638 WebGraphicsContext3DCommandBufferImpl* context = |
639 CreateContextCommon(data->swap_client->AsWeakPtr(), | 639 CreateContextCommon(data->swap_client->AsWeakPtr(), |
640 data->surface_id); | 640 data->surface_id); |
641 BrowserCompositorOutputSurface* surface = | 641 BrowserCompositorOutputSurface* surface = |
642 new BrowserCompositorOutputSurface( | 642 new BrowserCompositorOutputSurface( |
643 context, | 643 context, |
644 per_compositor_data_[compositor]->surface_id, | 644 per_compositor_data_[compositor]->surface_id, |
645 output_surface_proxy_, | 645 output_surface_proxy_.get(), |
646 base::MessageLoopProxy::current(), | 646 base::MessageLoopProxy::current(), |
647 compositor->AsWeakPtr()); | 647 compositor->AsWeakPtr()); |
648 if (data->reflector.get()) { | 648 if (data->reflector.get()) { |
649 data->reflector->CreateSharedTexture(); | 649 data->reflector->CreateSharedTexture(); |
650 data->reflector->AttachToOutputSurface(surface); | 650 data->reflector->AttachToOutputSurface(surface); |
651 } | 651 } |
652 return surface; | 652 return surface; |
653 } | 653 } |
654 | 654 |
655 virtual scoped_refptr<ui::Reflector> CreateReflector( | 655 virtual scoped_refptr<ui::Reflector> CreateReflector( |
656 ui::Compositor* source, | 656 ui::Compositor* source, |
657 ui::Layer* target) OVERRIDE { | 657 ui::Layer* target) OVERRIDE { |
658 PerCompositorData* data = per_compositor_data_[source]; | 658 PerCompositorData* data = per_compositor_data_[source]; |
659 DCHECK(data); | 659 DCHECK(data); |
660 | 660 |
661 if (data->reflector.get()) | 661 if (data->reflector.get()) |
662 RemoveObserver(data->reflector.get()); | 662 RemoveObserver(data->reflector.get()); |
663 | 663 |
664 data->reflector = new ReflectorImpl( | 664 data->reflector = new ReflectorImpl( |
665 source, target, output_surface_proxy_, | 665 source, target, output_surface_proxy_.get(), data->surface_id); |
666 data->surface_id); | |
667 AddObserver(data->reflector.get()); | 666 AddObserver(data->reflector.get()); |
668 return data->reflector; | 667 return data->reflector; |
669 } | 668 } |
670 | 669 |
671 virtual void RemoveReflector( | 670 virtual void RemoveReflector( |
672 scoped_refptr<ui::Reflector> reflector) OVERRIDE { | 671 scoped_refptr<ui::Reflector> reflector) OVERRIDE { |
673 ReflectorImpl* reflector_impl = | 672 ReflectorImpl* reflector_impl = |
674 static_cast<ReflectorImpl*>(reflector.get()); | 673 static_cast<ReflectorImpl*>(reflector.get()); |
675 PerCompositorData* data = | 674 PerCompositorData* data = |
676 per_compositor_data_[reflector_impl->mirrored_compositor()]; | 675 per_compositor_data_[reflector_impl->mirrored_compositor()]; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 shared_contexts_main_thread_->Context3d()->GetChannelID(); | 708 shared_contexts_main_thread_->Context3d()->GetChannelID(); |
710 return handle; | 709 return handle; |
711 } | 710 } |
712 | 711 |
713 virtual void DestroySharedSurfaceHandle( | 712 virtual void DestroySharedSurfaceHandle( |
714 gfx::GLSurfaceHandle surface) OVERRIDE { | 713 gfx::GLSurfaceHandle surface) OVERRIDE { |
715 } | 714 } |
716 | 715 |
717 virtual scoped_refptr<ui::Texture> CreateTransportClient( | 716 virtual scoped_refptr<ui::Texture> CreateTransportClient( |
718 float device_scale_factor) OVERRIDE { | 717 float device_scale_factor) OVERRIDE { |
719 if (!shared_contexts_main_thread_) | 718 if (!shared_contexts_main_thread_.get()) |
720 return NULL; | 719 return NULL; |
721 scoped_refptr<ImageTransportClientTexture> image( | 720 scoped_refptr<ImageTransportClientTexture> image( |
722 new ImageTransportClientTexture( | 721 new ImageTransportClientTexture( |
723 shared_contexts_main_thread_->Context3d(), | 722 shared_contexts_main_thread_->Context3d(), |
724 device_scale_factor)); | 723 device_scale_factor)); |
725 return image; | 724 return image; |
726 } | 725 } |
727 | 726 |
728 virtual scoped_refptr<ui::Texture> CreateOwnedTexture( | 727 virtual scoped_refptr<ui::Texture> CreateOwnedTexture( |
729 const gfx::Size& size, | 728 const gfx::Size& size, |
730 float device_scale_factor, | 729 float device_scale_factor, |
731 unsigned int texture_id) OVERRIDE { | 730 unsigned int texture_id) OVERRIDE { |
732 if (!shared_contexts_main_thread_) | 731 if (!shared_contexts_main_thread_.get()) |
733 return NULL; | 732 return NULL; |
734 scoped_refptr<OwnedTexture> image(new OwnedTexture( | 733 scoped_refptr<OwnedTexture> image(new OwnedTexture( |
735 shared_contexts_main_thread_->Context3d(), | 734 shared_contexts_main_thread_->Context3d(), |
736 size, | 735 size, |
737 device_scale_factor, | 736 device_scale_factor, |
738 texture_id)); | 737 texture_id)); |
739 return image; | 738 return image; |
740 } | 739 } |
741 | 740 |
742 virtual GLHelper* GetGLHelper() OVERRIDE { | 741 virtual GLHelper* GetGLHelper() OVERRIDE { |
743 if (!gl_helper_) { | 742 if (!gl_helper_) { |
744 CreateSharedContextLazy(); | 743 CreateSharedContextLazy(); |
745 WebGraphicsContext3DCommandBufferImpl* context_for_main_thread = | 744 WebGraphicsContext3DCommandBufferImpl* context_for_main_thread = |
746 shared_contexts_main_thread_->Context3d(); | 745 shared_contexts_main_thread_->Context3d(); |
747 gl_helper_.reset(new GLHelper(context_for_main_thread)); | 746 gl_helper_.reset(new GLHelper(context_for_main_thread)); |
748 } | 747 } |
749 return gl_helper_.get(); | 748 return gl_helper_.get(); |
750 } | 749 } |
751 | 750 |
752 virtual uint32 InsertSyncPoint() OVERRIDE { | 751 virtual uint32 InsertSyncPoint() OVERRIDE { |
753 if (!shared_contexts_main_thread_) | 752 if (!shared_contexts_main_thread_.get()) |
754 return 0; | 753 return 0; |
755 return shared_contexts_main_thread_->Context3d()->insertSyncPoint(); | 754 return shared_contexts_main_thread_->Context3d()->insertSyncPoint(); |
756 } | 755 } |
757 | 756 |
758 virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { | 757 virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { |
759 if (!shared_contexts_main_thread_) | 758 if (!shared_contexts_main_thread_.get()) |
760 return; | 759 return; |
761 shared_contexts_main_thread_->Context3d()->waitSyncPoint(sync_point); | 760 shared_contexts_main_thread_->Context3d()->waitSyncPoint(sync_point); |
762 } | 761 } |
763 | 762 |
764 virtual void AddObserver(ImageTransportFactoryObserver* observer) OVERRIDE { | 763 virtual void AddObserver(ImageTransportFactoryObserver* observer) OVERRIDE { |
765 observer_list_.AddObserver(observer); | 764 observer_list_.AddObserver(observer); |
766 } | 765 } |
767 | 766 |
768 virtual void RemoveObserver( | 767 virtual void RemoveObserver( |
769 ImageTransportFactoryObserver* observer) OVERRIDE { | 768 ImageTransportFactoryObserver* observer) OVERRIDE { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, | 878 base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, |
880 factory_->callback_factory_.GetWeakPtr())); | 879 factory_->callback_factory_.GetWeakPtr())); |
881 } | 880 } |
882 | 881 |
883 private: | 882 private: |
884 GpuProcessTransportFactory* factory_; | 883 GpuProcessTransportFactory* factory_; |
885 }; | 884 }; |
886 | 885 |
887 virtual scoped_refptr<cc::ContextProvider> | 886 virtual scoped_refptr<cc::ContextProvider> |
888 OffscreenContextProviderForMainThread() OVERRIDE { | 887 OffscreenContextProviderForMainThread() OVERRIDE { |
889 if (!shared_contexts_main_thread_ || | 888 if (!shared_contexts_main_thread_.get() || |
890 shared_contexts_main_thread_->DestroyedOnMainThread()) { | 889 shared_contexts_main_thread_->DestroyedOnMainThread()) { |
891 shared_contexts_main_thread_ = MainThreadContextProvider::Create(this); | 890 shared_contexts_main_thread_ = MainThreadContextProvider::Create(this); |
892 if (shared_contexts_main_thread_ && | 891 if (shared_contexts_main_thread_.get() && |
893 !shared_contexts_main_thread_->BindToCurrentThread()) | 892 !shared_contexts_main_thread_->BindToCurrentThread()) |
894 shared_contexts_main_thread_ = NULL; | 893 shared_contexts_main_thread_ = NULL; |
895 } | 894 } |
896 return shared_contexts_main_thread_; | 895 return shared_contexts_main_thread_; |
897 } | 896 } |
898 | 897 |
899 class CompositorThreadContextProvider : public ContextProviderCommandBuffer { | 898 class CompositorThreadContextProvider : public ContextProviderCommandBuffer { |
900 public: | 899 public: |
901 static scoped_refptr<CompositorThreadContextProvider> Create( | 900 static scoped_refptr<CompositorThreadContextProvider> Create( |
902 GpuProcessTransportFactory* factory) { | 901 GpuProcessTransportFactory* factory) { |
(...skipping 13 matching lines...) Expand all Loading... |
916 CreateOffscreenContext3d() OVERRIDE { | 915 CreateOffscreenContext3d() OVERRIDE { |
917 return make_scoped_ptr(factory_->CreateOffscreenContext()); | 916 return make_scoped_ptr(factory_->CreateOffscreenContext()); |
918 } | 917 } |
919 | 918 |
920 private: | 919 private: |
921 GpuProcessTransportFactory* factory_; | 920 GpuProcessTransportFactory* factory_; |
922 }; | 921 }; |
923 | 922 |
924 virtual scoped_refptr<cc::ContextProvider> | 923 virtual scoped_refptr<cc::ContextProvider> |
925 OffscreenContextProviderForCompositorThread() OVERRIDE { | 924 OffscreenContextProviderForCompositorThread() OVERRIDE { |
926 if (!shared_contexts_compositor_thread_ || | 925 if (!shared_contexts_compositor_thread_.get() || |
927 shared_contexts_compositor_thread_->DestroyedOnMainThread()) { | 926 shared_contexts_compositor_thread_->DestroyedOnMainThread()) { |
928 shared_contexts_compositor_thread_ = | 927 shared_contexts_compositor_thread_ = |
929 CompositorThreadContextProvider::Create(this); | 928 CompositorThreadContextProvider::Create(this); |
930 } | 929 } |
931 return shared_contexts_compositor_thread_; | 930 return shared_contexts_compositor_thread_; |
932 } | 931 } |
933 | 932 |
934 void CreateSharedContextLazy() { | 933 void CreateSharedContextLazy() { |
935 scoped_refptr<cc::ContextProvider> provider = | 934 scoped_refptr<cc::ContextProvider> provider = |
936 OffscreenContextProviderForMainThread(); | 935 OffscreenContextProviderForMainThread(); |
937 if (!provider) { | 936 if (!provider.get()) { |
938 // If we can't recreate contexts, we won't be able to show the UI. | 937 // If we can't recreate contexts, we won't be able to show the UI. |
939 // Better crash at this point. | 938 // Better crash at this point. |
940 FatalGPUError("Failed to initialize UI shared context."); | 939 FatalGPUError("Failed to initialize UI shared context."); |
941 } | 940 } |
942 } | 941 } |
943 | 942 |
944 void OnLostMainThreadSharedContext() { | 943 void OnLostMainThreadSharedContext() { |
945 LOG(ERROR) << "Lost UI shared context."; | 944 LOG(ERROR) << "Lost UI shared context."; |
946 // Keep old resources around while we call the observers, but ensure that | 945 // Keep old resources around while we call the observers, but ensure that |
947 // new resources are created if needed. | 946 // new resources are created if needed. |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1048 delete g_factory; | 1047 delete g_factory; |
1049 g_factory = NULL; | 1048 g_factory = NULL; |
1050 } | 1049 } |
1051 | 1050 |
1052 // static | 1051 // static |
1053 ImageTransportFactory* ImageTransportFactory::GetInstance() { | 1052 ImageTransportFactory* ImageTransportFactory::GetInstance() { |
1054 return g_factory; | 1053 return g_factory; |
1055 } | 1054 } |
1056 | 1055 |
1057 } // namespace content | 1056 } // namespace content |
OLD | NEW |