Index: content/browser/compositor/browser_compositor_view_private_mac.mm |
diff --git a/content/browser/compositor/browser_compositor_view_private_mac.mm b/content/browser/compositor/browser_compositor_view_private_mac.mm |
index a21f8c5bfc2aab7ce2c2e371887209255fd63bbf..5457da35719fae8c4eeab665514c6a9b14416312 100644 |
--- a/content/browser/compositor/browser_compositor_view_private_mac.mm |
+++ b/content/browser/compositor/browser_compositor_view_private_mac.mm |
@@ -15,6 +15,7 @@ |
#include "content/browser/renderer_host/dip_util.h" |
#include "content/browser/renderer_host/render_widget_resize_helper.h" |
#include "content/browser/renderer_host/software_layer_mac.h" |
+#include "content/common/gpu/surface_handles_mac.h" |
#include "content/public/browser/context_factory.h" |
#include "ui/base/cocoa/animation_utils.h" |
#include "ui/gl/scoped_cgl.h" |
@@ -119,12 +120,11 @@ void BrowserCompositorViewMacInternal::EndPumpingFrames() { |
[accelerated_layer_ endPumpingFrames]; |
} |
-void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
- IOSurfaceID io_surface_id, |
- int output_surface_id, |
+void BrowserCompositorViewMacInternal::GotAcceleratedFrame( |
+ uint64 surface_handle, int output_surface_id, |
const std::vector<ui::LatencyInfo>& latency_info, |
- gfx::Size pixel_size, |
- float scale_factor) { |
+ gfx::Size pixel_size, float scale_factor) { |
+ // Record the surface and latency info to use when acknowledging this frame. |
DCHECK(!accelerated_layer_output_surface_id_); |
accelerated_layer_output_surface_id_ = output_surface_id; |
accelerated_latency_info_.insert(accelerated_latency_info_.end(), |
@@ -139,18 +139,81 @@ void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
// Disable the fade-in or fade-out effect if we create or remove layers. |
ScopedCAActionDisabler disabler; |
- // If there is already an accelerated layer, but it has the wrong scale |
- // factor or it was poisoned, remove the old layer and replace it. |
- base::scoped_nsobject<CompositingIOSurfaceLayer> old_accelerated_layer; |
- if (accelerated_layer_ && ( |
- [accelerated_layer_ context]->HasBeenPoisoned() || |
- [accelerated_layer_ iosurface]->scale_factor() != scale_factor)) { |
- old_accelerated_layer = accelerated_layer_; |
+ last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
+ switch (GetSurfaceHandleType(surface_handle)) { |
+ case kSurfaceHandleTypeIOSurface: { |
+ IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); |
+ GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); |
+ break; |
+ } |
+ case kSurfaceHandleTypeCAContext: { |
+ CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); |
+ GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); |
+ break; |
+ } |
+ default: |
+ LOG(ERROR) << "Unrecognized accelerated frame type."; |
+ return; |
+ } |
+} |
+ |
+void BrowserCompositorViewMacInternal::GotAcceleratedCAContextFrame( |
+ CAContextID ca_context_id, |
+ gfx::Size pixel_size, |
+ float scale_factor) { |
+ // 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_accelerated_layer_host = |
+ accelerated_layer_host_; |
+ |
+ // Create the layer to host the layer exported by the GPU process with this |
+ // particular CAContext ID. |
+ if ([accelerated_layer_host_ contextId] != ca_context_id) { |
+ accelerated_layer_host_.reset([[CALayerHost alloc] init]); |
+ [accelerated_layer_host_ setContextId:ca_context_id]; |
+ [accelerated_layer_host_ |
+ setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; |
+ [flipped_layer_ addSublayer:accelerated_layer_host_]; |
+ } |
+ |
+ // Acknowledge the frame to unblock the compositor immediately (the GPU |
+ // process will do any required throttling). |
+ AcceleratedLayerDidDrawFrame(true); |
+ |
+ // If this replacing a same-type layer, remove it now that the new layer is |
+ // in the heirarchy. |
Ken Russell (switch to Gerrit)
2014/08/05 02:03:21
typo: hierarchy
ccameron
2014/08/05 04:29:59
Done.
|
+ if (old_accelerated_layer_host != accelerated_layer_host_) |
+ [old_accelerated_layer_host removeFromSuperlayer]; |
+ |
+ // Remove any different-type layers that this is replacing. |
Ken Russell (switch to Gerrit)
2014/08/05 02:03:21
The naming convention's getting confusing here. Co
ccameron
2014/08/05 04:29:59
You're right -- I was so excited to stop calling t
|
+ if (accelerated_layer_) { |
+ [accelerated_layer_ resetClient]; |
+ [accelerated_layer_ removeFromSuperlayer]; |
accelerated_layer_.reset(); |
} |
+ if (software_layer_) { |
+ [software_layer_ removeFromSuperlayer]; |
+ software_layer_.reset(); |
+ } |
+} |
- // If there is not a layer for accelerated frames, create one. |
- if (!accelerated_layer_) { |
+void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
+ IOSurfaceID io_surface_id, |
+ gfx::Size pixel_size, |
+ float scale_factor) { |
+ // In the layer is replaced, keep the old one around until after the new one |
+ // is installed to avoid flashes. |
+ base::scoped_nsobject<CompositingIOSurfaceLayer> old_accelerated_layer = |
+ accelerated_layer_; |
+ |
+ // Create or re-create an IOSurface layer if needed. If there already exists |
+ // a layer but it has the wrong scale factor or it was poisoned, re-create the |
+ // layer. |
+ bool needs_new_layer = |
+ !accelerated_layer_ || |
+ [accelerated_layer_ context]->HasBeenPoisoned() || |
+ [accelerated_layer_ iosurface]->scale_factor() != scale_factor; |
+ if (needs_new_layer) { |
scoped_refptr<content::CompositingIOSurfaceMac> iosurface = |
content::CompositingIOSurfaceMac::Create(); |
accelerated_layer_.reset([[CompositingIOSurfaceLayer alloc] |
@@ -174,7 +237,6 @@ void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
// Set the bounds of the accelerated layer to match the size of the frame. |
// If the bounds changed, force the content to be displayed immediately. |
- last_swap_size_dip_ = [accelerated_layer_ iosurface]->dip_io_surface_size(); |
CGRect new_layer_bounds = CGRectMake( |
0, 0, last_swap_size_dip_.width(), last_swap_size_dip_.height()); |
bool bounds_changed = !CGRectEqualToRect( |
@@ -183,14 +245,21 @@ void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
if (bounds_changed) |
[accelerated_layer_ setNeedsDisplayAndDisplayAndAck]; |
- // If there was a software layer or an old accelerated layer, remove it. |
- // Disable the fade-out animation as the layer is removed. |
- { |
- [software_layer_ removeFromSuperlayer]; |
- software_layer_.reset(); |
+ // If this replacing a same-type layer, remove it now that the new layer is |
+ // in the heirarchy. |
+ if (old_accelerated_layer != accelerated_layer_) { |
[old_accelerated_layer resetClient]; |
[old_accelerated_layer removeFromSuperlayer]; |
- old_accelerated_layer.reset(); |
+ } |
+ |
+ // Remove any different-type layers that this is replacing. |
+ if (accelerated_layer_host_) { |
+ [accelerated_layer_host_ removeFromSuperlayer]; |
+ accelerated_layer_host_.reset(); |
+ } |
+ if (software_layer_) { |
+ [software_layer_ removeFromSuperlayer]; |
+ software_layer_.reset(); |
} |
} |
@@ -221,8 +290,12 @@ void BrowserCompositorViewMacInternal::GotSoftwareFrame( |
withScaleFactor:scale_factor]; |
last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
- // If there was an accelerated layer, remove it. |
- { |
+ // Remove any different-type layers that this is replacing. |
+ if (accelerated_layer_host_) { |
+ [accelerated_layer_host_ removeFromSuperlayer]; |
+ accelerated_layer_host_.reset(); |
+ } |
+ if (accelerated_layer_) { |
[accelerated_layer_ resetClient]; |
[accelerated_layer_ removeFromSuperlayer]; |
accelerated_layer_.reset(); |
@@ -271,6 +344,4 @@ BrowserCompositorViewMacInternal* BrowserCompositorViewMacInternal:: |
return found->second; |
} |
- |
} // namespace content |
- |