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 e3940a096ca87518f486172675838a1bfe5415b7..4e4fbc15ada33496c1e6299c09d9b44dd082ee85 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -520,11 +520,8 @@ bool RenderWidgetHostViewMac::CreateCompositedIOSurface() { |
| return true; |
| } |
| -void RenderWidgetHostViewMac::CreateSoftwareLayerAndDestroyCompositedLayer() { |
| - TRACE_EVENT0( |
| - "browser", |
| - "RenderWidgetHostViewMac::CreateSoftwareLayerAndDestroyCompositedLayer"); |
| - |
| +void RenderWidgetHostViewMac::CreateSoftwareLayer() { |
| + TRACE_EVENT0("browser", "RenderWidgetHostViewMac::CreateSoftwareLayer"); |
| if (software_layer_ || !use_core_animation_) |
| return; |
| @@ -538,9 +535,8 @@ void RenderWidgetHostViewMac::CreateSoftwareLayerAndDestroyCompositedLayer() { |
| return; |
| } |
| - // Make the layer current and get rid of the old layer, if there is one. |
| - [cocoa_view_ setLayer:software_layer_]; |
| - DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
| + // Make the layer visible. |
| + [background_layer_ addSublayer:software_layer_]; |
| } |
| void RenderWidgetHostViewMac::DestroySoftwareLayer() { |
| @@ -548,19 +544,14 @@ void RenderWidgetHostViewMac::DestroySoftwareLayer() { |
| return; |
| ScopedCAActionDisabler disabler; |
| - |
| - if ([cocoa_view_ layer] == software_layer_.get()) |
| - [cocoa_view_ setLayer:background_layer_]; |
| [software_layer_ removeFromSuperlayer]; |
| [software_layer_ disableRendering]; |
| software_layer_.reset(); |
| } |
| -bool RenderWidgetHostViewMac::CreateCompositedLayerAndDestroySoftwareLayer() { |
| - TRACE_EVENT0( |
| - "browser", |
| - "RenderWidgetHostViewMac::CreateCompositedLayerAndDestroySoftwareLayer"); |
| - |
| +bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() { |
| + TRACE_EVENT0("browser", |
| + "RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer"); |
| if (compositing_iosurface_layer_ || !use_core_animation_) |
| return true; |
| @@ -574,31 +565,33 @@ bool RenderWidgetHostViewMac::CreateCompositedLayerAndDestroySoftwareLayer() { |
| return false; |
| } |
| - // Make the layer current and get rid of the old layer, if there is one. |
| - [cocoa_view_ setLayer:compositing_iosurface_layer_]; |
| - DestroySoftwareLayer(); |
| + // Make the layer visible. |
| + [background_layer_ addSublayer:compositing_iosurface_layer_]; |
| - // Creating the CompositingIOSurfaceLayer may attempt to draw in setLayer, |
| - // which, if it fails, will promptly tear down everything that was just |
| - // created. If that happened, return failure. |
| + // Creating the CompositingIOSurfaceLayer may attempt to draw inside |
| + // addSublayer, which, if it fails, will promptly tear down everything that |
| + // was just created. If that happened, return failure. |
| return compositing_iosurface_layer_; |
| } |
| +void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceLayer() { |
| + if (!compositing_iosurface_layer_) |
| + return; |
| + |
| + ScopedCAActionDisabler disabler; |
| + [compositing_iosurface_layer_ removeFromSuperlayer]; |
| + [compositing_iosurface_layer_ disableCompositing]; |
| + compositing_iosurface_layer_.reset(); |
| +} |
| + |
| void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( |
| DestroyContextBehavior destroy_context_behavior) { |
| // Any pending frames will not be displayed, so ack them now. |
| SendPendingSwapAck(); |
| - ScopedCAActionDisabler disabler; |
| - |
| + DestroyCompositedIOSurfaceLayer(); |
| compositing_iosurface_.reset(); |
| - if (compositing_iosurface_layer_) { |
| - if ([cocoa_view_ layer] == compositing_iosurface_layer_.get()) |
| - [cocoa_view_ setLayer:background_layer_]; |
| - [compositing_iosurface_layer_ removeFromSuperlayer]; |
| - [compositing_iosurface_layer_ disableCompositing]; |
| - compositing_iosurface_layer_.reset(); |
| - } |
| + |
| switch (destroy_context_behavior) { |
| case kLeaveContextBoundToView: |
| break; |
| @@ -786,9 +779,8 @@ void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
| ScopedCAActionDisabler disabler; |
| if (software_layer_) { |
| - [software_layer_ disableRendering]; |
| - software_layer_.reset(); |
| - CreateSoftwareLayerAndDestroyCompositedLayer(); |
| + DestroySoftwareLayer(); |
| + CreateSoftwareLayer(); |
| } |
| // Dynamically calling setContentsScale on a CAOpenGLLayer for which |
| @@ -796,9 +788,8 @@ void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
| // content. Work around this by replacing the entire layer when the scale |
| // factor changes. |
| if (compositing_iosurface_layer_) { |
| - [compositing_iosurface_layer_ disableCompositing]; |
| - compositing_iosurface_layer_.reset(); |
| - CreateCompositedLayerAndDestroySoftwareLayer(); |
| + DestroyCompositedIOSurfaceLayer(); |
| + CreateCompositedIOSurfaceLayer(); |
| } |
| render_widget_host_->NotifyScreenInfoChanged(); |
| @@ -1487,7 +1478,7 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
| // Create the layer for the composited content only after the IOSurface has |
| // been initialized. |
| - if (!CreateCompositedLayerAndDestroySoftwareLayer()) { |
| + if (!CreateCompositedIOSurfaceLayer()) { |
|
Ken Russell (switch to Gerrit)
2014/03/07 00:29:56
Who takes care of deleting the software layer in t
ccameron
2014/03/07 07:30:01
I moved this to where the software frame and backi
|
| LOG(ERROR) << "Failed to create CompositingIOSurface layer"; |
| GotAcceleratedCompositingError(); |
| return; |
| @@ -1985,14 +1976,15 @@ void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
| [cocoa_view_ setNeedsDisplay:YES]; |
| } |
| - // Delete software backingstore. |
| + // Delete software backingstore and layer. |
| BackingStoreManager::RemoveBackingStore(render_widget_host_); |
| software_frame_manager_->DiscardCurrentFrame(); |
| + DestroySoftwareLayer(); |
|
ccameron
2014/03/07 07:30:01
[1] from above.
|
| } |
| } |
| void RenderWidgetHostViewMac::GotSoftwareFrame() { |
| - CreateSoftwareLayerAndDestroyCompositedLayer(); |
| + CreateSoftwareLayer(); |
|
Ken Russell (switch to Gerrit)
2014/03/07 00:29:56
Who takes care of deleting the composited IOSurfac
ccameron
2014/03/07 07:30:01
This is done further down in the if (last_frame_wa
|
| [software_layer_ setNeedsDisplay]; |
| SendVSyncParametersToRenderer(); |
| @@ -2945,8 +2937,10 @@ void RenderWidgetHostViewMac::SendPendingSwapAck() { |
| // this is not sufficient. |
| ScopedCAActionDisabler disabler; |
| CGRect frame = NSRectToCGRect([renderWidgetHostView_->cocoa_view() bounds]); |
| - [[self layer] setFrame:frame]; |
| - [[self layer] setNeedsDisplay]; |
| + [renderWidgetHostView_->software_layer_ setFrame:frame]; |
| + [renderWidgetHostView_->software_layer_ setNeedsDisplay]; |
| + [renderWidgetHostView_->compositing_iosurface_layer_ setFrame:frame]; |
| + [renderWidgetHostView_->compositing_iosurface_layer_ setNeedsDisplay]; |
| } |
| - (void)callSetNeedsDisplayInRect { |
| @@ -2956,7 +2950,8 @@ void RenderWidgetHostViewMac::SendPendingSwapAck() { |
| renderWidgetHostView_->call_set_needs_display_in_rect_pending_ = false; |
| renderWidgetHostView_->invalid_rect_ = NSZeroRect; |
| - [[self layer] setNeedsDisplay]; |
| + [renderWidgetHostView_->software_layer_ setNeedsDisplay]; |
| + [renderWidgetHostView_->compositing_iosurface_layer_ setNeedsDisplay]; |
| } |
| // Fills with white the parts of the area to the right and bottom for |rect| |
| @@ -3949,7 +3944,10 @@ extern NSString *NSTextInputReplacementRangeAttributeName; |
| // Resize the view's layers to match the new window size. |
| ScopedCAActionDisabler disabler; |
| - [[self layer] setFrame:NSRectToCGRect([self bounds])]; |
| + [renderWidgetHostView_->software_layer_ |
| + setFrame:NSRectToCGRect([self bounds])]; |
| + [renderWidgetHostView_->compositing_iosurface_layer_ |
| + setFrame:NSRectToCGRect([self bounds])]; |
| } |
| - (void)undo:(id)sender { |