Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Unified Diff: content/browser/renderer_host/compositing_iosurface_layer_mac.mm

Issue 408153002: Mac: Fix janky YouTube animations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 8efa2589f1e9045fe8405065ffba84ad6a589fdc..35cee20155c840e8d07fc2c97f224269eda28046 100644
--- a/content/browser/renderer_host/compositing_iosurface_layer_mac.mm
+++ b/content/browser/renderer_host/compositing_iosurface_layer_mac.mm
@@ -54,7 +54,7 @@ void CompositingIOSurfaceLayerHelper::GotNewFrame() {
// If reqested, draw immediately and don't bother trying to use the
// isAsynchronous property to ensure smooth animation.
if (client_->AcceleratedLayerShouldAckImmediately()) {
- ImmediatelyForceDisplayAndAck();
+ SetNeedsDisplayAndDisplayAndAck();
} else {
if (![layer_ isAsynchronous])
[layer_ setAsynchronous:YES];
@@ -104,8 +104,29 @@ void CompositingIOSurfaceLayerHelper::AckPendingFrame(bool success) {
TRACE_COUNTER_ID1("browser", "PendingSwapAck", this, 0);
}
-void CompositingIOSurfaceLayerHelper::ImmediatelyForceDisplayAndAck() {
+void CompositingIOSurfaceLayerHelper::SetNeedsDisplayAndDisplayAndAck() {
+ // Drawing using setNeedsDisplay and displayIfNeeded will result in
+ // subsequent canDrawInCGLContext callbacks getting dropped, and jerky
+ // animation. Disable asynchronous drawing before issuing these calls as a
+ // workaround.
+ // http://crbug.com/395827
+ if ([layer_ isAsynchronous])
+ [layer_ setAsynchronous:NO];
Ken Russell (switch to Gerrit) 2014/07/22 19:52:04 I don't know the various state transitions done to
ccameron 2014/07/23 07:50:34 It gets re-set to asynchronous as soon as a new fr
+
[layer_ setNeedsDisplay];
+ DisplayIfNeededAndAck();
+}
+
+void CompositingIOSurfaceLayerHelper::DisplayIfNeededAndAck() {
+ if (!needs_display_)
+ return;
+
+ // As in SetNeedsDisplayAndDisplayAndAck, disable asynchronous drawing before
+ // issuing displayIfNeeded.
+ // http://crbug.com/395827
+ if ([layer_ isAsynchronous])
+ [layer_ setAsynchronous:NO];
+
[layer_ displayIfNeeded];
// Calls to setNeedsDisplay can sometimes be ignored, especially if issued
@@ -116,7 +137,7 @@ void CompositingIOSurfaceLayerHelper::ImmediatelyForceDisplayAndAck() {
}
void CompositingIOSurfaceLayerHelper::TimerFired() {
- ImmediatelyForceDisplayAndAck();
+ SetNeedsDisplayAndDisplayAndAck();
}
} // namespace content
@@ -171,6 +192,14 @@ void CompositingIOSurfaceLayerHelper::TimerFired() {
helper_->GotNewFrame();
}
+- (void)setNeedsDisplayAndDisplayAndAck {
+ helper_->SetNeedsDisplayAndDisplayAndAck();
+}
+
+- (void)displayIfNeededAndAck {
+ helper_->DisplayIfNeededAndAck();
+}
+
// The remaining methods implement the CAOpenGLLayer interface.
- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask {

Powered by Google App Engine
This is Rietveld 408576698