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

Unified Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 347653005: Make cross-process CALayers work on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@image_transport_1
Patch Set: Incorporate review feedback Created 6 years, 6 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
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 38fb4785fb3934000bd67efdf558b4e3c93e30d1..338f429fd6de205f3c3c0a88981b34b9a511465d 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -44,6 +44,7 @@
#include "content/common/accessibility_messages.h"
#include "content/common/edit_command.h"
#include "content/common/gpu/gpu_messages.h"
+#include "content/common/gpu/surface_handle_types_mac.h"
#include "content/common/input_messages.h"
#include "content/common/view_messages.h"
#include "content/common/webplugin_geometry.h"
@@ -470,6 +471,10 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
background_layer_.reset([[CALayer alloc] init]);
[background_layer_
setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)];
+ [background_layer_
+ setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable];
+ [background_layer_ setGeometryFlipped:YES];
+ [background_layer_ setContentsGravity:kCAGravityTopLeft];
[cocoa_view_ setLayer:background_layer_];
[cocoa_view_ setWantsLayer:YES];
@@ -1662,16 +1667,48 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped(
"RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped");
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- IOSurfaceID io_surface_handle =
- static_cast<IOSurfaceID>(params.surface_handle);
AddPendingSwapAck(params.route_id,
gpu_host_id,
compositing_iosurface_ ?
compositing_iosurface_->GetRendererID() : 0);
- CompositorSwapBuffers(io_surface_handle,
- params.size,
- params.scale_factor,
- params.latency_info);
+
+ switch (GetSurfaceHandleType(params.surface_handle)) {
+ case kSurfaceHandleTypeIOSurface: {
+ IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(
+ params.surface_handle);
+
+ CompositorSwapBuffers(io_surface_id,
+ params.size,
+ params.scale_factor,
+ params.latency_info);
+ } break;
+ case kSurfaceHandleTypeCAContext: {
+ // Disable the fade-out animation as the layer is added.
+ ScopedCAActionDisabler disabler;
+
+ CAContextID context_id = CAContextIDFromSurfaceHandle(
+ params.surface_handle);
+
+ // If if the layer has changed put the new layer in the hierarchy and
+ // take the old one out.
+ if ([remote_layer_host_ contextId] != context_id) {
+ [remote_layer_host_ removeFromSuperlayer];
+
+ remote_layer_host_.reset([[CALayerHost alloc] init]);
+ [remote_layer_host_ setContextId:context_id];
+ [remote_layer_host_
+ setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin];
+ [background_layer_ addSublayer:remote_layer_host_];
+ }
+
+ // Ack the frame immediately. Any GPU back pressure will be applied by
+ // the remote layer from within the GPU process.
+ SendPendingSwapAck();
+ } break;
+ default:
+ LOG(ERROR) << "Invalid surface handle type.";
+ break;
+ }
}
void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
@@ -1681,13 +1718,11 @@ void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
"RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer");
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- IOSurfaceID io_surface_handle =
- static_cast<IOSurfaceID>(params.surface_handle);
AddPendingSwapAck(params.route_id,
gpu_host_id,
compositing_iosurface_ ?
compositing_iosurface_->GetRendererID() : 0);
- CompositorSwapBuffers(io_surface_handle,
+ CompositorSwapBuffers(IOSurfaceIDFromSurfaceHandle(params.surface_handle),
params.surface_size,
params.surface_scale_factor,
params.latency_info);
@@ -2204,12 +2239,8 @@ void RenderWidgetHostViewMac::LayoutLayers() {
0,
compositing_iosurface_->dip_io_surface_size().width(),
compositing_iosurface_->dip_io_surface_size().height());
- CGPoint layer_position = CGPointMake(
- 0,
- CGRectGetHeight(new_background_frame) - CGRectGetHeight(layer_bounds));
bool bounds_changed = !CGRectEqualToRect(
layer_bounds, [compositing_iosurface_layer_ bounds]);
- [compositing_iosurface_layer_ setPosition:layer_position];
[compositing_iosurface_layer_ setBounds:layer_bounds];
// If the bounds changed, then draw the frame immediately, to ensure that

Powered by Google App Engine
This is Rietveld 408576698