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" |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
818 DoDeferredUpdateAndSendInputAck(); | 818 DoDeferredUpdateAndSendInputAck(); |
819 } | 819 } |
820 | 820 |
821 void RenderWidget::DoDeferredUpdateAndSendInputAck() { | 821 void RenderWidget::DoDeferredUpdateAndSendInputAck() { |
822 DoDeferredUpdate(); | 822 DoDeferredUpdate(); |
823 | 823 |
824 if (pending_input_event_ack_.get()) | 824 if (pending_input_event_ack_.get()) |
825 Send(pending_input_event_ack_.release()); | 825 Send(pending_input_event_ack_.release()); |
826 } | 826 } |
827 | 827 |
828 bool RenderWidget::CanDoDeferredUpdate() const { | |
829 if (!webwidget_) { | |
830 TRACE_EVENT0("renderer", "EarlyOut_NoWebWidget"); | |
831 return false; | |
832 } | |
833 if (!host_window_set_) { | |
834 TRACE_EVENT0("renderer", "EarlyOut_NoHostWindow"); | |
835 return false; | |
836 } | |
837 if (update_reply_pending_) { | |
838 TRACE_EVENT0("renderer", "EarlyOut_UpdateReplyPending"); | |
839 return false; | |
840 } | |
841 if (is_accelerated_compositing_active_ && | |
842 num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending) { | |
843 TRACE_EVENT0("renderer", "EarlyOut_MaxSwapBuffersPending"); | |
844 return false; | |
845 } | |
846 return true; | |
847 } | |
848 | |
849 bool RenderWidget::ShouldSuppressDeferredUpdates() const { | |
850 return is_hidden_ || size_.IsEmpty(); | |
851 } | |
852 | |
828 void RenderWidget::DoDeferredUpdate() { | 853 void RenderWidget::DoDeferredUpdate() { |
829 TRACE_EVENT0("renderer", "RenderWidget::DoDeferredUpdate"); | 854 TRACE_EVENT0("renderer", "RenderWidget::DoDeferredUpdate"); |
830 | 855 |
831 if (!webwidget_) | 856 if (!CanDoDeferredUpdate()) |
832 return; | 857 return; |
833 | 858 |
834 if (!host_window_set_) { | |
835 TRACE_EVENT0("renderer", "EarlyOut_NoHostWindow"); | |
836 return; | |
837 } | |
838 if (update_reply_pending_) { | |
839 TRACE_EVENT0("renderer", "EarlyOut_UpdateReplyPending"); | |
840 return; | |
841 } | |
842 if (is_accelerated_compositing_active_ && | |
843 num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending) { | |
844 TRACE_EVENT0("renderer", "EarlyOut_MaxSwapBuffersPending"); | |
845 return; | |
846 } | |
847 | |
848 // Suppress updating when we are hidden. | 859 // Suppress updating when we are hidden. |
849 if (is_hidden_ || size_.IsEmpty()) { | 860 if (ShouldSuppressDeferredUpdates()) { |
850 paint_aggregator_.ClearPendingUpdate(); | 861 paint_aggregator_.ClearPendingUpdate(); |
851 needs_repainting_on_restore_ = true; | 862 needs_repainting_on_restore_ = true; |
852 TRACE_EVENT0("renderer", "EarlyOut_NotVisible"); | 863 TRACE_EVENT0("renderer", "EarlyOut_NotVisible"); |
853 return; | 864 return; |
854 } | 865 } |
855 | 866 |
856 if (is_accelerated_compositing_active_) | 867 if (is_accelerated_compositing_active_) |
857 using_asynchronous_swapbuffers_ = SupportsAsynchronousSwapBuffers(); | 868 using_asynchronous_swapbuffers_ = SupportsAsynchronousSwapBuffers(); |
858 | 869 |
859 // Tracking of frame rate jitter | 870 // Tracking of frame rate jitter |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1177 params.view_size = size_; | 1188 params.view_size = size_; |
1178 params.plugin_window_moves.swap(plugin_window_moves_); | 1189 params.plugin_window_moves.swap(plugin_window_moves_); |
1179 params.flags = next_paint_flags_; | 1190 params.flags = next_paint_flags_; |
1180 params.scroll_offset = GetScrollOffset(); | 1191 params.scroll_offset = GetScrollOffset(); |
1181 params.needs_ack = false; | 1192 params.needs_ack = false; |
1182 | 1193 |
1183 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); | 1194 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); |
1184 next_paint_flags_ = 0; | 1195 next_paint_flags_ = 0; |
1185 } | 1196 } |
1186 | 1197 |
1187 void RenderWidget::scheduleComposite() { | 1198 #if defined(WEBWIDGETCLIENT_SCHEDULECOMPOSITE_RETURNS_BOOL) |
1199 #define SC_RETURN_TYPE bool | |
1200 #else | |
1201 #define SC_RETURN_TYPE void | |
1202 #endif | |
1203 | |
1204 SC_RETURN_TYPE RenderWidget::scheduleComposite() { | |
1188 if (WebWidgetHandlesCompositorScheduling()) { | 1205 if (WebWidgetHandlesCompositorScheduling()) { |
1189 webwidget_->composite(false); | 1206 webwidget_->composite(false); |
1207 #if defined(WEBWIDGETCLIENT_SCHEDULECOMPOSITE_RETURNS_BOOL) | |
1208 return true; | |
1209 #endif | |
1190 } else { | 1210 } else { |
1191 // TODO(nduca): replace with something a little less hacky. The reason this | 1211 // TODO(nduca): replace with something a little less hacky. The reason this |
1192 // hack is still used is because the Invalidate-DoDeferredUpdate loop | 1212 // hack is still used is because the Invalidate-DoDeferredUpdate loop |
1193 // contains a lot of host-renderer synchronization logic that is still | 1213 // contains a lot of host-renderer synchronization logic that is still |
1194 // important for the accelerated compositing case. The option of simply | 1214 // important for the accelerated compositing case. The option of simply |
1195 // duplicating all that code is less desirable than "faking out" the | 1215 // duplicating all that code is less desirable than "faking out" the |
1196 // invalidation path using a magical damage rect. | 1216 // invalidation path using a magical damage rect. |
1197 didInvalidateRect(WebRect(0, 0, 1, 1)); | 1217 didInvalidateRect(WebRect(0, 0, 1, 1)); |
1218 #if defined(WEBWIDGETCLIENT_SCHEDULECOMPOSITE_RETURNS_BOOL) | |
1219 return CanDoDeferredUpdate() && !ShouldSuppressDeferredUpdates(); | |
jamesr
2012/05/08 23:42:40
what happens if ShouldSuppress...() is false, but
| |
1220 #endif | |
1198 } | 1221 } |
1199 } | 1222 } |
1200 | 1223 |
1201 void RenderWidget::scheduleAnimation() { | 1224 void RenderWidget::scheduleAnimation() { |
1202 if (animation_update_pending_) | 1225 if (animation_update_pending_) |
1203 return; | 1226 return; |
1204 | 1227 |
1205 TRACE_EVENT0("gpu", "RenderWidget::scheduleAnimation"); | 1228 TRACE_EVENT0("gpu", "RenderWidget::scheduleAnimation"); |
1206 animation_update_pending_ = true; | 1229 animation_update_pending_ = true; |
1207 if (!animation_timer_.IsRunning()) { | 1230 if (!animation_timer_.IsRunning()) { |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1719 } | 1742 } |
1720 } | 1743 } |
1721 | 1744 |
1722 bool RenderWidget::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { | 1745 bool RenderWidget::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { |
1723 return false; | 1746 return false; |
1724 } | 1747 } |
1725 | 1748 |
1726 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const { | 1749 bool RenderWidget::WebWidgetHandlesCompositorScheduling() const { |
1727 return false; | 1750 return false; |
1728 } | 1751 } |
OLD | NEW |