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/debug/trace_event_synthetic_delay.h" | 10 #include "base/debug/trace_event_synthetic_delay.h" |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 ExternalPopupMenu* popup, ScreenMetricsEmulator* emulator) { | 559 ExternalPopupMenu* popup, ScreenMetricsEmulator* emulator) { |
560 popup->SetOriginScaleAndOffsetForEmulation( | 560 popup->SetOriginScaleAndOffsetForEmulation( |
561 emulator->scale(), emulator->offset()); | 561 emulator->scale(), emulator->offset()); |
562 } | 562 } |
563 | 563 |
564 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { | 564 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { |
565 if (screen_metrics_emulator_) | 565 if (screen_metrics_emulator_) |
566 screen_metrics_emulator_->OnShowContextMenu(params); | 566 screen_metrics_emulator_->OnShowContextMenu(params); |
567 } | 567 } |
568 | 568 |
569 void RenderWidget::ScheduleAnimation() { | |
570 if (animation_update_pending_) | |
571 return; | |
572 | |
573 TRACE_EVENT0("gpu", "RenderWidget::ScheduleAnimation"); | |
574 animation_update_pending_ = true; | |
575 if (!animation_timer_.IsRunning()) { | |
576 animation_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(0), this, | |
577 &RenderWidget::AnimationCallback); | |
578 } | |
579 } | |
580 | |
581 void RenderWidget::ScheduleComposite() { | |
582 if (is_accelerated_compositing_active_ && | |
583 RenderThreadImpl::current()->compositor_message_loop_proxy().get()) { | |
584 DCHECK(compositor_); | |
585 compositor_->setNeedsAnimate(); | |
586 } else { | |
587 // TODO(nduca): replace with something a little less hacky. The reason this | |
588 // hack is still used is because the Invalidate-DoDeferredUpdate loop | |
589 // contains a lot of host-renderer synchronization logic that is still | |
590 // important for the accelerated compositing case. The option of simply | |
591 // duplicating all that code is less desirable than "faking out" the | |
592 // invalidation path using a magical damage rect. | |
593 didInvalidateRect(WebRect(0, 0, 1, 1)); | |
594 } | |
595 } | |
596 | |
597 void RenderWidget::ScheduleCompositeWithForcedRedraw() { | 569 void RenderWidget::ScheduleCompositeWithForcedRedraw() { |
598 if (compositor_) { | 570 if (compositor_) { |
599 // Regardless of whether threaded compositing is enabled, always | 571 // Regardless of whether threaded compositing is enabled, always |
600 // use this mechanism to force the compositor to redraw. However, | 572 // use this mechanism to force the compositor to redraw. However, |
601 // the invalidation code path below is still needed for the | 573 // the invalidation code path below is still needed for the |
602 // non-threaded case. | 574 // non-threaded case. |
603 compositor_->SetNeedsForcedRedraw(); | 575 compositor_->SetNeedsForcedRedraw(); |
604 } | 576 } |
605 ScheduleComposite(); | 577 scheduleComposite(); |
606 } | 578 } |
607 | 579 |
608 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { | 580 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
609 bool handled = true; | 581 bool handled = true; |
610 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) | 582 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) |
611 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) | 583 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) |
612 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, | 584 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, |
613 OnCursorVisibilityChange) | 585 OnCursorVisibilityChange) |
614 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) | 586 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) |
615 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) | 587 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 needs_repainting_on_restore_ = false; | 804 needs_repainting_on_restore_ = false; |
833 | 805 |
834 // Tag the next paint as a restore ack, which is picked up by | 806 // Tag the next paint as a restore ack, which is picked up by |
835 // DoDeferredUpdate when it sends out the next PaintRect message. | 807 // DoDeferredUpdate when it sends out the next PaintRect message. |
836 set_next_paint_is_restore_ack(); | 808 set_next_paint_is_restore_ack(); |
837 | 809 |
838 // Generate a full repaint. | 810 // Generate a full repaint. |
839 if (!is_accelerated_compositing_active_) { | 811 if (!is_accelerated_compositing_active_) { |
840 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); | 812 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); |
841 } else { | 813 } else { |
842 ScheduleCompositeWithForcedRedraw(); | 814 if (compositor_) |
| 815 compositor_->SetNeedsForcedRedraw(); |
| 816 scheduleComposite(); |
843 } | 817 } |
844 } | 818 } |
845 | 819 |
846 void RenderWidget::OnWasSwappedOut() { | 820 void RenderWidget::OnWasSwappedOut() { |
847 // If we have been swapped out and no one else is using this process, | 821 // If we have been swapped out and no one else is using this process, |
848 // it's safe to exit now. If we get swapped back in, we will call | 822 // it's safe to exit now. If we get swapped back in, we will call |
849 // AddRefProcess in SetSwappedOut. | 823 // AddRefProcess in SetSwappedOut. |
850 if (is_swapped_out_) | 824 if (is_swapped_out_) |
851 RenderProcess::current()->ReleaseProcess(); | 825 RenderProcess::current()->ReleaseProcess(); |
852 } | 826 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 ViewHostMsg_UpdateRect* msg = updates_pending_swap_.front(); | 966 ViewHostMsg_UpdateRect* msg = updates_pending_swap_.front(); |
993 updates_pending_swap_.pop_front(); | 967 updates_pending_swap_.pop_front(); |
994 // msg can be NULL if the swap doesn't correspond to an DoDeferredUpdate | 968 // msg can be NULL if the swap doesn't correspond to an DoDeferredUpdate |
995 // compositing pass, hence doesn't require an UpdateRect message. | 969 // compositing pass, hence doesn't require an UpdateRect message. |
996 if (msg) | 970 if (msg) |
997 Send(msg); | 971 Send(msg); |
998 } | 972 } |
999 num_swapbuffers_complete_pending_ = 0; | 973 num_swapbuffers_complete_pending_ = 0; |
1000 using_asynchronous_swapbuffers_ = false; | 974 using_asynchronous_swapbuffers_ = false; |
1001 // Schedule another frame so the compositor learns about it. | 975 // Schedule another frame so the compositor learns about it. |
1002 ScheduleComposite(); | 976 scheduleComposite(); |
1003 } | 977 } |
1004 | 978 |
1005 void RenderWidget::OnSwapBuffersPosted() { | 979 void RenderWidget::OnSwapBuffersPosted() { |
1006 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersPosted"); | 980 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersPosted"); |
1007 | 981 |
1008 if (using_asynchronous_swapbuffers_) { | 982 if (using_asynchronous_swapbuffers_) { |
1009 ViewHostMsg_UpdateRect* msg = NULL; | 983 ViewHostMsg_UpdateRect* msg = NULL; |
1010 // pending_update_params_ can be NULL if the swap doesn't correspond to an | 984 // pending_update_params_ can be NULL if the swap doesn't correspond to an |
1011 // DoDeferredUpdate compositing pass, hence doesn't require an UpdateRect | 985 // DoDeferredUpdate compositing pass, hence doesn't require an UpdateRect |
1012 // message. | 986 // message. |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1950 params.flags = next_paint_flags_; | 1924 params.flags = next_paint_flags_; |
1951 params.scroll_offset = GetScrollOffset(); | 1925 params.scroll_offset = GetScrollOffset(); |
1952 params.needs_ack = false; | 1926 params.needs_ack = false; |
1953 params.scale_factor = device_scale_factor_; | 1927 params.scale_factor = device_scale_factor_; |
1954 | 1928 |
1955 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); | 1929 Send(new ViewHostMsg_UpdateRect(routing_id_, params)); |
1956 next_paint_flags_ = 0; | 1930 next_paint_flags_ = 0; |
1957 need_update_rect_for_auto_resize_ = false; | 1931 need_update_rect_for_auto_resize_ = false; |
1958 } | 1932 } |
1959 | 1933 |
1960 // Renamed. Staged for removal. | 1934 void RenderWidget::scheduleComposite() { |
1961 void RenderWidget::scheduleAnimation() { scheduleUpdate(); } | 1935 if (RenderThreadImpl::current()->compositor_message_loop_proxy().get() && |
| 1936 compositor_) { |
| 1937 compositor_->setNeedsAnimate(); |
| 1938 } else { |
| 1939 // TODO(nduca): replace with something a little less hacky. The reason this |
| 1940 // hack is still used is because the Invalidate-DoDeferredUpdate loop |
| 1941 // contains a lot of host-renderer synchronization logic that is still |
| 1942 // important for the accelerated compositing case. The option of simply |
| 1943 // duplicating all that code is less desirable than "faking out" the |
| 1944 // invalidation path using a magical damage rect. |
| 1945 didInvalidateRect(WebRect(0, 0, 1, 1)); |
| 1946 } |
| 1947 } |
1962 | 1948 |
1963 void RenderWidget::scheduleUpdate() { | 1949 void RenderWidget::scheduleAnimation() { |
1964 if (is_accelerated_compositing_active_) { | 1950 if (animation_update_pending_) |
1965 DCHECK(compositor_); | 1951 return; |
1966 compositor_->setNeedsUpdateLayers(); | 1952 |
1967 } else { | 1953 TRACE_EVENT0("gpu", "RenderWidget::scheduleAnimation"); |
1968 ScheduleAnimation(); | 1954 animation_update_pending_ = true; |
| 1955 if (!animation_timer_.IsRunning()) { |
| 1956 animation_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(0), this, |
| 1957 &RenderWidget::AnimationCallback); |
1969 } | 1958 } |
1970 } | 1959 } |
1971 | 1960 |
1972 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { | 1961 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { |
1973 // TODO(darin): Eliminate this temporary. | 1962 // TODO(darin): Eliminate this temporary. |
1974 WebCursor cursor; | 1963 WebCursor cursor; |
1975 InitializeCursorFromWebKitCursorInfo(&cursor, cursor_info); | 1964 InitializeCursorFromWebKitCursorInfo(&cursor, cursor_info); |
1976 // Only send a SetCursor message if we need to make a change. | 1965 // Only send a SetCursor message if we need to make a change. |
1977 if (!current_cursor_.IsEqual(cursor)) { | 1966 if (!current_cursor_.IsEqual(cursor)) { |
1978 current_cursor_ = cursor; | 1967 current_cursor_ = cursor; |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2364 | 2353 |
2365 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { | 2354 void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { |
2366 if (device_scale_factor_ == device_scale_factor) | 2355 if (device_scale_factor_ == device_scale_factor) |
2367 return; | 2356 return; |
2368 | 2357 |
2369 device_scale_factor_ = device_scale_factor; | 2358 device_scale_factor_ = device_scale_factor; |
2370 | 2359 |
2371 if (!is_accelerated_compositing_active_) { | 2360 if (!is_accelerated_compositing_active_) { |
2372 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); | 2361 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); |
2373 } else { | 2362 } else { |
2374 ScheduleComposite(); | 2363 scheduleComposite(); |
2375 } | 2364 } |
2376 } | 2365 } |
2377 | 2366 |
2378 PepperPluginInstanceImpl* RenderWidget::GetBitmapForOptimizedPluginPaint( | 2367 PepperPluginInstanceImpl* RenderWidget::GetBitmapForOptimizedPluginPaint( |
2379 const gfx::Rect& paint_bounds, | 2368 const gfx::Rect& paint_bounds, |
2380 TransportDIB** dib, | 2369 TransportDIB** dib, |
2381 gfx::Rect* location, | 2370 gfx::Rect* location, |
2382 gfx::Rect* clip, | 2371 gfx::Rect* clip, |
2383 float* scale_factor) { | 2372 float* scale_factor) { |
2384 // Bare RenderWidgets don't support optimized plugin painting. | 2373 // Bare RenderWidgets don't support optimized plugin painting. |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2884 surface_id(), | 2873 surface_id(), |
2885 GetURLForGraphicsContext3D(), | 2874 GetURLForGraphicsContext3D(), |
2886 gpu_channel_host.get(), | 2875 gpu_channel_host.get(), |
2887 attributes, | 2876 attributes, |
2888 false /* bind generates resources */, | 2877 false /* bind generates resources */, |
2889 limits)); | 2878 limits)); |
2890 return context.Pass(); | 2879 return context.Pass(); |
2891 } | 2880 } |
2892 | 2881 |
2893 } // namespace content | 2882 } // namespace content |
OLD | NEW |