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 2443c0b2126752e1286dd423cc60dccbc73c3457..521446b3d5c5d00ea8d4c401e54ae6caea1cee71 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -380,6 +380,13 @@ blink::WebScreenInfo GetWebScreenInfo(NSView* view) { |
| return results; |
| } |
| +void RemoveLayerFromSuperlayer( |
|
Zhenyao Mo
2014/04/09 22:24:24
This is never called.
ccameron
2014/04/09 22:37:28
This is wrapped up in the ScopedClosureRunner belo
|
| + base::scoped_nsobject<CompositingIOSurfaceLayer> layer) { |
| + // Disable the fade-out animation as the layer is removed. |
| + ScopedCAActionDisabler disabler; |
| + [layer removeFromSuperlayer]; |
| +} |
| + |
| } // namespace |
| namespace content { |
| @@ -573,13 +580,16 @@ void RenderWidgetHostViewMac::EnsureCompositedIOSurfaceLayer() { |
| [background_layer_ addSublayer:compositing_iosurface_layer_]; |
| } |
| -void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceLayer() { |
| +void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceLayer( |
| + DestroyCompositedIOSurfaceLayerBehavior destroy_layer_behavior) { |
| if (!compositing_iosurface_layer_) |
| return; |
| - // Disable the fade-out animation as the layer is removed. |
| - ScopedCAActionDisabler disabler; |
| - [compositing_iosurface_layer_ removeFromSuperlayer]; |
| + if (destroy_layer_behavior == kRemoveLayerFromHierarchy) { |
| + // Disable the fade-out animation as the layer is removed. |
| + ScopedCAActionDisabler disabler; |
| + [compositing_iosurface_layer_ removeFromSuperlayer]; |
| + } |
| [compositing_iosurface_layer_ disableCompositing]; |
| compositing_iosurface_layer_.reset(); |
| } |
| @@ -589,7 +599,7 @@ void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( |
| // Any pending frames will not be displayed, so ack them now. |
| SendPendingSwapAck(); |
| - DestroyCompositedIOSurfaceLayer(); |
| + DestroyCompositedIOSurfaceLayer(kRemoveLayerFromHierarchy); |
| compositing_iosurface_.reset(); |
| switch (destroy_context_behavior) { |
| @@ -1354,6 +1364,19 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
| AddPendingLatencyInfo(latency_info); |
| + // If compositing_iosurface_ exists and has been poisoned, destroy it |
| + // and allow EnsureCompositedIOSurface to recreate it below. Keep a |
| + // reference to the destroyed layer around until after the below call |
| + // to LayoutLayers, to avoid flickers. |
| + base::ScopedClosureRunner scoped_layer_remover; |
| + if (compositing_iosurface_context_ && |
| + compositing_iosurface_context_->HasBeenPoisoned()) { |
| + scoped_layer_remover.Reset( |
| + base::Bind(RemoveLayerFromSuperlayer, compositing_iosurface_layer_)); |
| + DestroyCompositedIOSurfaceLayer(kLeaveLayerInHierarchy); |
| + DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
| + } |
| + |
| // Ensure compositing_iosurface_ and compositing_iosurface_context_ be |
| // allocated. |
| if (!EnsureCompositedIOSurface()) { |
| @@ -2027,7 +2050,7 @@ void RenderWidgetHostViewMac::WindowFrameChanged() { |
| GetViewBounds())); |
| } |
| - if (compositing_iosurface_) { |
| + if (compositing_iosurface_ && !use_core_animation_) { |
|
ccameron
2014/04/09 22:06:01
There is no migration in non-CoreAnimation mode, s
|
| // This will migrate the context to the appropriate window. |
| if (!EnsureCompositedIOSurface()) |
| GotAcceleratedCompositingError(); |
| @@ -2229,7 +2252,7 @@ void RenderWidgetHostViewMac::LayoutLayers() { |
| respondsToSelector:(@selector(contentsScale))]) { |
| if (compositing_iosurface_->scale_factor() != |
| [compositing_iosurface_layer_ contentsScale]) { |
| - DestroyCompositedIOSurfaceLayer(); |
| + DestroyCompositedIOSurfaceLayer(kRemoveLayerFromHierarchy); |
| EnsureCompositedIOSurfaceLayer(); |
| } |
| } |