Index: content/browser/renderer_host/compositing_iosurface_layer_mac.mm |
diff --git a/content/browser/renderer_host/compositing_iosurface_layer_mac.mm b/content/browser/renderer_host/compositing_iosurface_layer_mac.mm |
index 38752b484a341fae652df3ded70573ab22bdb4ad..63f9ca36748f7cbd7712eb8667026160e59ace79 100644 |
--- a/content/browser/renderer_host/compositing_iosurface_layer_mac.mm |
+++ b/content/browser/renderer_host/compositing_iosurface_layer_mac.mm |
@@ -26,6 +26,7 @@ |
context_ = content::CompositingIOSurfaceContext::Get( |
content::CompositingIOSurfaceContext::kOffscreenContextWindowNumber); |
DCHECK(context_); |
+ needsDisplay_ = NO; |
ScopedCAActionDisabler disabler; |
[self setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; |
@@ -64,6 +65,24 @@ |
renderWidgetHostView_ = nil; |
} |
+- (void)gotNewFrame { |
+ if (![self isAsynchronous]) { |
+ [self setNeedsDisplay]; |
+ [self setAsynchronous:YES]; |
+ } else { |
+ needsDisplay_ = YES; |
+ } |
+} |
+ |
+- (void)timerSinceGotNewFrameFired { |
+ if (![self isAsynchronous]) |
+ return; |
+ |
+ [self setAsynchronous:NO]; |
+ if (needsDisplay_) |
+ [self setNeedsDisplay]; |
+} |
+ |
// The remaining methods implement the CAOpenGLLayer interface. |
- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask { |
@@ -78,6 +97,18 @@ |
return CGLRetainContext(context_->cgl_context()); |
} |
+- (void)setNeedsDisplay { |
+ needsDisplay_ = YES; |
+ [super setNeedsDisplay]; |
+} |
+ |
+- (BOOL)canDrawInCGLContext:(CGLContextObj)glContext |
+ pixelFormat:(CGLPixelFormatObj)pixelFormat |
+ forLayerTime:(CFTimeInterval)timeInterval |
+ displayTime:(const CVTimeStamp*)timeStamp { |
+ return needsDisplay_; |
+} |
+ |
- (void)drawInCGLContext:(CGLContextObj)glContext |
pixelFormat:(CGLPixelFormatObj)pixelFormat |
forLayerTime:(CFTimeInterval)timeInterval |
@@ -143,6 +174,7 @@ |
return; |
} |
+ needsDisplay_ = NO; |
renderWidgetHostView_->SendPendingLatencyInfoToHost(); |
} |