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

Side by Side Diff: content/renderer/render_thread_impl.cc

Issue 1449953002: compositor-worker: Refactor CompositorWorkerManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add documentation and ASSERTS for some subtleties. Created 5 years 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
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | third_party/WebKit/LayoutTests/TestExpectations » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <vector> 10 #include <vector>
(...skipping 21 matching lines...) Expand all
32 #include "base/threading/thread_restrictions.h" 32 #include "base/threading/thread_restrictions.h"
33 #include "base/trace_event/memory_dump_manager.h" 33 #include "base/trace_event/memory_dump_manager.h"
34 #include "base/trace_event/trace_event.h" 34 #include "base/trace_event/trace_event.h"
35 #include "base/values.h" 35 #include "base/values.h"
36 #include "cc/base/histograms.h" 36 #include "cc/base/histograms.h"
37 #include "cc/base/switches.h" 37 #include "cc/base/switches.h"
38 #include "cc/blink/web_external_bitmap_impl.h" 38 #include "cc/blink/web_external_bitmap_impl.h"
39 #include "cc/blink/web_layer_impl.h" 39 #include "cc/blink/web_layer_impl.h"
40 #include "cc/layers/layer_settings.h" 40 #include "cc/layers/layer_settings.h"
41 #include "cc/raster/task_graph_runner.h" 41 #include "cc/raster/task_graph_runner.h"
42 #include "cc/trees/layer_tree_host_common.h"
42 #include "cc/trees/layer_tree_settings.h" 43 #include "cc/trees/layer_tree_settings.h"
44 #include "components/scheduler/child/webthread_base.h"
43 #include "components/scheduler/renderer/renderer_scheduler.h" 45 #include "components/scheduler/renderer/renderer_scheduler.h"
44 #include "content/child/appcache/appcache_dispatcher.h" 46 #include "content/child/appcache/appcache_dispatcher.h"
45 #include "content/child/appcache/appcache_frontend_impl.h" 47 #include "content/child/appcache/appcache_frontend_impl.h"
46 #include "content/child/child_discardable_shared_memory_manager.h" 48 #include "content/child/child_discardable_shared_memory_manager.h"
47 #include "content/child/child_gpu_memory_buffer_manager.h" 49 #include "content/child/child_gpu_memory_buffer_manager.h"
48 #include "content/child/child_histogram_message_filter.h" 50 #include "content/child/child_histogram_message_filter.h"
49 #include "content/child/child_resource_message_filter.h" 51 #include "content/child/child_resource_message_filter.h"
50 #include "content/child/child_shared_bitmap_manager.h" 52 #include "content/child/child_shared_bitmap_manager.h"
51 #include "content/child/content_child_helpers.h" 53 #include "content/child/content_child_helpers.h"
52 #include "content/child/db_message_filter.h" 54 #include "content/child/db_message_filter.h"
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 #if defined(OS_ANDROID) 841 #if defined(OS_ANDROID)
840 if (sync_compositor_message_filter_) { 842 if (sync_compositor_message_filter_) {
841 RemoveFilter(sync_compositor_message_filter_.get()); 843 RemoveFilter(sync_compositor_message_filter_.get());
842 sync_compositor_message_filter_ = nullptr; 844 sync_compositor_message_filter_ = nullptr;
843 } 845 }
844 stream_texture_factory_ = nullptr; 846 stream_texture_factory_ = nullptr;
845 #endif 847 #endif
846 848
847 media_thread_.reset(); 849 media_thread_.reset();
848 850
851 blink_platform_impl_->set_compositor_thread(nullptr);
852
849 compositor_thread_.reset(); 853 compositor_thread_.reset();
850 854
851 // AudioMessageFilter may be accessed on |media_thread_|, so shutdown after. 855 // AudioMessageFilter may be accessed on |media_thread_|, so shutdown after.
852 RemoveFilter(audio_message_filter_.get()); 856 RemoveFilter(audio_message_filter_.get());
853 audio_message_filter_ = NULL; 857 audio_message_filter_ = NULL;
854 858
855 raster_worker_pool_->Shutdown(); 859 raster_worker_pool_->Shutdown();
856 860
857 main_input_callback_.Cancel(); 861 main_input_callback_.Cancel();
858 input_handler_manager_.reset(); 862 input_handler_manager_.reset();
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 new ResourceSchedulingFilter(resource_task_queue, resource_dispatcher())); 1049 new ResourceSchedulingFilter(resource_task_queue, resource_dispatcher()));
1046 channel()->AddFilter(filter.get()); 1050 channel()->AddFilter(filter.get());
1047 resource_dispatcher()->SetResourceSchedulingFilter(filter); 1051 resource_dispatcher()->SetResourceSchedulingFilter(filter);
1048 1052
1049 // The ChildResourceMessageFilter and the ResourceDispatcher need to use the 1053 // The ChildResourceMessageFilter and the ResourceDispatcher need to use the
1050 // same queue to ensure tasks are executed in the expected order. 1054 // same queue to ensure tasks are executed in the expected order.
1051 child_resource_message_filter()->SetMainThreadTaskRunner(resource_task_queue); 1055 child_resource_message_filter()->SetMainThreadTaskRunner(resource_task_queue);
1052 resource_dispatcher()->SetMainThreadTaskRunner(resource_task_queue); 1056 resource_dispatcher()->SetMainThreadTaskRunner(resource_task_queue);
1053 } 1057 }
1054 1058
1059 void RenderThreadImpl::InitializeCompositorThread() {
1060 #if defined(OS_ANDROID)
1061 SynchronousCompositorFactory* sync_compositor_factory =
1062 SynchronousCompositorFactory::GetInstance();
1063 bool using_ipc_sync_compositing =
1064 base::CommandLine::ForCurrentProcess()->HasSwitch(
1065 switches::kIPCSyncCompositing);
1066 DCHECK(!sync_compositor_factory || !using_ipc_sync_compositing);
1067
1068 if (sync_compositor_factory) {
1069 compositor_task_runner_ =
1070 sync_compositor_factory->GetCompositorTaskRunner();
1071 }
1072 #endif
1073 if (!compositor_task_runner_.get()) {
1074 base::Thread::Options options;
1075 #if defined(OS_ANDROID)
1076 options.priority = base::ThreadPriority::DISPLAY;
1077 #endif
1078 compositor_thread_ =
1079 blink_platform_impl_->createThreadWithOptions("Compositor", options);
1080 compositor_task_runner_ = compositor_thread_->TaskRunner();
1081 compositor_task_runner_->PostTask(
1082 FROM_HERE,
1083 base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed),
1084 false));
1085 blink_platform_impl_->set_compositor_thread(compositor_thread_.get());
1086 }
1087
1088 InputHandlerManagerClient* input_handler_manager_client = NULL;
1089 #if defined(OS_ANDROID)
1090 if (using_ipc_sync_compositing) {
1091 sync_compositor_message_filter_ =
1092 new SynchronousCompositorFilter(compositor_task_runner_);
1093 AddFilter(sync_compositor_message_filter_.get());
1094 input_handler_manager_client = sync_compositor_message_filter_.get();
1095 } else if (sync_compositor_factory) {
1096 input_handler_manager_client =
1097 sync_compositor_factory->GetInputHandlerManagerClient();
1098 }
1099 #endif
1100 if (!input_handler_manager_client) {
1101 scoped_refptr<InputEventFilter> compositor_input_event_filter(
1102 new InputEventFilter(main_input_callback_.callback(),
1103 main_thread_compositor_task_runner_,
1104 compositor_task_runner_));
1105 input_handler_manager_client = compositor_input_event_filter.get();
1106 input_event_filter_ = compositor_input_event_filter;
1107 }
1108 input_handler_manager_.reset(new InputHandlerManager(
1109 compositor_task_runner_, input_handler_manager_client,
1110 renderer_scheduler_.get()));
1111 }
1112
1055 void RenderThreadImpl::EnsureWebKitInitialized() { 1113 void RenderThreadImpl::EnsureWebKitInitialized() {
1056 if (blink_platform_impl_) 1114 if (blink_platform_impl_)
1057 return; 1115 return;
1058 1116
1059 const base::CommandLine& command_line = 1117 const base::CommandLine& command_line =
1060 *base::CommandLine::ForCurrentProcess(); 1118 *base::CommandLine::ForCurrentProcess();
1061 1119
1062 #ifdef ENABLE_VTUNE_JIT_INTERFACE 1120 #ifdef ENABLE_VTUNE_JIT_INTERFACE
1063 if (command_line.HasSwitch(switches::kEnableVtune)) 1121 if (command_line.HasSwitch(switches::kEnableVtune))
1064 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler()); 1122 gin::Debug::SetJitCodeEventHandler(vTune::GetVtuneCodeEventHandler());
(...skipping 10 matching lines...) Expand all
1075 isolate->SetAddHistogramSampleFunction(AddHistogramSample); 1133 isolate->SetAddHistogramSampleFunction(AddHistogramSample);
1076 1134
1077 main_thread_compositor_task_runner_ = 1135 main_thread_compositor_task_runner_ =
1078 renderer_scheduler_->CompositorTaskRunner(); 1136 renderer_scheduler_->CompositorTaskRunner();
1079 1137
1080 main_input_callback_.Reset( 1138 main_input_callback_.Reset(
1081 base::Bind(base::IgnoreResult(&RenderThreadImpl::OnMessageReceived), 1139 base::Bind(base::IgnoreResult(&RenderThreadImpl::OnMessageReceived),
1082 base::Unretained(this))); 1140 base::Unretained(this)));
1083 1141
1084 SetResourceDispatchTaskQueue(renderer_scheduler_->LoadingTaskRunner()); 1142 SetResourceDispatchTaskQueue(renderer_scheduler_->LoadingTaskRunner());
1085 1143 if (!command_line.HasSwitch(switches::kDisableThreadedCompositing))
1086 bool enable = !command_line.HasSwitch(switches::kDisableThreadedCompositing); 1144 InitializeCompositorThread();
1087 if (enable) {
1088 #if defined(OS_ANDROID)
1089 SynchronousCompositorFactory* sync_compositor_factory =
1090 SynchronousCompositorFactory::GetInstance();
1091 bool using_ipc_sync_compositing =
1092 base::CommandLine::ForCurrentProcess()->HasSwitch(
1093 switches::kIPCSyncCompositing);
1094 DCHECK(!sync_compositor_factory || !using_ipc_sync_compositing);
1095
1096 if (sync_compositor_factory) {
1097 compositor_task_runner_ =
1098 sync_compositor_factory->GetCompositorTaskRunner();
1099 }
1100 #endif
1101 if (!compositor_task_runner_) {
1102 compositor_thread_.reset(new base::Thread("Compositor"));
1103 base::Thread::Options compositor_thread_options;
1104 #if defined(OS_ANDROID)
1105 compositor_thread_options.priority = base::ThreadPriority::DISPLAY;
1106 #endif
1107 compositor_thread_->StartWithOptions(compositor_thread_options);
1108 compositor_task_runner_ = compositor_thread_->task_runner();
1109 compositor_task_runner_->PostTask(
1110 FROM_HERE,
1111 base::Bind(base::IgnoreResult(&ThreadRestrictions::SetIOAllowed),
1112 false));
1113 }
1114
1115 InputHandlerManagerClient* input_handler_manager_client = NULL;
1116 #if defined(OS_ANDROID)
1117 if (using_ipc_sync_compositing) {
1118 sync_compositor_message_filter_ =
1119 new SynchronousCompositorFilter(compositor_task_runner_);
1120 AddFilter(sync_compositor_message_filter_.get());
1121 input_handler_manager_client = sync_compositor_message_filter_.get();
1122 } else if (sync_compositor_factory) {
1123 input_handler_manager_client =
1124 sync_compositor_factory->GetInputHandlerManagerClient();
1125 }
1126 #endif
1127 if (!input_handler_manager_client) {
1128 scoped_refptr<InputEventFilter> compositor_input_event_filter(
1129 new InputEventFilter(main_input_callback_.callback(),
1130 main_thread_compositor_task_runner_,
1131 compositor_task_runner_));
1132 input_handler_manager_client = compositor_input_event_filter.get();
1133 input_event_filter_ = compositor_input_event_filter;
1134 }
1135 input_handler_manager_.reset(new InputHandlerManager(
1136 compositor_task_runner_, input_handler_manager_client,
1137 renderer_scheduler_.get()));
1138 }
1139 1145
1140 if (!input_event_filter_.get()) { 1146 if (!input_event_filter_.get()) {
1141 // Always provide an input event filter implementation to ensure consistent 1147 // Always provide an input event filter implementation to ensure consistent
1142 // input event scheduling and prioritization. 1148 // input event scheduling and prioritization.
1143 // TODO(jdduke): Merge InputEventFilter, InputHandlerManager and 1149 // TODO(jdduke): Merge InputEventFilter, InputHandlerManager and
1144 // MainThreadInputEventFilter, crbug.com/436057. 1150 // MainThreadInputEventFilter, crbug.com/436057.
1145 input_event_filter_ = new MainThreadInputEventFilter( 1151 input_event_filter_ = new MainThreadInputEventFilter(
1146 main_input_callback_.callback(), main_thread_compositor_task_runner_); 1152 main_input_callback_.callback(), main_thread_compositor_task_runner_);
1147 } 1153 }
1148 AddFilter(input_event_filter_.get()); 1154 AddFilter(input_event_filter_.get());
1149 1155
1150 scoped_refptr<base::SingleThreadTaskRunner> compositor_impl_side_task_runner; 1156 scoped_refptr<base::SingleThreadTaskRunner> compositor_impl_side_task_runner;
1151 if (enable) 1157 if (compositor_task_runner_)
1152 compositor_impl_side_task_runner = compositor_task_runner_; 1158 compositor_impl_side_task_runner = compositor_task_runner_;
1153 else 1159 else
1154 compositor_impl_side_task_runner = base::ThreadTaskRunnerHandle::Get(); 1160 compositor_impl_side_task_runner = base::ThreadTaskRunnerHandle::Get();
1155 1161
1156 compositor_message_filter_ = new CompositorForwardingMessageFilter( 1162 compositor_message_filter_ = new CompositorForwardingMessageFilter(
1157 compositor_impl_side_task_runner.get()); 1163 compositor_impl_side_task_runner.get());
1158 AddFilter(compositor_message_filter_.get()); 1164 AddFilter(compositor_message_filter_.get());
1159 1165
1160 RenderThreadImpl::RegisterSchemes(); 1166 RenderThreadImpl::RegisterSchemes();
1161 1167
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1985 1991
1986 void RenderThreadImpl::ReleaseFreeMemory() { 1992 void RenderThreadImpl::ReleaseFreeMemory() {
1987 base::allocator::ReleaseFreeMemory(); 1993 base::allocator::ReleaseFreeMemory();
1988 discardable_shared_memory_manager()->ReleaseFreeMemory(); 1994 discardable_shared_memory_manager()->ReleaseFreeMemory();
1989 1995
1990 if (blink_platform_impl_) 1996 if (blink_platform_impl_)
1991 blink::decommitFreeableMemory(); 1997 blink::decommitFreeableMemory();
1992 } 1998 }
1993 1999
1994 } // namespace content 2000 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | third_party/WebKit/LayoutTests/TestExpectations » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698