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

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

Issue 801973002: Introduce CompositorDependencies for RenderWidgetCompositor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: compdep: move-compositordepsimpl-to-separate-file Created 6 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
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_widget.h" 5 #include "content/renderer/render_widget.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 17 matching lines...) Expand all
28 #include "content/common/gpu/gpu_process_launch_causes.h" 28 #include "content/common/gpu/gpu_process_launch_causes.h"
29 #include "content/common/input/synthetic_gesture_packet.h" 29 #include "content/common/input/synthetic_gesture_packet.h"
30 #include "content/common/input/web_input_event_traits.h" 30 #include "content/common/input/web_input_event_traits.h"
31 #include "content/common/input_messages.h" 31 #include "content/common/input_messages.h"
32 #include "content/common/swapped_out_messages.h" 32 #include "content/common/swapped_out_messages.h"
33 #include "content/common/view_messages.h" 33 #include "content/common/view_messages.h"
34 #include "content/public/common/content_switches.h" 34 #include "content/public/common/content_switches.h"
35 #include "content/public/common/context_menu_params.h" 35 #include "content/public/common/context_menu_params.h"
36 #include "content/renderer/cursor_utils.h" 36 #include "content/renderer/cursor_utils.h"
37 #include "content/renderer/external_popup_menu.h" 37 #include "content/renderer/external_popup_menu.h"
38 #include "content/renderer/gpu/compositor_dependencies_impl.h"
38 #include "content/renderer/gpu/compositor_output_surface.h" 39 #include "content/renderer/gpu/compositor_output_surface.h"
39 #include "content/renderer/gpu/compositor_software_output_device.h" 40 #include "content/renderer/gpu/compositor_software_output_device.h"
40 #include "content/renderer/gpu/delegated_compositor_output_surface.h" 41 #include "content/renderer/gpu/delegated_compositor_output_surface.h"
41 #include "content/renderer/gpu/frame_swap_message_queue.h" 42 #include "content/renderer/gpu/frame_swap_message_queue.h"
42 #include "content/renderer/gpu/mailbox_output_surface.h" 43 #include "content/renderer/gpu/mailbox_output_surface.h"
43 #include "content/renderer/gpu/queue_message_swap_promise.h" 44 #include "content/renderer/gpu/queue_message_swap_promise.h"
44 #include "content/renderer/gpu/render_widget_compositor.h" 45 #include "content/renderer/gpu/render_widget_compositor.h"
45 #include "content/renderer/ime_event_guard.h" 46 #include "content/renderer/ime_event_guard.h"
46 #include "content/renderer/input/input_handler_manager.h" 47 #include "content/renderer/input/input_handler_manager.h"
47 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" 48 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 ui::TextInputMode ConvertInputMode(const blink::WebString& input_mode) { 147 ui::TextInputMode ConvertInputMode(const blink::WebString& input_mode) {
147 static TextInputModeMapSingleton* singleton = 148 static TextInputModeMapSingleton* singleton =
148 TextInputModeMapSingleton::GetInstance(); 149 TextInputModeMapSingleton::GetInstance();
149 TextInputModeMap::const_iterator it = 150 TextInputModeMap::const_iterator it =
150 singleton->map().find(input_mode.utf8()); 151 singleton->map().find(input_mode.utf8());
151 if (it == singleton->map().end()) 152 if (it == singleton->map().end())
152 return ui::TEXT_INPUT_MODE_DEFAULT; 153 return ui::TEXT_INPUT_MODE_DEFAULT;
153 return it->second; 154 return it->second;
154 } 155 }
155 156
156 bool IsThreadedCompositingEnabled() {
157 content::RenderThreadImpl* impl = content::RenderThreadImpl::current();
158 return impl && !!impl->compositor_message_loop_proxy().get();
159 }
160
161 // TODO(brianderson): Replace the hard-coded threshold with a fraction of 157 // TODO(brianderson): Replace the hard-coded threshold with a fraction of
162 // the BeginMainFrame interval. 158 // the BeginMainFrame interval.
163 // 4166us will allow 1/4 of a 60Hz interval or 1/2 of a 120Hz interval to 159 // 4166us will allow 1/4 of a 60Hz interval or 1/2 of a 120Hz interval to
164 // be spent in input hanlders before input starts getting throttled. 160 // be spent in input hanlders before input starts getting throttled.
165 const int kInputHandlingTimeThrottlingThresholdMicroseconds = 4166; 161 const int kInputHandlingTimeThrottlingThresholdMicroseconds = 4166;
166 162
167 int64 GetEventLatencyMicros(const WebInputEvent& event, base::TimeTicks now) { 163 int64 GetEventLatencyMicros(const WebInputEvent& event, base::TimeTicks now) {
168 return (now - base::TimeDelta::FromSecondsD(event.timeStampSeconds)) 164 return (now - base::TimeDelta::FromSecondsD(event.timeStampSeconds))
169 .ToInternalValue(); 165 .ToInternalValue();
170 } 166 }
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 context_provider = ContextProviderCommandBuffer::Create( 952 context_provider = ContextProviderCommandBuffer::Create(
957 CreateGraphicsContext3D(), "RenderCompositor"); 953 CreateGraphicsContext3D(), "RenderCompositor");
958 if (!context_provider.get()) { 954 if (!context_provider.get()) {
959 // Cause the compositor to wait and try again. 955 // Cause the compositor to wait and try again.
960 return scoped_ptr<cc::OutputSurface>(); 956 return scoped_ptr<cc::OutputSurface>();
961 } 957 }
962 } 958 }
963 959
964 uint32 output_surface_id = next_output_surface_id_++; 960 uint32 output_surface_id = next_output_surface_id_++;
965 if (command_line.HasSwitch(switches::kEnableDelegatedRenderer)) { 961 if (command_line.HasSwitch(switches::kEnableDelegatedRenderer)) {
966 DCHECK(IsThreadedCompositingEnabled()); 962 DCHECK(compositor_deps_->GetCompositorImplThreadTaskRunner());
967 return scoped_ptr<cc::OutputSurface>( 963 return scoped_ptr<cc::OutputSurface>(
968 new DelegatedCompositorOutputSurface(routing_id(), 964 new DelegatedCompositorOutputSurface(routing_id(),
969 output_surface_id, 965 output_surface_id,
970 context_provider, 966 context_provider,
971 frame_swap_message_queue_)); 967 frame_swap_message_queue_));
972 } 968 }
973 if (!context_provider.get()) { 969 if (!context_provider.get()) {
974 scoped_ptr<cc::SoftwareOutputDevice> software_device( 970 scoped_ptr<cc::SoftwareOutputDevice> software_device(
975 new CompositorSoftwareOutputDevice()); 971 new CompositorSoftwareOutputDevice());
976 972
977 return scoped_ptr<cc::OutputSurface>( 973 return scoped_ptr<cc::OutputSurface>(
978 new CompositorOutputSurface(routing_id(), 974 new CompositorOutputSurface(routing_id(),
979 output_surface_id, 975 output_surface_id,
980 NULL, 976 NULL,
981 software_device.Pass(), 977 software_device.Pass(),
982 frame_swap_message_queue_, 978 frame_swap_message_queue_,
983 true)); 979 true));
984 } 980 }
985 981
986 if (command_line.HasSwitch(cc::switches::kCompositeToMailbox)) { 982 if (command_line.HasSwitch(cc::switches::kCompositeToMailbox)) {
987 // Composite-to-mailbox is currently used for layout tests in order to cause 983 // Composite-to-mailbox is currently used for layout tests in order to cause
988 // them to draw inside in the renderer to do the readback there. This should 984 // them to draw inside in the renderer to do the readback there. This should
989 // no longer be the case when crbug.com/311404 is fixed. 985 // no longer be the case when crbug.com/311404 is fixed.
990 DCHECK(IsThreadedCompositingEnabled() || 986 DCHECK(RenderThreadImpl::current()->layout_test_mode());
991 RenderThreadImpl::current()->layout_test_mode());
992 cc::ResourceFormat format = cc::RGBA_8888; 987 cc::ResourceFormat format = cc::RGBA_8888;
993 if (base::SysInfo::IsLowEndDevice()) 988 if (base::SysInfo::IsLowEndDevice())
994 format = cc::RGB_565; 989 format = cc::RGB_565;
995 return scoped_ptr<cc::OutputSurface>( 990 return scoped_ptr<cc::OutputSurface>(
996 new MailboxOutputSurface(routing_id(), 991 new MailboxOutputSurface(routing_id(),
997 output_surface_id, 992 output_surface_id,
998 context_provider, 993 context_provider,
999 scoped_ptr<cc::SoftwareOutputDevice>(), 994 scoped_ptr<cc::SoftwareOutputDevice>(),
1000 frame_swap_message_queue_, 995 frame_swap_message_queue_,
1001 format)); 996 format));
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 void RenderWidget::AutoResizeCompositor() { 1281 void RenderWidget::AutoResizeCompositor() {
1287 physical_backing_size_ = gfx::ToCeiledSize(gfx::ScaleSize(size_, 1282 physical_backing_size_ = gfx::ToCeiledSize(gfx::ScaleSize(size_,
1288 device_scale_factor_)); 1283 device_scale_factor_));
1289 if (compositor_) 1284 if (compositor_)
1290 compositor_->setViewportSize(size_, physical_backing_size_); 1285 compositor_->setViewportSize(size_, physical_backing_size_);
1291 } 1286 }
1292 1287
1293 void RenderWidget::initializeLayerTreeView() { 1288 void RenderWidget::initializeLayerTreeView() {
1294 DCHECK(!host_closing_); 1289 DCHECK(!host_closing_);
1295 1290
1296 compositor_ = 1291 RenderThreadImpl* render_thread = RenderThreadImpl::current();
1297 RenderWidgetCompositor::Create(this, IsThreadedCompositingEnabled()); 1292 // RenderThreadImpl can be null in tests, but is not null for tests that use
1293 // a compositor. For future tests that end up wanting to use a compositor but
1294 // have a null RenderThreadImpl, they should inject a custom
1295 // CompositorDependencies instead of using the default implementation here.
1296 DCHECK(render_thread);
1297
1298 compositor_deps_ =
1299 make_scoped_ptr(new CompositorDependenciesImpl(render_thread));
1300 compositor_ = RenderWidgetCompositor::Create(this, compositor_deps_.get());
1298 compositor_->setViewportSize(size_, physical_backing_size_); 1301 compositor_->setViewportSize(size_, physical_backing_size_);
1299 if (init_complete_) 1302 if (init_complete_)
1300 StartCompositor(); 1303 StartCompositor();
1301 } 1304 }
1302 1305
1303 void RenderWidget::WillCloseLayerTreeView() { 1306 void RenderWidget::WillCloseLayerTreeView() {
1304 if (host_closing_) 1307 if (host_closing_)
1305 return; 1308 return;
1306 1309
1307 // Prevent new compositors or output surfaces from being created. 1310 // Prevent new compositors or output surfaces from being created.
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
2145 UpdateTextInputState(SHOW_IME_IF_NEEDED, FROM_NON_IME); 2148 UpdateTextInputState(SHOW_IME_IF_NEEDED, FROM_NON_IME);
2146 } 2149 }
2147 #endif 2150 #endif
2148 } 2151 }
2149 2152
2150 void RenderWidget::StartCompositor() { 2153 void RenderWidget::StartCompositor() {
2151 // For widgets that are never visible, we don't need the compositor to run 2154 // For widgets that are never visible, we don't need the compositor to run
2152 // at all. 2155 // at all.
2153 if (never_visible_) 2156 if (never_visible_)
2154 return; 2157 return;
2158 // In tests without a RenderThreadImpl, don't set ready as this kicks
2159 // off creating output surfaces that the test can't create.
2160 if (!RenderThreadImpl::current())
2161 return;
2155 compositor_->setSurfaceReady(); 2162 compositor_->setSurfaceReady();
2156 } 2163 }
2157 2164
2158 void RenderWidget::SchedulePluginMove(const WebPluginGeometry& move) { 2165 void RenderWidget::SchedulePluginMove(const WebPluginGeometry& move) {
2159 size_t i = 0; 2166 size_t i = 0;
2160 for (; i < plugin_window_moves_.size(); ++i) { 2167 for (; i < plugin_window_moves_.size(); ++i) {
2161 if (plugin_window_moves_[i].window == move.window) { 2168 if (plugin_window_moves_[i].window == move.window) {
2162 if (move.rects_valid) { 2169 if (move.rects_valid) {
2163 plugin_window_moves_[i] = move; 2170 plugin_window_moves_[i] = move;
2164 } else { 2171 } else {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
2329 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { 2336 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) {
2330 video_hole_frames_.AddObserver(frame); 2337 video_hole_frames_.AddObserver(frame);
2331 } 2338 }
2332 2339
2333 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { 2340 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) {
2334 video_hole_frames_.RemoveObserver(frame); 2341 video_hole_frames_.RemoveObserver(frame);
2335 } 2342 }
2336 #endif // defined(VIDEO_HOLE) 2343 #endif // defined(VIDEO_HOLE)
2337 2344
2338 } // namespace content 2345 } // namespace content
OLDNEW
« content/renderer/gpu/compositor_dependencies_impl.h ('K') | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698