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 90c834054313df4d868f3e913cf59c09f8a70d05..3e1971ca9c71936da1f066cd898b783e87dc46b2 100644 |
--- a/content/browser/compositor/browser_compositor_view_private_mac.mm |
+++ b/content/browser/compositor/browser_compositor_view_private_mac.mm |
@@ -10,11 +10,9 @@ |
#include "base/lazy_instance.h" |
#include "base/message_loop/message_loop.h" |
#include "content/browser/compositor/gpu_process_transport_factory.h" |
-#include "content/browser/renderer_host/compositing_iosurface_context_mac.h" |
-#include "content/browser/renderer_host/compositing_iosurface_mac.h" |
+#include "content/browser/compositor/software_layer_mac.h" |
#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_handle_types_mac.h" |
#include "content/public/browser/context_factory.h" |
#include "ui/base/cocoa/animation_utils.h" |
@@ -34,7 +32,8 @@ base::LazyInstance<WidgetToInternalsMap> g_widget_to_internals_map; |
BrowserCompositorViewMacInternal::BrowserCompositorViewMacInternal() |
: client_(NULL), |
- accelerated_output_surface_id_(0) { |
+ accelerated_output_surface_id_(0), |
+ weak_factory_(this) { |
// Disable the fade-in animation as the layers are added. |
ScopedCAActionDisabler disabler; |
@@ -110,7 +109,7 @@ bool BrowserCompositorViewMacInternal::HasFrameOfSize( |
int BrowserCompositorViewMacInternal::GetRendererID() const { |
if (io_surface_layer_) |
- return [io_surface_layer_ iosurface]->GetRendererID(); |
+ return [io_surface_layer_ rendererID]; |
return 0; |
} |
@@ -134,7 +133,7 @@ void BrowserCompositorViewMacInternal::GotAcceleratedFrame( |
// If there is no client and therefore no superview to draw into, early-out. |
if (!client_) { |
- AcceleratedLayerDidDrawFrame(); |
+ IOSurfaceLayerDidDrawFrame(); |
return; |
} |
@@ -180,7 +179,7 @@ void BrowserCompositorViewMacInternal::GotAcceleratedCAContextFrame( |
// Acknowledge the frame to unblock the compositor immediately (the GPU |
// process will do any required throttling). |
- AcceleratedLayerDidDrawFrame(); |
+ IOSurfaceLayerDidDrawFrame(); |
// If this replacing a same-type layer, remove it now that the new layer is |
// in the hierarchy. |
@@ -198,68 +197,33 @@ void BrowserCompositorViewMacInternal::GotAcceleratedIOSurfaceFrame( |
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_io_surface_layer = |
+ base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = |
io_surface_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 = |
- !io_surface_layer_ || |
- [io_surface_layer_ context]->HasBeenPoisoned() || |
- [io_surface_layer_ iosurface]->scale_factor() != scale_factor; |
+ // a layer but it has the wrong scale factor re-create the layer. |
+ bool needs_new_layer = !io_surface_layer_ || |
+ [io_surface_layer_ scaleFactor] != scale_factor; |
if (needs_new_layer) { |
- scoped_refptr<content::CompositingIOSurfaceMac> iosurface = |
- content::CompositingIOSurfaceMac::Create(); |
- if (!iosurface) { |
- LOG(ERROR) << "Failed to create CompositingIOSurfaceMac"; |
- } else { |
- io_surface_layer_.reset([[CompositingIOSurfaceLayer alloc] |
- initWithIOSurface:iosurface |
- withScaleFactor:scale_factor |
- withClient:this]); |
- if (io_surface_layer_) |
- [flipped_layer_ addSublayer:io_surface_layer_]; |
- else |
- LOG(ERROR) << "Failed to create CompositingIOSurfaceLayer"; |
- } |
+ io_surface_layer_.reset([[IOSurfaceLayer alloc] |
+ initWithClient:this withScaleFactor:scale_factor]); |
+ DCHECK(io_surface_layer_); |
+ [flipped_layer_ addSublayer:io_surface_layer_]; |
} |
- // Open the provided IOSurface. |
- if (io_surface_layer_) { |
- bool result = true; |
- gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
- [io_surface_layer_ context]->cgl_context()); |
- result = [io_surface_layer_ iosurface]->SetIOSurfaceWithContextCurrent( |
- [io_surface_layer_ context], io_surface_id, pixel_size, scale_factor); |
- if (!result) { |
- DestroyIOSurfaceLayer(io_surface_layer_); |
- LOG(ERROR) << "Failed open IOSurface in CompositingIOSurfaceLayer"; |
- } |
- } |
- |
- // Give a final complaint if anything with the layer's creation went wrong. |
- // This frame will appear blank, the compositor will try to create another, |
- // and maybe that will go better. |
- if (!io_surface_layer_) { |
- LOG(ERROR) << "CompositingIOSurfaceLayer is nil, tab will be blank"; |
- AcceleratedLayerHitError(); |
- } |
+ [io_surface_layer_ gotFrameWithIOSurface:io_surface_id |
+ withPixelSize:pixel_size |
+ withScaleFactor:scale_factor]; |
- // Make the CALayer draw and set its size appropriately. |
- if (io_surface_layer_) { |
- [io_surface_layer_ gotNewFrame]; |
- |
- // 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. |
- CGRect new_layer_bounds = CGRectMake( |
- 0, 0, last_swap_size_dip_.width(), last_swap_size_dip_.height()); |
- bool bounds_changed = !CGRectEqualToRect( |
- new_layer_bounds, [io_surface_layer_ bounds]); |
- [io_surface_layer_ setBounds:new_layer_bounds]; |
- if (bounds_changed) |
- [io_surface_layer_ setNeedsDisplayAndDisplayAndAck]; |
- } |
+ // 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. |
+ CGRect new_layer_bounds = CGRectMake( |
+ 0, 0, last_swap_size_dip_.width(), last_swap_size_dip_.height()); |
+ bool bounds_changed = !CGRectEqualToRect( |
+ new_layer_bounds, [io_surface_layer_ bounds]); |
+ [io_surface_layer_ setBounds:new_layer_bounds]; |
+ if (bounds_changed) |
+ [io_surface_layer_ setNeedsDisplayAndDisplayAndAck]; |
// If this replacing a same-type layer, remove it now that the new layer is |
// in the hierarchy. |
@@ -313,7 +277,7 @@ void BrowserCompositorViewMacInternal::DestroyCAContextLayer( |
} |
void BrowserCompositorViewMacInternal::DestroyIOSurfaceLayer( |
- base::scoped_nsobject<CompositingIOSurfaceLayer> io_surface_layer) { |
+ base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { |
if (!io_surface_layer) |
return; |
[io_surface_layer resetClient]; |
@@ -329,7 +293,7 @@ void BrowserCompositorViewMacInternal::DestroySoftwareLayer() { |
software_layer_.reset(); |
} |
-bool BrowserCompositorViewMacInternal::AcceleratedLayerShouldAckImmediately() |
+bool BrowserCompositorViewMacInternal::IOSurfaceLayerShouldAckImmediately() |
const { |
// If there is no client then the accelerated layer is not in the hierarchy |
// and will never draw. |
@@ -338,7 +302,7 @@ bool BrowserCompositorViewMacInternal::AcceleratedLayerShouldAckImmediately() |
return client_->BrowserCompositorViewShouldAckImmediately(); |
} |
-void BrowserCompositorViewMacInternal::AcceleratedLayerDidDrawFrame() { |
+void BrowserCompositorViewMacInternal::IOSurfaceLayerDidDrawFrame() { |
if (accelerated_output_surface_id_) { |
content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed( |
accelerated_output_surface_id_); |
@@ -351,14 +315,17 @@ void BrowserCompositorViewMacInternal::AcceleratedLayerDidDrawFrame() { |
accelerated_latency_info_.clear(); |
} |
-void BrowserCompositorViewMacInternal::AcceleratedLayerHitError() { |
- // Perform all acks that would have been done if the frame had succeeded, to |
- // un-block the compositor and renderer. |
- AcceleratedLayerDidDrawFrame(); |
+void BrowserCompositorViewMacInternal::IOSurfaceLayerHitError() { |
+ base::MessageLoop::current()->PostTask(FROM_HERE, |
+ base::Bind(&BrowserCompositorViewMacInternal::HandleIOSurfaceLayerError, |
+ weak_factory_.GetWeakPtr())); |
+} |
- // Poison the context being used and request a mulligan. |
- if (io_surface_layer_) |
- [io_surface_layer_ context]->PoisonContextAndSharegroup(); |
+void BrowserCompositorViewMacInternal::HandleIOSurfaceLayerError() { |
+ // Destroy the layer that caused the error. |
+ DestroyIOSurfaceLayer(io_surface_layer_); |
+ |
+ // Request a mulligan. |
compositor_->ScheduleFullRedraw(); |
} |