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