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_widget.h" | 5 #include "content/renderer/render_widget.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
17 #include "content/common/swapped_out_messages.h" | 17 #include "content/common/swapped_out_messages.h" |
18 #include "content/common/view_messages.h" | 18 #include "content/common/view_messages.h" |
| 19 #include "content/public/common/compositor_util.h" |
19 #include "content/public/common/content_switches.h" | 20 #include "content/public/common/content_switches.h" |
20 #include "content/renderer/render_process.h" | 21 #include "content/renderer/render_process.h" |
21 #include "content/renderer/render_thread_impl.h" | 22 #include "content/renderer/render_thread_impl.h" |
22 #include "content/renderer/renderer_webkitplatformsupport_impl.h" | 23 #include "content/renderer/renderer_webkitplatformsupport_impl.h" |
23 #include "ipc/ipc_sync_message.h" | 24 #include "ipc/ipc_sync_message.h" |
24 #include "skia/ext/platform_canvas.h" | 25 #include "skia/ext/platform_canvas.h" |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" | 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebHelperPlugin.h" | 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebHelperPlugin.h" |
27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPagePopup.h" | 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPagePopup.h" |
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" | 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 | 200 |
200 // This is used to complete pending inits and non-pending inits. For non- | 201 // This is used to complete pending inits and non-pending inits. For non- |
201 // pending cases, the parent will be the same as the current parent. This | 202 // pending cases, the parent will be the same as the current parent. This |
202 // indicates we do not need to reparent or anything. | 203 // indicates we do not need to reparent or anything. |
203 void RenderWidget::CompleteInit(gfx::NativeViewId parent_hwnd) { | 204 void RenderWidget::CompleteInit(gfx::NativeViewId parent_hwnd) { |
204 DCHECK(routing_id_ != MSG_ROUTING_NONE); | 205 DCHECK(routing_id_ != MSG_ROUTING_NONE); |
205 | 206 |
206 host_window_ = parent_hwnd; | 207 host_window_ = parent_hwnd; |
207 host_window_set_ = true; | 208 host_window_set_ = true; |
208 | 209 |
209 #if WEBWIDGET_HAS_SETCOMPOSITORSURFACEREADY | 210 if (webwidget_) { |
210 if (webwidget_) | 211 webwidget_->setCompositorSurfaceReady(); |
211 webwidget_->setCompositorSurfaceReady(); | 212 if (IsThreadedCompositingEnabled()) |
212 #endif | 213 webwidget_->enterForceCompositingMode(true); |
| 214 } |
213 DoDeferredUpdate(); | 215 DoDeferredUpdate(); |
214 | 216 |
215 Send(new ViewHostMsg_RenderViewReady(routing_id_)); | 217 Send(new ViewHostMsg_RenderViewReady(routing_id_)); |
216 } | 218 } |
217 | 219 |
218 void RenderWidget::SetSwappedOut(bool is_swapped_out) { | 220 void RenderWidget::SetSwappedOut(bool is_swapped_out) { |
219 // We should only toggle between states. | 221 // We should only toggle between states. |
220 DCHECK(is_swapped_out_ != is_swapped_out); | 222 DCHECK(is_swapped_out_ != is_swapped_out); |
221 is_swapped_out_ = is_swapped_out; | 223 is_swapped_out_ = is_swapped_out; |
222 | 224 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 } | 461 } |
460 | 462 |
461 // Continue painting if necessary... | 463 // Continue painting if necessary... |
462 DoDeferredUpdateAndSendInputAck(); | 464 DoDeferredUpdateAndSendInputAck(); |
463 } | 465 } |
464 | 466 |
465 bool RenderWidget::SupportsAsynchronousSwapBuffers() { | 467 bool RenderWidget::SupportsAsynchronousSwapBuffers() { |
466 return false; | 468 return false; |
467 } | 469 } |
468 | 470 |
| 471 bool RenderWidget::ForceCompositingModeEnabled() { |
| 472 return false; |
| 473 } |
| 474 |
469 void RenderWidget::OnSwapBuffersAborted() { | 475 void RenderWidget::OnSwapBuffersAborted() { |
470 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersAborted"); | 476 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersAborted"); |
471 while (!updates_pending_swap_.empty()) { | 477 while (!updates_pending_swap_.empty()) { |
472 ViewHostMsg_UpdateRect* msg = updates_pending_swap_.front(); | 478 ViewHostMsg_UpdateRect* msg = updates_pending_swap_.front(); |
473 updates_pending_swap_.pop_front(); | 479 updates_pending_swap_.pop_front(); |
474 // msg can be NULL if the swap doesn't correspond to an DoDeferredUpdate | 480 // msg can be NULL if the swap doesn't correspond to an DoDeferredUpdate |
475 // compositing pass, hence doesn't require an UpdateRect message. | 481 // compositing pass, hence doesn't require an UpdateRect message. |
476 if (msg) | 482 if (msg) |
477 Send(msg); | 483 Send(msg); |
478 } | 484 } |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 UpdateSelectionBounds(); | 902 UpdateSelectionBounds(); |
897 | 903 |
898 // Suppress painting if nothing is dirty. This has to be done after updating | 904 // Suppress painting if nothing is dirty. This has to be done after updating |
899 // animations running layout as these may generate further invalidations. | 905 // animations running layout as these may generate further invalidations. |
900 if (!paint_aggregator_.HasPendingUpdate()) { | 906 if (!paint_aggregator_.HasPendingUpdate()) { |
901 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate"); | 907 TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate"); |
902 webwidget_->instrumentCancelFrame(); | 908 webwidget_->instrumentCancelFrame(); |
903 return; | 909 return; |
904 } | 910 } |
905 | 911 |
| 912 if (!is_accelerated_compositing_active_ && |
| 913 !IsThreadedCompositingEnabled() && |
| 914 ForceCompositingModeEnabled()) { |
| 915 webwidget_->enterForceCompositingMode(true); |
| 916 } |
| 917 |
906 if (!last_do_deferred_update_time_.is_null()) { | 918 if (!last_do_deferred_update_time_.is_null()) { |
907 base::TimeDelta delay = frame_begin_ticks - last_do_deferred_update_time_; | 919 base::TimeDelta delay = frame_begin_ticks - last_do_deferred_update_time_; |
908 if (is_accelerated_compositing_active_) { | 920 if (is_accelerated_compositing_active_) { |
909 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AccelDoDeferredUpdateDelay", | 921 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.AccelDoDeferredUpdateDelay", |
910 delay, | 922 delay, |
911 base::TimeDelta::FromMilliseconds(1), | 923 base::TimeDelta::FromMilliseconds(1), |
912 base::TimeDelta::FromMilliseconds(120), | 924 base::TimeDelta::FromMilliseconds(120), |
913 60); | 925 60); |
914 } else { | 926 } else { |
915 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.SoftwareDoDeferredUpdateDelay", | 927 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer4.SoftwareDoDeferredUpdateDelay", |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 | 1067 |
1056 // If we're software rendering then we're done initiating the paint. | 1068 // If we're software rendering then we're done initiating the paint. |
1057 if (!is_accelerated_compositing_active_) | 1069 if (!is_accelerated_compositing_active_) |
1058 DidInitiatePaint(); | 1070 DidInitiatePaint(); |
1059 } | 1071 } |
1060 | 1072 |
1061 /////////////////////////////////////////////////////////////////////////////// | 1073 /////////////////////////////////////////////////////////////////////////////// |
1062 // WebWidgetClient | 1074 // WebWidgetClient |
1063 | 1075 |
1064 void RenderWidget::didInvalidateRect(const WebRect& rect) { | 1076 void RenderWidget::didInvalidateRect(const WebRect& rect) { |
| 1077 TRACE_EVENT2("renderer", "RenderWidget::didInvalidateRect", |
| 1078 "width", rect.width, "height", rect.height); |
1065 // The invalidated rect might be outside the bounds of the view. | 1079 // The invalidated rect might be outside the bounds of the view. |
1066 gfx::Rect view_rect(size_); | 1080 gfx::Rect view_rect(size_); |
1067 gfx::Rect damaged_rect = view_rect; | 1081 gfx::Rect damaged_rect = view_rect; |
1068 damaged_rect.Intersect(rect); | 1082 damaged_rect.Intersect(rect); |
1069 if (damaged_rect.IsEmpty()) | 1083 if (damaged_rect.IsEmpty()) |
1070 return; | 1084 return; |
1071 | 1085 |
1072 paint_aggregator_.InvalidateRect(damaged_rect); | 1086 paint_aggregator_.InvalidateRect(damaged_rect); |
1073 | 1087 |
1074 // We may not need to schedule another call to DoDeferredUpdate. | 1088 // We may not need to schedule another call to DoDeferredUpdate. |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 | 1184 |
1171 void RenderWidget::didDeactivateCompositor() { | 1185 void RenderWidget::didDeactivateCompositor() { |
1172 TRACE_EVENT0("gpu", "RenderWidget::didDeactivateCompositor"); | 1186 TRACE_EVENT0("gpu", "RenderWidget::didDeactivateCompositor"); |
1173 | 1187 |
1174 is_accelerated_compositing_active_ = false; | 1188 is_accelerated_compositing_active_ = false; |
1175 Send(new ViewHostMsg_DidActivateAcceleratedCompositing( | 1189 Send(new ViewHostMsg_DidActivateAcceleratedCompositing( |
1176 routing_id_, is_accelerated_compositing_active_)); | 1190 routing_id_, is_accelerated_compositing_active_)); |
1177 | 1191 |
1178 if (using_asynchronous_swapbuffers_) | 1192 if (using_asynchronous_swapbuffers_) |
1179 using_asynchronous_swapbuffers_ = false; | 1193 using_asynchronous_swapbuffers_ = false; |
| 1194 |
| 1195 // In single-threaded mode, we exit force compositing mode and re-enter in |
| 1196 // DoDeferredUpdate() if appropriate. In threaded compositing mode, |
| 1197 // DoDeferredUpdate() is bypassed and WebKit is responsible for exiting and |
| 1198 // entering force compositing mode at the appropriate times. |
| 1199 if (!IsThreadedCompositingEnabled()) |
| 1200 webwidget_->enterForceCompositingMode(false); |
1180 } | 1201 } |
1181 | 1202 |
1182 void RenderWidget::willBeginCompositorFrame() { | 1203 void RenderWidget::willBeginCompositorFrame() { |
1183 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); | 1204 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); |
1184 | 1205 |
1185 DCHECK(RenderThreadImpl::current()->compositor_thread()); | 1206 DCHECK(RenderThreadImpl::current()->compositor_thread()); |
1186 | 1207 |
1187 // The following two can result in further layout and possibly | 1208 // The following two can result in further layout and possibly |
1188 // enable GPU acceleration so they need to be called before any painting | 1209 // enable GPU acceleration so they need to be called before any painting |
1189 // is done. | 1210 // is done. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 params.scroll_offset = GetScrollOffset(); | 1251 params.scroll_offset = GetScrollOffset(); |
1231 params.needs_ack = false; | 1252 params.needs_ack = false; |
1232 params.scale_factor = device_scale_factor_; | 1253 params.scale_factor = device_scale_factor_; |
1233 | 1254 |
1234 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); | 1255 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); |
1235 next_paint_flags_ = 0; | 1256 next_paint_flags_ = 0; |
1236 need_update_rect_for_auto_resize_ = false; | 1257 need_update_rect_for_auto_resize_ = false; |
1237 } | 1258 } |
1238 | 1259 |
1239 void RenderWidget::scheduleComposite() { | 1260 void RenderWidget::scheduleComposite() { |
| 1261 TRACE_EVENT0("gpu", "RenderWidget::scheduleComposite"); |
1240 if (WebWidgetHandlesCompositorScheduling()) { | 1262 if (WebWidgetHandlesCompositorScheduling()) { |
1241 webwidget_->composite(false); | 1263 webwidget_->composite(false); |
1242 } else { | 1264 } else { |
1243 // TODO(nduca): replace with something a little less hacky. The reason this | 1265 // TODO(nduca): replace with something a little less hacky. The reason this |
1244 // hack is still used is because the Invalidate-DoDeferredUpdate loop | 1266 // hack is still used is because the Invalidate-DoDeferredUpdate loop |
1245 // contains a lot of host-renderer synchronization logic that is still | 1267 // contains a lot of host-renderer synchronization logic that is still |
1246 // important for the accelerated compositing case. The option of simply | 1268 // important for the accelerated compositing case. The option of simply |
1247 // duplicating all that code is less desirable than "faking out" the | 1269 // duplicating all that code is less desirable than "faking out" the |
1248 // invalidation path using a magical damage rect. | 1270 // invalidation path using a magical damage rect. |
1249 didInvalidateRect(WebRect(0, 0, 1, 1)); | 1271 didInvalidateRect(WebRect(0, 0, 1, 1)); |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1902 | 1924 |
1903 bool RenderWidget::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { | 1925 bool RenderWidget::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { |
1904 return false; | 1926 return false; |
1905 } | 1927 } |
1906 | 1928 |
1907 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const { | 1929 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const { |
1908 return false; | 1930 return false; |
1909 } | 1931 } |
1910 | 1932 |
1911 } // namespace content | 1933 } // namespace content |
OLD | NEW |