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

Unified Diff: ui/accelerated_widget_mac/accelerated_widget_mac.mm

Issue 2018793002: Mac: Move remote layer use to GpuOutputSurfaceMac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@clean_up_mac
Patch Set: Review feedback Created 4 years, 7 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
« no previous file with comments | « ui/accelerated_widget_mac/accelerated_widget_mac.h ('k') | ui/views/widget/native_widget_mac_unittest.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/accelerated_widget_mac/accelerated_widget_mac.h ('k') | ui/views/widget/native_widget_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698