| 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/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 const int kMaxResourceRequestsPerFlushWhenThrottled = 8; | 244 const int kMaxResourceRequestsPerFlushWhenThrottled = 8; |
| 245 #endif | 245 #endif |
| 246 const double kThrottledResourceRequestFlushPeriodS = 1. / 60.; | 246 const double kThrottledResourceRequestFlushPeriodS = 1. / 60.; |
| 247 | 247 |
| 248 // Maximum allocation size allowed for image scaling filters that | 248 // Maximum allocation size allowed for image scaling filters that |
| 249 // require pre-scaling. Skia will fallback to a filter that doesn't | 249 // require pre-scaling. Skia will fallback to a filter that doesn't |
| 250 // require pre-scaling if the default filter would require an | 250 // require pre-scaling if the default filter would require an |
| 251 // allocation that exceeds this limit. | 251 // allocation that exceeds this limit. |
| 252 const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; | 252 const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; |
| 253 | 253 |
| 254 #if defined(OS_ANDROID) | |
| 255 // Unique identifier for each output surface created. | 254 // Unique identifier for each output surface created. |
| 256 uint32_t g_next_compositor_frame_sink_id = 1; | 255 uint32_t g_next_compositor_frame_sink_id = 1; |
| 257 #endif | |
| 258 | 256 |
| 259 // An implementation of mojom::RenderMessageFilter which can be mocked out | 257 // An implementation of mojom::RenderMessageFilter which can be mocked out |
| 260 // for tests which may indirectly send messages over this interface. | 258 // for tests which may indirectly send messages over this interface. |
| 261 mojom::RenderMessageFilter* g_render_message_filter_for_testing; | 259 mojom::RenderMessageFilter* g_render_message_filter_for_testing; |
| 262 | 260 |
| 263 // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access | 261 // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access |
| 264 // incorrectly from the wrong thread. | 262 // incorrectly from the wrong thread. |
| 265 base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl>>::DestructorAtExit | 263 base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl>>::DestructorAtExit |
| 266 lazy_tls = LAZY_INSTANCE_INITIALIZER; | 264 lazy_tls = LAZY_INSTANCE_INITIALIZER; |
| 267 | 265 |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 needs_to_record_first_active_paint_ = false; | 885 needs_to_record_first_active_paint_ = false; |
| 888 | 886 |
| 889 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); | 887 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
| 890 | 888 |
| 891 // If this renderer doesn't run inside the browser process, enable | 889 // If this renderer doesn't run inside the browser process, enable |
| 892 // SequencedWorkerPool. Otherwise, it should already have been enabled. | 890 // SequencedWorkerPool. Otherwise, it should already have been enabled. |
| 893 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler | 891 // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler |
| 894 // redirection experiment concludes https://crbug.com/622400. | 892 // redirection experiment concludes https://crbug.com/622400. |
| 895 if (!command_line.HasSwitch(switches::kSingleProcess)) | 893 if (!command_line.HasSwitch(switches::kSingleProcess)) |
| 896 base::SequencedWorkerPool::EnableForProcess(); | 894 base::SequencedWorkerPool::EnableForProcess(); |
| 897 | |
| 898 GetConnector()->BindInterface(mojom::kBrowserServiceName, | |
| 899 mojo::MakeRequest(&frame_sink_provider_)); | |
| 900 } | 895 } |
| 901 | 896 |
| 902 RenderThreadImpl::~RenderThreadImpl() { | 897 RenderThreadImpl::~RenderThreadImpl() { |
| 903 } | 898 } |
| 904 | 899 |
| 905 void RenderThreadImpl::Shutdown() { | 900 void RenderThreadImpl::Shutdown() { |
| 906 // In a multi-process mode, we immediately exit the renderer. | 901 // In a multi-process mode, we immediately exit the renderer. |
| 907 // Historically we had a graceful shutdown sequence here but it was | 902 // Historically we had a graceful shutdown sequence here but it was |
| 908 // 1) a waste of performance and 2) a source of lots of complicated | 903 // 1) a waste of performance and 2) a source of lots of complicated |
| 909 // crashes caused by shutdown ordering. Immediate exit eliminates | 904 // crashes caused by shutdown ordering. Immediate exit eliminates |
| (...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 return; | 1852 return; |
| 1858 } | 1853 } |
| 1859 RendererWindowTreeClient::Get(routing_id) | 1854 RendererWindowTreeClient::Get(routing_id) |
| 1860 ->RequestCompositorFrameSink( | 1855 ->RequestCompositorFrameSink( |
| 1861 gpu_->CreateContextProvider(std::move(channel)), | 1856 gpu_->CreateContextProvider(std::move(channel)), |
| 1862 GetGpuMemoryBufferManager(), callback); | 1857 GetGpuMemoryBufferManager(), callback); |
| 1863 return; | 1858 return; |
| 1864 } | 1859 } |
| 1865 #endif | 1860 #endif |
| 1866 | 1861 |
| 1862 uint32_t compositor_frame_sink_id = g_next_compositor_frame_sink_id++; |
| 1863 |
| 1867 if (command_line.HasSwitch(switches::kEnableVulkan)) { | 1864 if (command_line.HasSwitch(switches::kEnableVulkan)) { |
| 1868 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider = | 1865 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider = |
| 1869 cc::VulkanInProcessContextProvider::Create(); | 1866 cc::VulkanInProcessContextProvider::Create(); |
| 1870 if (vulkan_context_provider) { | 1867 if (vulkan_context_provider) { |
| 1871 DCHECK(!layout_test_mode()); | 1868 DCHECK(!layout_test_mode()); |
| 1872 callback.Run(base::MakeUnique<RendererCompositorFrameSink>( | 1869 callback.Run(base::MakeUnique<RendererCompositorFrameSink>( |
| 1873 routing_id, std::move(synthetic_begin_frame_source), | 1870 routing_id, compositor_frame_sink_id, |
| 1871 std::move(synthetic_begin_frame_source), |
| 1874 std::move(vulkan_context_provider), | 1872 std::move(vulkan_context_provider), |
| 1875 std::move(frame_swap_message_queue))); | 1873 std::move(frame_swap_message_queue))); |
| 1876 return; | 1874 return; |
| 1877 } | 1875 } |
| 1878 } | 1876 } |
| 1879 | 1877 |
| 1880 // Create a gpu process channel and verify we want to use GPU compositing | 1878 // Create a gpu process channel and verify we want to use GPU compositing |
| 1881 // before creating any context providers. | 1879 // before creating any context providers. |
| 1882 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host; | 1880 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host; |
| 1883 if (!use_software) { | 1881 if (!use_software) { |
| 1884 gpu_channel_host = EstablishGpuChannelSync(); | 1882 gpu_channel_host = EstablishGpuChannelSync(); |
| 1885 if (!gpu_channel_host) { | 1883 if (!gpu_channel_host) { |
| 1886 // Cause the compositor to wait and try again. | 1884 // Cause the compositor to wait and try again. |
| 1887 callback.Run(nullptr); | 1885 callback.Run(nullptr); |
| 1888 return; | 1886 return; |
| 1889 } | 1887 } |
| 1890 // We may get a valid channel, but with a software renderer. In that case, | 1888 // We may get a valid channel, but with a software renderer. In that case, |
| 1891 // disable GPU compositing. | 1889 // disable GPU compositing. |
| 1892 if (gpu_channel_host->gpu_info().software_rendering) | 1890 if (gpu_channel_host->gpu_info().software_rendering) |
| 1893 use_software = true; | 1891 use_software = true; |
| 1894 } | 1892 } |
| 1895 | 1893 |
| 1896 if (use_software) { | 1894 if (use_software) { |
| 1897 DCHECK(!layout_test_mode()); | 1895 DCHECK(!layout_test_mode()); |
| 1898 callback.Run(base::MakeUnique<RendererCompositorFrameSink>( | 1896 callback.Run(base::MakeUnique<RendererCompositorFrameSink>( |
| 1899 routing_id, std::move(synthetic_begin_frame_source), nullptr, nullptr, | 1897 routing_id, compositor_frame_sink_id, |
| 1900 nullptr, shared_bitmap_manager(), std::move(frame_swap_message_queue))); | 1898 std::move(synthetic_begin_frame_source), nullptr, nullptr, nullptr, |
| 1899 shared_bitmap_manager(), std::move(frame_swap_message_queue))); |
| 1901 return; | 1900 return; |
| 1902 } | 1901 } |
| 1903 | 1902 |
| 1904 scoped_refptr<ui::ContextProviderCommandBuffer> worker_context_provider = | 1903 scoped_refptr<ui::ContextProviderCommandBuffer> worker_context_provider = |
| 1905 SharedCompositorWorkerContextProvider(); | 1904 SharedCompositorWorkerContextProvider(); |
| 1906 if (!worker_context_provider) { | 1905 if (!worker_context_provider) { |
| 1907 // Cause the compositor to wait and try again. | 1906 // Cause the compositor to wait and try again. |
| 1908 callback.Run(nullptr); | 1907 callback.Run(nullptr); |
| 1909 return; | 1908 return; |
| 1910 } | 1909 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1951 | 1950 |
| 1952 #if defined(OS_ANDROID) | 1951 #if defined(OS_ANDROID) |
| 1953 if (sync_compositor_message_filter_) { | 1952 if (sync_compositor_message_filter_) { |
| 1954 std::unique_ptr<cc::BeginFrameSource> begin_frame_source = | 1953 std::unique_ptr<cc::BeginFrameSource> begin_frame_source = |
| 1955 synthetic_begin_frame_source | 1954 synthetic_begin_frame_source |
| 1956 ? std::move(synthetic_begin_frame_source) | 1955 ? std::move(synthetic_begin_frame_source) |
| 1957 : CreateExternalBeginFrameSource(routing_id); | 1956 : CreateExternalBeginFrameSource(routing_id); |
| 1958 callback.Run(base::MakeUnique<SynchronousCompositorFrameSink>( | 1957 callback.Run(base::MakeUnique<SynchronousCompositorFrameSink>( |
| 1959 std::move(context_provider), std::move(worker_context_provider), | 1958 std::move(context_provider), std::move(worker_context_provider), |
| 1960 GetGpuMemoryBufferManager(), shared_bitmap_manager(), routing_id, | 1959 GetGpuMemoryBufferManager(), shared_bitmap_manager(), routing_id, |
| 1961 g_next_compositor_frame_sink_id++, std::move(begin_frame_source), | 1960 compositor_frame_sink_id, std::move(begin_frame_source), |
| 1962 sync_compositor_message_filter_.get(), | 1961 sync_compositor_message_filter_.get(), |
| 1963 std::move(frame_swap_message_queue))); | 1962 std::move(frame_swap_message_queue))); |
| 1964 return; | 1963 return; |
| 1965 } | 1964 } |
| 1966 #endif | 1965 #endif |
| 1967 callback.Run(base::WrapUnique(new RendererCompositorFrameSink( | 1966 callback.Run(base::WrapUnique(new RendererCompositorFrameSink( |
| 1968 routing_id, std::move(synthetic_begin_frame_source), | 1967 routing_id, compositor_frame_sink_id, |
| 1969 std::move(context_provider), std::move(worker_context_provider), | 1968 std::move(synthetic_begin_frame_source), std::move(context_provider), |
| 1970 GetGpuMemoryBufferManager(), nullptr, | 1969 std::move(worker_context_provider), GetGpuMemoryBufferManager(), nullptr, |
| 1971 std::move(frame_swap_message_queue)))); | 1970 std::move(frame_swap_message_queue)))); |
| 1972 } | 1971 } |
| 1973 | 1972 |
| 1974 AssociatedInterfaceRegistry* | 1973 AssociatedInterfaceRegistry* |
| 1975 RenderThreadImpl::GetAssociatedInterfaceRegistry() { | 1974 RenderThreadImpl::GetAssociatedInterfaceRegistry() { |
| 1976 return &associated_interfaces_; | 1975 return &associated_interfaces_; |
| 1977 } | 1976 } |
| 1978 | 1977 |
| 1979 std::unique_ptr<cc::SwapPromise> | 1978 std::unique_ptr<cc::SwapPromise> |
| 1980 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( | 1979 RenderThreadImpl::RequestCopyOfOutputForLayoutTest( |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2414 } | 2413 } |
| 2415 } | 2414 } |
| 2416 | 2415 |
| 2417 void RenderThreadImpl::OnRendererInterfaceRequest( | 2416 void RenderThreadImpl::OnRendererInterfaceRequest( |
| 2418 mojom::RendererAssociatedRequest request) { | 2417 mojom::RendererAssociatedRequest request) { |
| 2419 DCHECK(!renderer_binding_.is_bound()); | 2418 DCHECK(!renderer_binding_.is_bound()); |
| 2420 renderer_binding_.Bind(std::move(request)); | 2419 renderer_binding_.Bind(std::move(request)); |
| 2421 } | 2420 } |
| 2422 | 2421 |
| 2423 } // namespace content | 2422 } // namespace content |
| OLD | NEW |