Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| index 402df2f8184557c5c114e6dd8116884b340910dc..7f1c16773ceebd3f3e19ef42a4e479e8ab70591d 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -70,6 +70,7 @@ |
| #include "ui/compositor/compositor.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/gfx/display.h" |
| +#include "ui/gfx/frame_time.h" |
| #include "ui/gfx/point.h" |
| #include "ui/gfx/rect_conversions.h" |
| #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| @@ -851,12 +852,13 @@ void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { |
| if (!render_widget_host_ || !display_link_) |
| return; |
| - base::TimeTicks timebase; |
| - base::TimeDelta interval; |
| - if (!display_link_->GetVSyncParameters(&timebase, &interval)) |
| + if (!display_link_->GetVSyncParameters(&vsync_timebase_, &vsync_interval_)) { |
| + vsync_timebase_ = base::TimeTicks(); |
| + vsync_interval_ = base::TimeDelta(); |
| return; |
| + } |
| - render_widget_host_->UpdateVSyncParameters(timebase, interval); |
| + render_widget_host_->UpdateVSyncParameters(vsync_timebase_, vsync_interval_); |
| } |
| void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
| @@ -1410,6 +1412,7 @@ void RenderWidgetHostViewMac::PluginImeCompositionCompleted( |
| void RenderWidgetHostViewMac::CompositorSwapBuffers( |
| IOSurfaceID surface_handle, |
| + const gfx::Rect& damage_rect, |
| const gfx::Size& size, |
| float surface_scale_factor, |
| const std::vector<ui::LatencyInfo>& latency_info) { |
| @@ -1468,11 +1471,20 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
| // current context afterward. |
| bool frame_was_captured = false; |
| if (frame_subscriber_) { |
| - const base::TimeTicks present_time = base::TimeTicks::Now(); |
| + const base::TimeTicks now = gfx::FrameTime::Now(); |
| + base::TimeTicks present_time; |
| + if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { |
| + present_time = now; |
| + } else { |
| + const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
| + present_time = vsync_timebase_ + |
| + (intervals_elapsed + 1) * vsync_interval_; |
| + } |
| + |
| scoped_refptr<media::VideoFrame> frame; |
| RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| - if (frame_subscriber_->ShouldCaptureFrame(present_time, |
| - &frame, &callback)) { |
| + if (frame_subscriber_->ShouldCaptureFrame( |
| + damage_rect, present_time, &frame, &callback)) { |
| // Flush the context that updated the IOSurface, to ensure that the |
| // context that does the copy picks up the correct version. |
| { |
| @@ -1728,6 +1740,7 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped( |
| params.surface_handle); |
| CompositorSwapBuffers(io_surface_id, |
| + gfx::Rect(), |
|
ccameron
2014/07/25 17:21:52
I think that this should be from params.size ... b
miu
2014/07/25 18:00:13
tl;dr: I fell back on passing an empty Rect since
|
| params.size, |
| params.scale_factor, |
| params.latency_info); |
| @@ -1772,10 +1785,12 @@ void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer( |
| gpu_host_id, |
| compositing_iosurface_ ? |
| compositing_iosurface_->GetRendererID() : 0); |
| - CompositorSwapBuffers(IOSurfaceIDFromSurfaceHandle(params.surface_handle), |
| - params.surface_size, |
| - params.surface_scale_factor, |
| - params.latency_info); |
| + CompositorSwapBuffers( |
| + IOSurfaceIDFromSurfaceHandle(params.surface_handle), |
| + gfx::Rect(params.x, params.y, params.width, params.height), |
| + params.surface_size, |
| + params.surface_scale_factor, |
| + params.latency_info); |
| } |
| void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { |