diff options
author | nduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-30 20:10:29 +0000 |
---|---|---|
committer | nduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-30 20:10:29 +0000 |
commit | 2919497149931ca8565c1f14fa40d0e1b7b1c7ec (patch) | |
tree | 840eccc1ab3f3cdf4d289e9cf093c0c9a7348dfd /chrome/browser/renderer_host | |
parent | 3a3adbc08dacf3da67155a34e4a59c33dc36fa74 (diff) | |
download | chromium_src-2919497149931ca8565c1f14fa40d0e1b7b1c7ec.zip chromium_src-2919497149931ca8565c1f14fa40d0e1b7b1c7ec.tar.gz chromium_src-2919497149931ca8565c1f14fa40d0e1b7b1c7ec.tar.bz2 |
When in accelerated compositing mode, RenderWidgetHostView::paint/expose
should request a compositing run, and timeout-wait on resize-acks as is done
in software mode.
BUG=53274
TEST=On a non-composited desktop, open a composited page, then ensure windows
put on top of the page do not leave permanent damage on the screen.
Review URL: http://codereview.chromium.org/3431023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61103 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
4 files changed, 33 insertions, 4 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc index eb2fc33..20aafd3 100644 --- a/chrome/browser/renderer_host/render_widget_host.cc +++ b/chrome/browser/renderer_host/render_widget_host.cc @@ -374,6 +374,28 @@ void RenderWidgetHost::DonePaintingToBackingStore() { Send(new ViewMsg_UpdateRect_ACK(routing_id())); } +void RenderWidgetHost::ScheduleComposite() { + DCHECK(!is_hidden_ || !is_gpu_rendering_active_) << + "ScheduleCompositeAndSync called while hidden!"; + + // Send out a request to the renderer to paint the view if required. + if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { + repaint_start_time_ = TimeTicks::Now(); + repaint_ack_pending_ = true; + Send(new ViewMsg_Repaint(routing_id_, current_size_)); + } + + // When we have asked the RenderWidget to resize, and we are still waiting on + // a response, block for a little while to see if we can't get a response. + // We always block on response because we do not have a backing store. + IPC::Message msg; + TimeDelta max_delay = TimeDelta::FromMilliseconds(kPaintMsgTimeoutMS); + if (process_->WaitForUpdateMsg(routing_id_, max_delay, &msg)) { + ViewHostMsg_UpdateRect::Dispatch( + &msg, this, &RenderWidgetHost::OnMsgUpdateRect); + } +} + void RenderWidgetHost::StartHangMonitorTimeout(TimeDelta delay) { if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableHangMonitor)) { diff --git a/chrome/browser/renderer_host/render_widget_host.h b/chrome/browser/renderer_host/render_widget_host.h index c34bece..0e5fa4a 100644 --- a/chrome/browser/renderer_host/render_widget_host.h +++ b/chrome/browser/renderer_host/render_widget_host.h @@ -243,6 +243,11 @@ class RenderWidgetHost : public IPC::Channel::Listener, // renderer to send another paint. void DonePaintingToBackingStore(); + // GPU accelerated version of GetBackingStore function. This will + // trigger a re-composite to the view. If a resize is pending, it will + // block briefly waiting for an ack from the renderer. + void ScheduleComposite(); + // Returns the video layer if it exists, NULL otherwise. VideoLayer* video_layer() const { return video_layer_.get(); } diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index 4cf14cb..6c49c81 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -848,10 +848,11 @@ void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) { return; } - // Don't do any painting if the GPU process is rendering directly - // into the View. + // If the GPU process is rendering directly into the View, + // call the compositor directly. RenderWidgetHost* render_widget_host = GetRenderWidgetHost(); if (render_widget_host->is_gpu_rendering_active()) { + host_->ScheduleComposite(); return; } diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc index deccc0a..5a279c6 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc @@ -889,13 +889,14 @@ void RenderWidgetHostViewWin::OnPaint(HDC unused_dc) { return; } - // Don't do any painting if the GPU process is rendering directly - // into the View. + // If the GPU process is rendering directly into the View, + // call the compositor directly. RenderWidgetHost* render_widget_host = GetRenderWidgetHost(); if (render_widget_host->is_gpu_rendering_active()) { // We initialize paint_dc here so that BeginPaint()/EndPaint() // get called to validate the region. CPaintDC paint_dc(m_hWnd); + render_widget_host_->ScheduleComposite(); return; } |