summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
authornduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-30 20:10:29 +0000
committernduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-30 20:10:29 +0000
commit2919497149931ca8565c1f14fa40d0e1b7b1c7ec (patch)
tree840eccc1ab3f3cdf4d289e9cf093c0c9a7348dfd /chrome/browser/renderer_host
parent3a3adbc08dacf3da67155a34e4a59c33dc36fa74 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/renderer_host/render_widget_host.cc22
-rw-r--r--chrome/browser/renderer_host/render_widget_host.h5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.cc5
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;
}