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 e60324ab17ec68eb6b35d246bc9e7925e470bf7a..6d0f1362d976a96391330ce860886c5cf1bce9aa 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -72,6 +72,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" |
@@ -864,12 +865,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() { |
@@ -1428,6 +1430,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) { |
@@ -1486,11 +1489,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. |
{ |
@@ -1746,6 +1758,7 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped( |
params.surface_handle); |
CompositorSwapBuffers(io_surface_id, |
+ gfx::Rect(), |
params.size, |
params.scale_factor, |
params.latency_info); |
@@ -1790,10 +1803,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() { |