| 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 b26950a38ba9f40d7a2dd2e636831f040d3117e0..1ed5f36bb53763af3df07ef5cdf0089ee5a0d614 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() {
|
| @@ -1415,6 +1417,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) {
|
| @@ -1473,11 +1476,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.
|
| {
|
| @@ -1733,6 +1745,7 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped(
|
| params.surface_handle);
|
|
|
| CompositorSwapBuffers(io_surface_id,
|
| + gfx::Rect(),
|
| params.size,
|
| params.scale_factor,
|
| params.latency_info);
|
| @@ -1777,10 +1790,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() {
|
|
|