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

Side by Side Diff: chrome/browser/renderer_host/render_widget_host.cc

Issue 4815001: Use inner HWND for accelerated rendering on windows (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/renderer_host/render_widget_host.h" 5 #include "chrome/browser/renderer_host/render_widget_host.h"
6 6
7 #include "app/keyboard_codes.h" 7 #include "app/keyboard_codes.h"
8 #include "base/auto_reset.h" 8 #include "base/auto_reset.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, 70 RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process,
71 int routing_id) 71 int routing_id)
72 : renderer_initialized_(false), 72 : renderer_initialized_(false),
73 renderer_accessible_(false), 73 renderer_accessible_(false),
74 view_(NULL), 74 view_(NULL),
75 process_(process), 75 process_(process),
76 painting_observer_(NULL), 76 painting_observer_(NULL),
77 routing_id_(routing_id), 77 routing_id_(routing_id),
78 is_loading_(false), 78 is_loading_(false),
79 is_hidden_(false), 79 is_hidden_(false),
80 is_gpu_rendering_active_(false), 80 is_accelerated_compositing_active_(false),
81 repaint_ack_pending_(false), 81 repaint_ack_pending_(false),
82 resize_ack_pending_(false), 82 resize_ack_pending_(false),
83 mouse_move_pending_(false), 83 mouse_move_pending_(false),
84 mouse_wheel_pending_(false), 84 mouse_wheel_pending_(false),
85 needs_repainting_on_restore_(false), 85 needs_repainting_on_restore_(false),
86 is_unresponsive_(false), 86 is_unresponsive_(false),
87 in_get_backing_store_(false), 87 in_get_backing_store_(false),
88 view_being_painted_(false), 88 view_being_painted_(false),
89 ignore_input_events_(false), 89 ignore_input_events_(false),
90 text_direction_updated_(false), 90 text_direction_updated_(false),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 IPC_MESSAGE_HANDLER(ViewHostMsg_PaintAtSize_ACK, OnMsgPaintAtSizeAck) 150 IPC_MESSAGE_HANDLER(ViewHostMsg_PaintAtSize_ACK, OnMsgPaintAtSizeAck)
151 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnMsgUpdateRect) 151 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnMsgUpdateRect)
152 IPC_MESSAGE_HANDLER(ViewHostMsg_HandleInputEvent_ACK, OnMsgInputEventAck) 152 IPC_MESSAGE_HANDLER(ViewHostMsg_HandleInputEvent_ACK, OnMsgInputEventAck)
153 IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnMsgFocus) 153 IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnMsgFocus)
154 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur) 154 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur)
155 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor) 155 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor)
156 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState, 156 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState,
157 OnMsgImeUpdateTextInputState) 157 OnMsgImeUpdateTextInputState)
158 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, 158 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition,
159 OnMsgImeCancelComposition) 159 OnMsgImeCancelComposition)
160 IPC_MESSAGE_HANDLER(ViewHostMsg_GpuRenderingActivated, 160 IPC_MESSAGE_HANDLER(ViewHostMsg_DidActivateAcceleratedCompositing,
161 OnMsgGpuRenderingActivated) 161 OnMsgDidActivateAcceleratedCompositing)
162 #if defined(OS_MACOSX) 162 #if defined(OS_MACOSX)
163 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo) 163 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo)
164 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect) 164 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect)
165 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect) 165 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect)
166 IPC_MESSAGE_HANDLER(ViewHostMsg_SetPluginImeEnabled, 166 IPC_MESSAGE_HANDLER(ViewHostMsg_SetPluginImeEnabled,
167 OnMsgSetPluginImeEnabled) 167 OnMsgSetPluginImeEnabled)
168 IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateFakePluginWindowHandle, 168 IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateFakePluginWindowHandle,
169 OnAllocateFakePluginWindowHandle) 169 OnAllocateFakePluginWindowHandle)
170 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyFakePluginWindowHandle, 170 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyFakePluginWindowHandle,
171 OnDestroyFakePluginWindowHandle) 171 OnDestroyFakePluginWindowHandle)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 return; 225 return;
226 is_hidden_ = false; 226 is_hidden_ = false;
227 227
228 BackingStore* backing_store = BackingStoreManager::Lookup(this); 228 BackingStore* backing_store = BackingStoreManager::Lookup(this);
229 // If we already have a backing store for this widget, then we don't need to 229 // If we already have a backing store for this widget, then we don't need to
230 // repaint on restore _unless_ we know that our backing store is invalid. 230 // repaint on restore _unless_ we know that our backing store is invalid.
231 // When accelerated compositing is on, we must always repaint, even when 231 // When accelerated compositing is on, we must always repaint, even when
232 // the backing store exists. 232 // the backing store exists.
233 bool needs_repainting; 233 bool needs_repainting;
234 if (needs_repainting_on_restore_ || !backing_store || 234 if (needs_repainting_on_restore_ || !backing_store ||
235 is_gpu_rendering_active()) { 235 is_accelerated_compositing_active()) {
236 needs_repainting = true; 236 needs_repainting = true;
237 needs_repainting_on_restore_ = false; 237 needs_repainting_on_restore_ = false;
238 } else { 238 } else {
239 needs_repainting = false; 239 needs_repainting = false;
240 } 240 }
241 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting)); 241 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting));
242 242
243 process_->WidgetRestored(); 243 process_->WidgetRestored();
244 244
245 bool is_visible = true; 245 bool is_visible = true;
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 if (!view_) 376 if (!view_)
377 return NULL; 377 return NULL;
378 return view_->AllocBackingStore(size); 378 return view_->AllocBackingStore(size);
379 } 379 }
380 380
381 void RenderWidgetHost::DonePaintingToBackingStore() { 381 void RenderWidgetHost::DonePaintingToBackingStore() {
382 Send(new ViewMsg_UpdateRect_ACK(routing_id())); 382 Send(new ViewMsg_UpdateRect_ACK(routing_id()));
383 } 383 }
384 384
385 void RenderWidgetHost::ScheduleComposite() { 385 void RenderWidgetHost::ScheduleComposite() {
386 DCHECK(!is_hidden_ || !is_gpu_rendering_active_) << 386 if (is_hidden_ || !is_accelerated_compositing_active_) {
387 "ScheduleCompositeAndSync called while hidden!"; 387 return;
388 }
388 389
389 // Send out a request to the renderer to paint the view if required. 390 // Send out a request to the renderer to paint the view if required.
390 if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { 391 if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) {
391 repaint_start_time_ = TimeTicks::Now(); 392 repaint_start_time_ = TimeTicks::Now();
392 repaint_ack_pending_ = true; 393 repaint_ack_pending_ = true;
393 Send(new ViewMsg_Repaint(routing_id_, current_size_)); 394 Send(new ViewMsg_Repaint(routing_id_, current_size_));
394 } 395 }
395 396
396 // When we have asked the RenderWidget to resize, and we are still waiting on 397 // When we have asked the RenderWidget to resize, and we are still waiting on
397 // a response, block for a little while to see if we can't get a response. 398 // a response, block for a little while to see if we can't get a response.
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 626
626 // Reset some fields in preparation for recovering from a crash. 627 // Reset some fields in preparation for recovering from a crash.
627 resize_ack_pending_ = false; 628 resize_ack_pending_ = false;
628 repaint_ack_pending_ = false; 629 repaint_ack_pending_ = false;
629 630
630 in_flight_size_.SetSize(0, 0); 631 in_flight_size_.SetSize(0, 0);
631 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); 632 in_flight_reserved_rect_.SetRect(0, 0, 0, 0);
632 current_size_.SetSize(0, 0); 633 current_size_.SetSize(0, 0);
633 current_reserved_rect_.SetRect(0, 0, 0, 0); 634 current_reserved_rect_.SetRect(0, 0, 0, 0);
634 is_hidden_ = false; 635 is_hidden_ = false;
635 is_gpu_rendering_active_ = false; 636 is_accelerated_compositing_active_ = false;
636 637
637 if (view_) { 638 if (view_) {
638 view_->RenderViewGone(); 639 view_->RenderViewGone();
639 view_ = NULL; // The View should be deleted by RenderViewGone. 640 view_ = NULL; // The View should be deleted by RenderViewGone.
640 } 641 }
641 642
642 BackingStoreManager::RemoveBackingStore(this); 643 BackingStoreManager::RemoveBackingStore(this);
643 } 644 }
644 645
645 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) { 646 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); 794 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags);
794 if (is_repaint_ack) { 795 if (is_repaint_ack) {
795 repaint_ack_pending_ = false; 796 repaint_ack_pending_ = false;
796 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; 797 TimeDelta delta = TimeTicks::Now() - repaint_start_time_;
797 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); 798 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta);
798 } 799 }
799 800
800 DCHECK(!params.bitmap_rect.IsEmpty()); 801 DCHECK(!params.bitmap_rect.IsEmpty());
801 DCHECK(!params.view_size.IsEmpty()); 802 DCHECK(!params.view_size.IsEmpty());
802 803
803 if (!is_gpu_rendering_active_) { 804 if (!is_accelerated_compositing_active_) {
804 const size_t size = params.bitmap_rect.height() * 805 const size_t size = params.bitmap_rect.height() *
805 params.bitmap_rect.width() * 4; 806 params.bitmap_rect.width() * 4;
806 TransportDIB* dib = process_->GetTransportDIB(params.bitmap); 807 TransportDIB* dib = process_->GetTransportDIB(params.bitmap);
807 808
808 // If gpu process does painting, scroll_rect and copy_rects are always empty 809 // If gpu process does painting, scroll_rect and copy_rects are always empty
809 // and backing store is never used. 810 // and backing store is never used.
810 if (dib) { 811 if (dib) {
811 if (dib->size() < size) { 812 if (dib->size() < size) {
812 DLOG(WARNING) << "Transport DIB too small for given rectangle"; 813 DLOG(WARNING) << "Transport DIB too small for given rectangle";
813 process()->ReceivedBadMessage(ViewHostMsg_UpdateRect__ID); 814 process()->ReceivedBadMessage(ViewHostMsg_UpdateRect__ID);
(...skipping 26 matching lines...) Expand all
840 if (is_hidden_) 841 if (is_hidden_)
841 return; 842 return;
842 843
843 // Now paint the view. Watch out: it might be destroyed already. 844 // Now paint the view. Watch out: it might be destroyed already.
844 if (view_) { 845 if (view_) {
845 view_->MovePluginWindows(params.plugin_window_moves); 846 view_->MovePluginWindows(params.plugin_window_moves);
846 // The view_ pointer could be destroyed in the context of MovePluginWindows 847 // The view_ pointer could be destroyed in the context of MovePluginWindows
847 // which attempts to move the plugin windows and in the process could 848 // which attempts to move the plugin windows and in the process could
848 // dispatch other window messages which could cause the view to be 849 // dispatch other window messages which could cause the view to be
849 // destroyed. 850 // destroyed.
850 if (view_ && !is_gpu_rendering_active_) { 851 if (view_ && !is_accelerated_compositing_active_) {
851 view_being_painted_ = true; 852 view_being_painted_ = true;
852 view_->DidUpdateBackingStore(params.scroll_rect, params.dx, params.dy, 853 view_->DidUpdateBackingStore(params.scroll_rect, params.dx, params.dy,
853 params.copy_rects); 854 params.copy_rects);
854 view_being_painted_ = false; 855 view_being_painted_ = false;
855 } 856 }
856 } 857 }
857 858
858 if (paint_observer_.get()) 859 if (paint_observer_.get())
859 paint_observer_->RenderWidgetHostDidPaint(this); 860 paint_observer_->RenderWidgetHostDidPaint(this);
860 861
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 const gfx::Rect& caret_rect) { 939 const gfx::Rect& caret_rect) {
939 if (view_) 940 if (view_)
940 view_->ImeUpdateTextInputState(type, caret_rect); 941 view_->ImeUpdateTextInputState(type, caret_rect);
941 } 942 }
942 943
943 void RenderWidgetHost::OnMsgImeCancelComposition() { 944 void RenderWidgetHost::OnMsgImeCancelComposition() {
944 if (view_) 945 if (view_)
945 view_->ImeCancelComposition(); 946 view_->ImeCancelComposition();
946 } 947 }
947 948
948 void RenderWidgetHost::OnMsgGpuRenderingActivated(bool activated) { 949 void RenderWidgetHost::OnMsgDidActivateAcceleratedCompositing(bool activated) {
949 #if defined(OS_MACOSX) 950 #if defined(OS_MACOSX)
950 bool old_state = is_gpu_rendering_active_; 951 bool old_state = is_accelerated_compositing_active_;
951 #endif 952 #endif
952 is_gpu_rendering_active_ = activated; 953 is_accelerated_compositing_active_ = activated;
953 #if defined(OS_MACOSX) 954 #if defined(OS_MACOSX)
954 if (old_state != is_gpu_rendering_active_ && view_) 955 if (old_state != is_accelerated_compositing_active_ && view_)
955 view_->GpuRenderingStateDidChange(); 956 view_->GpuRenderingStateDidChange();
957 #elif defined(OS_WIN)
958 view_->ShowCompositorHostWindow(is_accelerated_compositing_active_);
956 #endif 959 #endif
957 } 960 }
958 961
959 #if defined(OS_MACOSX) 962 #if defined(OS_MACOSX)
960 963
961 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId view, 964 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId view,
962 WebScreenInfo* results) { 965 WebScreenInfo* results) {
963 gfx::NativeView native_view = view_ ? view_->GetNativeView() : NULL; 966 gfx::NativeView native_view = view_ ? view_->GetNativeView() : NULL;
964 *results = WebScreenInfoFactory::screenInfo(native_view); 967 *results = WebScreenInfoFactory::screenInfo(native_view);
965 } 968 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 } 1047 }
1045 } 1048 }
1046 1049
1047 void RenderWidgetHost::OnMsgDestroyPluginContainer(gfx::PluginWindowHandle id) { 1050 void RenderWidgetHost::OnMsgDestroyPluginContainer(gfx::PluginWindowHandle id) {
1048 if (view_) { 1051 if (view_) {
1049 view_->DestroyPluginContainer(id); 1052 view_->DestroyPluginContainer(id);
1050 } else { 1053 } else {
1051 NOTIMPLEMENTED(); 1054 NOTIMPLEMENTED();
1052 } 1055 }
1053 } 1056 }
1054
1055 #endif 1057 #endif
1056 1058
1057 void RenderWidgetHost::PaintBackingStoreRect( 1059 void RenderWidgetHost::PaintBackingStoreRect(
1058 TransportDIB::Id bitmap, 1060 TransportDIB::Id bitmap,
1059 const gfx::Rect& bitmap_rect, 1061 const gfx::Rect& bitmap_rect,
1060 const std::vector<gfx::Rect>& copy_rects, 1062 const std::vector<gfx::Rect>& copy_rects,
1061 const gfx::Size& view_size) { 1063 const gfx::Size& view_size) {
1062 // The view may be destroyed already. 1064 // The view may be destroyed already.
1063 if (!view_) 1065 if (!view_)
1064 return; 1066 return;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 // of this key event. 1171 // of this key event.
1170 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { 1172 if (!processed && !is_hidden_ && !front_item.skip_in_browser) {
1171 UnhandledKeyboardEvent(front_item); 1173 UnhandledKeyboardEvent(front_item);
1172 1174
1173 // WARNING: This RenderWidgetHost can be deallocated at this point 1175 // WARNING: This RenderWidgetHost can be deallocated at this point
1174 // (i.e. in the case of Ctrl+W, where the call to 1176 // (i.e. in the case of Ctrl+W, where the call to
1175 // UnhandledKeyboardEvent destroys this RenderWidgetHost). 1177 // UnhandledKeyboardEvent destroys this RenderWidgetHost).
1176 } 1178 }
1177 } 1179 }
1178 } 1180 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698