| Index: ui/accelerated_widget_mac/accelerated_widget_mac.mm
|
| diff --git a/ui/accelerated_widget_mac/accelerated_widget_mac.mm b/ui/accelerated_widget_mac/accelerated_widget_mac.mm
|
| index 92d4c451d14ca73f935d697b8f7deb2c1da69458..d2121c53660dd9f7608d7330c1f5b940fd024139 100644
|
| --- a/ui/accelerated_widget_mac/accelerated_widget_mac.mm
|
| +++ b/ui/accelerated_widget_mac/accelerated_widget_mac.mm
|
| @@ -29,17 +29,6 @@ - (void)setContentsChanged;
|
| WidgetToHelperMap;
|
| base::LazyInstance<WidgetToHelperMap> g_widget_to_helper_map;
|
|
|
| -AcceleratedWidgetMac* GetHelperFromAcceleratedWidget(
|
| - gfx::AcceleratedWidget widget) {
|
| - WidgetToHelperMap::const_iterator found =
|
| - g_widget_to_helper_map.Pointer()->find(widget);
|
| - // This can end up being accessed after the underlying widget has been
|
| - // destroyed, but while the ui::Compositor is still being destroyed.
|
| - // Return NULL in these cases.
|
| - if (found == g_widget_to_helper_map.Pointer()->end())
|
| - return NULL;
|
| - return found->second;
|
| -}
|
|
|
| } // namespace
|
|
|
| @@ -101,8 +90,10 @@ - (void)setContentsChanged;
|
| ScopedCAActionDisabler disabler;
|
|
|
| [flipped_layer_ removeFromSuperlayer];
|
| - DestroyCAContextLayer(ca_context_layer_);
|
| - DestroyLocalLayer();
|
| + [content_layer_ removeFromSuperlayer];
|
| + [io_surface_layer_ removeFromSuperlayer];
|
| + content_layer_.reset();
|
| + io_surface_layer_.reset();
|
|
|
| last_swap_size_dip_ = gfx::Size();
|
| view_ = NULL;
|
| @@ -143,95 +134,54 @@ - (void)setContentsChanged;
|
| }
|
| }
|
|
|
| -void AcceleratedWidgetMac::GotFrame(
|
| - CAContextID ca_context_id,
|
| - bool fullscreen_low_power_ca_context_valid,
|
| - CAContextID fullscreen_low_power_ca_context_id,
|
| - base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
|
| +AcceleratedWidgetMac* AcceleratedWidgetMac::Get(gfx::AcceleratedWidget widget) {
|
| + WidgetToHelperMap::const_iterator found =
|
| + g_widget_to_helper_map.Pointer()->find(widget);
|
| + // This can end up being accessed after the underlying widget has been
|
| + // destroyed, but while the ui::Compositor is still being destroyed.
|
| + // Return NULL in these cases.
|
| + if (found == g_widget_to_helper_map.Pointer()->end())
|
| + return nullptr;
|
| + return found->second;
|
| +}
|
| +
|
| +void AcceleratedWidgetMac::GotCALayerFrame(
|
| + base::scoped_nsobject<CALayer> content_layer,
|
| + bool fullscreen_low_power_layer_valid,
|
| + base::scoped_nsobject<CALayer> fullscreen_low_power_layer,
|
| const gfx::Size& pixel_size,
|
| float scale_factor) {
|
| - TRACE_EVENT0("ui", "AcceleratedWidgetMac::GotFrame");
|
| -
|
| - // If there is no view and therefore no superview to draw into, early-out.
|
| + TRACE_EVENT0("ui", "AcceleratedWidgetMac::GotCAContextFrame");
|
| if (!view_) {
|
| TRACE_EVENT0("ui", "No associated NSView");
|
| return;
|
| }
|
| -
|
| - // Disable the fade-in or fade-out effect if we create or remove layers.
|
| ScopedCAActionDisabler disabler;
|
| -
|
| last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size);
|
|
|
| - if (ca_context_id) {
|
| - GotCAContextFrame(ca_context_id, fullscreen_low_power_ca_context_valid,
|
| - fullscreen_low_power_ca_context_id, pixel_size,
|
| - scale_factor);
|
| - } else {
|
| - GotIOSurfaceFrame(io_surface, pixel_size, scale_factor);
|
| - }
|
| -
|
| - view_->AcceleratedWidgetSwapCompleted();
|
| -}
|
| -
|
| -void AcceleratedWidgetMac::GotCAContextFrame(
|
| - CAContextID ca_context_id,
|
| - bool fullscreen_low_power_ca_context_valid,
|
| - CAContextID fullscreen_low_power_ca_context_id,
|
| - const gfx::Size& pixel_size,
|
| - float scale_factor) {
|
| - TRACE_EVENT0("ui", "AcceleratedWidgetMac::GotCAContextFrame");
|
| -
|
| - // In the layer is replaced, keep the old one around until after the new one
|
| - // is installed to avoid flashes.
|
| - base::scoped_nsobject<CALayerHost> old_ca_context_layer =
|
| - ca_context_layer_;
|
| -
|
| - // Create the layer to host the layer exported by the GPU process with this
|
| - // particular CAContext ID.
|
| - if ([ca_context_layer_ contextId] != ca_context_id) {
|
| - TRACE_EVENT0("ui", "Creating a new CALayerHost");
|
| - ca_context_layer_.reset([[CALayerHost alloc] init]);
|
| - [ca_context_layer_ setContextId:ca_context_id];
|
| - [ca_context_layer_
|
| - setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin];
|
| - [flipped_layer_ addSublayer:ca_context_layer_];
|
| + // Ensure that the content is in the CALayer hierarchy, and update fullscreen
|
| + // low power state.
|
| + if (content_layer_ != content_layer) {
|
| + [flipped_layer_ addSublayer:content_layer];
|
| + [content_layer_ removeFromSuperlayer];
|
| + content_layer_ = content_layer;
|
| }
|
| - if ([fullscreen_low_power_layer_ contextId] !=
|
| - fullscreen_low_power_ca_context_id) {
|
| - TRACE_EVENT0("ui", "Creating a new CALayerHost");
|
| + if (fullscreen_low_power_layer_ != fullscreen_low_power_layer) {
|
| if (fslp_coordinator_) {
|
| fslp_coordinator_->WillLoseAcceleratedWidget();
|
| DCHECK(!fslp_coordinator_);
|
| }
|
| - fullscreen_low_power_layer_.reset([[CALayerHost alloc] init]);
|
| - [fullscreen_low_power_layer_
|
| - setContextId:fullscreen_low_power_ca_context_id];
|
| + fullscreen_low_power_layer_ = fullscreen_low_power_layer;
|
| }
|
| + if (fslp_coordinator_)
|
| + fslp_coordinator_->SetLowPowerLayerValid(fullscreen_low_power_layer_valid);
|
|
|
| - if (fslp_coordinator_) {
|
| - fslp_coordinator_->SetLowPowerLayerValid(
|
| - fullscreen_low_power_ca_context_valid);
|
| - }
|
| -
|
| - // If this replacing a same-type layer, remove it now that the new layer is
|
| - // in the hierarchy.
|
| - if (old_ca_context_layer != ca_context_layer_)
|
| - DestroyCAContextLayer(old_ca_context_layer);
|
| -
|
| - // Remove any different-type layers that this is replacing.
|
| - DestroyLocalLayer();
|
| -}
|
| -
|
| -void AcceleratedWidgetMac::EnsureLocalLayer() {
|
| - if (!local_layer_) {
|
| - local_layer_.reset([[CALayer alloc] init]);
|
| - // Setting contents gravity is necessary to prevent the layer from being
|
| - // scaled during dyanmic resizes (especially with devtools open).
|
| - [local_layer_ setContentsGravity:kCAGravityTopLeft];
|
| - [local_layer_ setAnchorPoint:CGPointMake(0, 0)];
|
| - [flipped_layer_ addSublayer:local_layer_];
|
| + // Ensure the IOSurface is removed.
|
| + if (io_surface_layer_) {
|
| + [io_surface_layer_ removeFromSuperlayer];
|
| + io_surface_layer_.reset();
|
| }
|
| + view_->AcceleratedWidgetSwapCompleted();
|
| }
|
|
|
| void AcceleratedWidgetMac::GotIOSurfaceFrame(
|
| @@ -239,72 +189,36 @@ - (void)setContentsChanged;
|
| const gfx::Size& pixel_size,
|
| float scale_factor) {
|
| TRACE_EVENT0("ui", "AcceleratedWidgetMac::GotIOSurfaceFrame");
|
| -
|
| - // If there is not a layer for local frames, create one.
|
| - EnsureLocalLayer();
|
| -
|
| - id new_contents = static_cast<id>(io_surface.get());
|
| -
|
| - if (new_contents && new_contents == [local_layer_ contents]) {
|
| - [local_layer_ setContentsChanged];
|
| - } else {
|
| - [local_layer_ setContents:new_contents];
|
| - }
|
| -
|
| - [local_layer_ setBounds:CGRectMake(0, 0, pixel_size.width() / scale_factor,
|
| - pixel_size.height() / scale_factor)];
|
| -
|
| - if ([local_layer_ contentsScale] != scale_factor)
|
| - [local_layer_ setContentsScale:scale_factor];
|
| -
|
| - // Remove any different-type layers that this is replacing.
|
| - DestroyCAContextLayer(ca_context_layer_);
|
| -}
|
| -
|
| -void AcceleratedWidgetMac::DestroyCAContextLayer(
|
| - base::scoped_nsobject<CALayerHost> ca_context_layer) {
|
| - if (!ca_context_layer)
|
| - return;
|
| - [ca_context_layer removeFromSuperlayer];
|
| - if (ca_context_layer == ca_context_layer_)
|
| - ca_context_layer_.reset();
|
| -}
|
| -
|
| -void AcceleratedWidgetMac::DestroyLocalLayer() {
|
| - if (!local_layer_)
|
| + if (!view_) {
|
| + TRACE_EVENT0("ui", "No associated NSView");
|
| return;
|
| - [local_layer_ removeFromSuperlayer];
|
| - local_layer_.reset();
|
| -}
|
| + }
|
| + ScopedCAActionDisabler disabler;
|
| + last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size);
|
|
|
| -void AcceleratedWidgetMacGotFrame(
|
| - gfx::AcceleratedWidget widget,
|
| - CAContextID ca_context_id,
|
| - bool fullscreen_low_power_ca_context_valid,
|
| - CAContextID fullscreen_low_power_ca_context_id,
|
| - base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
|
| - const gfx::Size& pixel_size,
|
| - float scale_factor,
|
| - base::TimeTicks* vsync_timebase,
|
| - base::TimeDelta* vsync_interval) {
|
| - if (vsync_timebase)
|
| - *vsync_timebase = base::TimeTicks();
|
| - if (vsync_interval)
|
| - *vsync_interval = base::TimeDelta();
|
| -
|
| - AcceleratedWidgetMac* accelerated_widget_mac =
|
| - GetHelperFromAcceleratedWidget(widget);
|
| -
|
| - if (accelerated_widget_mac) {
|
| - accelerated_widget_mac->GotFrame(ca_context_id,
|
| - fullscreen_low_power_ca_context_valid,
|
| - fullscreen_low_power_ca_context_id,
|
| - io_surface, pixel_size, scale_factor);
|
| - if (vsync_timebase && vsync_interval) {
|
| - accelerated_widget_mac->GetVSyncParameters(vsync_timebase,
|
| - vsync_interval);
|
| - }
|
| + // Create (if needed) and update the IOSurface layer with new content.
|
| + if (!io_surface_layer_) {
|
| + io_surface_layer_.reset([[CALayer alloc] init]);
|
| + [io_surface_layer_ setContentsGravity:kCAGravityTopLeft];
|
| + [io_surface_layer_ setAnchorPoint:CGPointMake(0, 0)];
|
| + [flipped_layer_ addSublayer:io_surface_layer_];
|
| + }
|
| + id new_contents = static_cast<id>(io_surface.get());
|
| + if (new_contents && new_contents == [io_surface_layer_ contents])
|
| + [io_surface_layer_ setContentsChanged];
|
| + else
|
| + [io_surface_layer_ setContents:new_contents];
|
| + [io_surface_layer_ setBounds:CGRectMake(0, 0, last_swap_size_dip_.width(),
|
| + last_swap_size_dip_.height())];
|
| + if ([io_surface_layer_ contentsScale] != scale_factor)
|
| + [io_surface_layer_ setContentsScale:scale_factor];
|
| +
|
| + // Ensure that the content layer is removed.
|
| + if (content_layer_) {
|
| + [content_layer_ removeFromSuperlayer];
|
| + content_layer_.reset();
|
| }
|
| + view_->AcceleratedWidgetSwapCompleted();
|
| }
|
|
|
| } // namespace ui
|
|
|