Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/compositor/browser_compositor_ca_layer_tree_mac.h" | 5 #include "content/browser/compositor/browser_compositor_ca_layer_tree_mac.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "cc/output/software_frame_data.h" | |
| 9 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 10 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 11 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 12 #include "content/browser/compositor/gpu_process_transport_factory.h" | |
| 13 #include "content/browser/compositor/io_surface_layer_mac.h" | 13 #include "content/browser/compositor/io_surface_layer_mac.h" |
| 14 #include "content/browser/compositor/software_layer_mac.h" | 14 #include "content/browser/compositor/software_layer_mac.h" |
| 15 #include "content/browser/renderer_host/dip_util.h" | 15 #include "content/browser/renderer_host/dip_util.h" |
| 16 #include "content/browser/renderer_host/render_widget_resize_helper.h" | |
| 17 #include "content/common/gpu/surface_handle_types_mac.h" | 16 #include "content/common/gpu/surface_handle_types_mac.h" |
| 18 #include "content/public/browser/context_factory.h" | 17 #include "content/public/browser/context_factory.h" |
| 19 #include "ui/base/cocoa/animation_utils.h" | 18 #include "ui/base/cocoa/animation_utils.h" |
| 20 #include "ui/gl/scoped_cgl.h" | 19 #include "ui/gl/scoped_cgl.h" |
| 21 | 20 |
| 22 namespace content { | 21 namespace content { |
| 23 namespace { | 22 namespace { |
| 24 | 23 |
| 25 typedef std::map<gfx::AcceleratedWidget,BrowserCompositorCALayerTreeMac*> | 24 typedef std::map<gfx::AcceleratedWidget,AcceleratedWidgetMac*> |
| 26 WidgetToInternalsMap; | 25 WidgetToHelperMap; |
| 27 base::LazyInstance<WidgetToInternalsMap> g_widget_to_internals_map; | 26 base::LazyInstance<WidgetToHelperMap> g_widget_to_helper_map; |
| 27 | |
| 28 AcceleratedWidgetMac* GetHelperFromAcceleratedWidget( | |
| 29 gfx::AcceleratedWidget widget) { | |
| 30 WidgetToHelperMap::const_iterator found = | |
| 31 g_widget_to_helper_map.Pointer()->find(widget); | |
| 32 // This can end up being accessed after the underlying widget has been | |
| 33 // destroyed, but while the ui::Compositor is still being destroyed. | |
| 34 // Return NULL in these cases. | |
| 35 if (found == g_widget_to_helper_map.Pointer()->end()) | |
| 36 return NULL; | |
| 37 return found->second; | |
| 38 } | |
| 28 | 39 |
| 29 } | 40 } |
| 30 | 41 |
| 31 //////////////////////////////////////////////////////////////////////////////// | 42 //////////////////////////////////////////////////////////////////////////////// |
| 32 // BrowserCompositorCALayerTreeMac | 43 // AcceleratedWidgetMac |
| 33 | 44 |
| 34 BrowserCompositorCALayerTreeMac::BrowserCompositorCALayerTreeMac() | 45 AcceleratedWidgetMac::AcceleratedWidgetMac() |
| 35 : view_(NULL), | 46 : view_(NULL) { |
| 36 accelerated_output_surface_id_(0) { | |
| 37 // Disable the fade-in animation as the layers are added. | 47 // Disable the fade-in animation as the layers are added. |
| 38 ScopedCAActionDisabler disabler; | 48 ScopedCAActionDisabler disabler; |
| 39 | 49 |
| 40 // Add a flipped transparent layer as a child, so that we don't need to | 50 // Add a flipped transparent layer as a child, so that we don't need to |
| 41 // fiddle with the position of sub-layers -- they will always be at the | 51 // fiddle with the position of sub-layers -- they will always be at the |
| 42 // origin. | 52 // origin. |
| 43 flipped_layer_.reset([[CALayer alloc] init]); | 53 flipped_layer_.reset([[CALayer alloc] init]); |
| 44 [flipped_layer_ setGeometryFlipped:YES]; | 54 [flipped_layer_ setGeometryFlipped:YES]; |
| 45 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)]; | 55 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)]; |
| 46 [flipped_layer_ | 56 [flipped_layer_ |
| 47 setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; | 57 setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; |
| 48 | 58 |
| 49 // Use a sequence number as the accelerated widget handle that we can use | 59 // Use a sequence number as the accelerated widget handle that we can use |
| 50 // to look up the internals structure. | 60 // to look up the internals structure. |
| 51 static uintptr_t last_sequence_number = 0; | 61 static uintptr_t last_sequence_number = 0; |
| 52 last_sequence_number += 1; | 62 last_sequence_number += 1; |
| 53 native_widget_ = reinterpret_cast<gfx::AcceleratedWidget>( | 63 native_widget_ = reinterpret_cast<gfx::AcceleratedWidget>( |
| 54 last_sequence_number); | 64 last_sequence_number); |
| 55 g_widget_to_internals_map.Pointer()->insert( | 65 g_widget_to_helper_map.Pointer()->insert( |
| 56 std::make_pair(native_widget_, this)); | 66 std::make_pair(native_widget_, this)); |
| 57 | |
| 58 // Create a compositor to draw the contents of this view. | |
| 59 compositor_.reset(new ui::Compositor( | |
| 60 native_widget_, | |
| 61 content::GetContextFactory(), | |
| 62 RenderWidgetResizeHelper::Get()->task_runner())); | |
| 63 compositor_->SetVisible(false); | |
| 64 } | 67 } |
| 65 | 68 |
| 66 BrowserCompositorCALayerTreeMac::~BrowserCompositorCALayerTreeMac() { | 69 AcceleratedWidgetMac::~AcceleratedWidgetMac() { |
| 67 DCHECK(!view_); | 70 DCHECK(!view_); |
| 68 g_widget_to_internals_map.Pointer()->erase(native_widget_); | 71 g_widget_to_helper_map.Pointer()->erase(native_widget_); |
| 69 } | 72 } |
| 70 | 73 |
| 71 void BrowserCompositorCALayerTreeMac::SetView( | 74 void AcceleratedWidgetMac::SetNSView(AcceleratedWidgetMacNSView* view) { |
| 72 BrowserCompositorViewMac* view) { | |
| 73 // Disable the fade-in animation as the view is added. | 75 // Disable the fade-in animation as the view is added. |
| 74 ScopedCAActionDisabler disabler; | 76 ScopedCAActionDisabler disabler; |
| 75 | 77 |
| 76 DCHECK(view && !view_); | 78 DCHECK(view && !view_); |
| 77 view_ = view; | 79 view_ = view; |
| 78 compositor_->SetRootLayer(view_->ui_root_layer()); | |
| 79 | 80 |
| 80 CALayer* background_layer = [view_->native_view() layer]; | 81 CALayer* background_layer = [view_->AcceleratedWidgetGetNSView() layer]; |
| 81 DCHECK(background_layer); | 82 DCHECK(background_layer); |
| 82 [flipped_layer_ setBounds:[background_layer bounds]]; | 83 [flipped_layer_ setBounds:[background_layer bounds]]; |
| 83 [background_layer addSublayer:flipped_layer_]; | 84 [background_layer addSublayer:flipped_layer_]; |
| 84 compositor_->SetVisible(true); | |
| 85 } | 85 } |
| 86 | 86 |
| 87 void BrowserCompositorCALayerTreeMac::ResetView() { | 87 void AcceleratedWidgetMac::ResetNSView() { |
| 88 if (!view_) | 88 if (!view_) |
| 89 return; | 89 return; |
| 90 | 90 |
| 91 // Disable the fade-out animation as the view is removed. | 91 // Disable the fade-out animation as the view is removed. |
| 92 ScopedCAActionDisabler disabler; | 92 ScopedCAActionDisabler disabler; |
| 93 | 93 |
| 94 [flipped_layer_ removeFromSuperlayer]; | 94 [flipped_layer_ removeFromSuperlayer]; |
| 95 DestroyIOSurfaceLayer(io_surface_layer_); | 95 DestroyIOSurfaceLayer(io_surface_layer_); |
| 96 DestroyCAContextLayer(ca_context_layer_); | 96 DestroyCAContextLayer(ca_context_layer_); |
| 97 DestroySoftwareLayer(); | 97 DestroySoftwareLayer(); |
| 98 | 98 |
| 99 accelerated_output_surface_id_ = 0; | |
| 100 last_swap_size_dip_ = gfx::Size(); | 99 last_swap_size_dip_ = gfx::Size(); |
| 101 | |
| 102 compositor_->SetVisible(false); | |
| 103 compositor_->SetScaleAndSize(1.0, gfx::Size(0, 0)); | |
| 104 compositor_->SetRootLayer(NULL); | |
| 105 view_ = NULL; | 100 view_ = NULL; |
| 106 } | 101 } |
| 107 | 102 |
| 108 bool BrowserCompositorCALayerTreeMac::HasFrameOfSize( | 103 bool AcceleratedWidgetMac::HasFrameOfSize( |
| 109 const gfx::Size& dip_size) const { | 104 const gfx::Size& dip_size) const { |
| 110 return last_swap_size_dip_ == dip_size; | 105 return last_swap_size_dip_ == dip_size; |
| 111 } | 106 } |
| 112 | 107 |
| 113 int BrowserCompositorCALayerTreeMac::GetRendererID() const { | 108 int AcceleratedWidgetMac::GetRendererID() const { |
| 114 if (io_surface_layer_) | 109 if (io_surface_layer_) |
| 115 return [io_surface_layer_ rendererID]; | 110 return [io_surface_layer_ rendererID]; |
| 116 return 0; | 111 return 0; |
| 117 } | 112 } |
| 118 | 113 |
| 119 bool BrowserCompositorCALayerTreeMac::IsRendererThrottlingDisabled() const { | 114 bool AcceleratedWidgetMac::IsRendererThrottlingDisabled() const { |
| 120 if (view_) | 115 if (view_) |
| 121 return view_->client()->BrowserCompositorViewShouldAckImmediately(); | 116 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); |
| 122 return false; | 117 return false; |
| 123 } | 118 } |
| 124 | 119 |
| 125 void BrowserCompositorCALayerTreeMac::BeginPumpingFrames() { | 120 void AcceleratedWidgetMac::BeginPumpingFrames() { |
| 126 [io_surface_layer_ beginPumpingFrames]; | 121 [io_surface_layer_ beginPumpingFrames]; |
| 127 } | 122 } |
| 128 | 123 |
| 129 void BrowserCompositorCALayerTreeMac::EndPumpingFrames() { | 124 void AcceleratedWidgetMac::EndPumpingFrames() { |
| 130 [io_surface_layer_ endPumpingFrames]; | 125 [io_surface_layer_ endPumpingFrames]; |
| 131 } | 126 } |
| 132 | 127 |
| 133 void BrowserCompositorCALayerTreeMac::GotAcceleratedFrame( | 128 void AcceleratedWidgetMac::GotAcceleratedFrame( |
| 134 uint64 surface_handle, int output_surface_id, | 129 uint64 surface_handle, |
| 135 const std::vector<ui::LatencyInfo>& latency_info, | 130 const std::vector<ui::LatencyInfo>& latency_info, |
| 136 gfx::Size pixel_size, float scale_factor) { | 131 gfx::Size pixel_size, float scale_factor, |
| 132 const base::Closure& drawn_callback) { | |
| 137 // Record the surface and latency info to use when acknowledging this frame. | 133 // Record the surface and latency info to use when acknowledging this frame. |
| 138 DCHECK(!accelerated_output_surface_id_); | 134 DCHECK(accelerated_frame_drawn_callback_.is_null()); |
| 139 accelerated_output_surface_id_ = output_surface_id; | 135 accelerated_frame_drawn_callback_ = drawn_callback; |
| 140 accelerated_latency_info_.insert(accelerated_latency_info_.end(), | 136 accelerated_latency_info_.insert(accelerated_latency_info_.end(), |
| 141 latency_info.begin(), latency_info.end()); | 137 latency_info.begin(), latency_info.end()); |
| 142 | 138 |
| 143 // If there is no view and therefore no superview to draw into, early-out. | 139 // If there is no view and therefore no superview to draw into, early-out. |
| 144 if (!view_) { | 140 if (!view_) { |
| 145 IOSurfaceLayerDidDrawFrame(); | 141 AcknowledgeAcceleratedFrame(); |
| 146 return; | 142 return; |
| 147 } | 143 } |
| 148 | 144 |
| 149 // Disable the fade-in or fade-out effect if we create or remove layers. | 145 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 150 ScopedCAActionDisabler disabler; | 146 ScopedCAActionDisabler disabler; |
| 151 | 147 |
| 152 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); | 148 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
| 153 switch (GetSurfaceHandleType(surface_handle)) { | 149 switch (GetSurfaceHandleType(surface_handle)) { |
| 154 case kSurfaceHandleTypeIOSurface: { | 150 case kSurfaceHandleTypeIOSurface: { |
| 155 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); | 151 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); |
| 156 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); | 152 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); |
| 157 break; | 153 break; |
| 158 } | 154 } |
| 159 case kSurfaceHandleTypeCAContext: { | 155 case kSurfaceHandleTypeCAContext: { |
| 160 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); | 156 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); |
| 161 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); | 157 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); |
| 162 break; | 158 break; |
| 163 } | 159 } |
| 164 default: | 160 default: |
| 165 LOG(ERROR) << "Unrecognized accelerated frame type."; | 161 LOG(ERROR) << "Unrecognized accelerated frame type."; |
| 166 return; | 162 return; |
| 167 } | 163 } |
| 168 } | 164 } |
| 169 | 165 |
| 170 void BrowserCompositorCALayerTreeMac::GotAcceleratedCAContextFrame( | 166 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame( |
| 171 CAContextID ca_context_id, | 167 CAContextID ca_context_id, |
| 172 gfx::Size pixel_size, | 168 gfx::Size pixel_size, |
| 173 float scale_factor) { | 169 float scale_factor) { |
| 174 // In the layer is replaced, keep the old one around until after the new one | 170 // In the layer is replaced, keep the old one around until after the new one |
| 175 // is installed to avoid flashes. | 171 // is installed to avoid flashes. |
| 176 base::scoped_nsobject<CALayerHost> old_ca_context_layer = | 172 base::scoped_nsobject<CALayerHost> old_ca_context_layer = |
| 177 ca_context_layer_; | 173 ca_context_layer_; |
| 178 | 174 |
| 179 // Create the layer to host the layer exported by the GPU process with this | 175 // Create the layer to host the layer exported by the GPU process with this |
| 180 // particular CAContext ID. | 176 // particular CAContext ID. |
| 181 if ([ca_context_layer_ contextId] != ca_context_id) { | 177 if ([ca_context_layer_ contextId] != ca_context_id) { |
| 182 ca_context_layer_.reset([[CALayerHost alloc] init]); | 178 ca_context_layer_.reset([[CALayerHost alloc] init]); |
| 183 [ca_context_layer_ setContextId:ca_context_id]; | 179 [ca_context_layer_ setContextId:ca_context_id]; |
| 184 [ca_context_layer_ | 180 [ca_context_layer_ |
| 185 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; | 181 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; |
| 186 [flipped_layer_ addSublayer:ca_context_layer_]; | 182 [flipped_layer_ addSublayer:ca_context_layer_]; |
| 187 } | 183 } |
| 188 | 184 |
| 189 // Acknowledge the frame to unblock the compositor immediately (the GPU | 185 // Acknowledge the frame to unblock the compositor immediately (the GPU |
| 190 // process will do any required throttling). | 186 // process will do any required throttling). |
| 191 IOSurfaceLayerDidDrawFrame(); | 187 AcknowledgeAcceleratedFrame(); |
| 192 | 188 |
| 193 // If this replacing a same-type layer, remove it now that the new layer is | 189 // If this replacing a same-type layer, remove it now that the new layer is |
| 194 // in the hierarchy. | 190 // in the hierarchy. |
| 195 if (old_ca_context_layer != ca_context_layer_) | 191 if (old_ca_context_layer != ca_context_layer_) |
| 196 DestroyCAContextLayer(old_ca_context_layer); | 192 DestroyCAContextLayer(old_ca_context_layer); |
| 197 | 193 |
| 198 // Remove any different-type layers that this is replacing. | 194 // Remove any different-type layers that this is replacing. |
| 199 DestroyIOSurfaceLayer(io_surface_layer_); | 195 DestroyIOSurfaceLayer(io_surface_layer_); |
| 200 DestroySoftwareLayer(); | 196 DestroySoftwareLayer(); |
| 201 } | 197 } |
| 202 | 198 |
| 203 void BrowserCompositorCALayerTreeMac::GotAcceleratedIOSurfaceFrame( | 199 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame( |
| 204 IOSurfaceID io_surface_id, | 200 IOSurfaceID io_surface_id, |
| 205 gfx::Size pixel_size, | 201 gfx::Size pixel_size, |
| 206 float scale_factor) { | 202 float scale_factor) { |
| 207 // In the layer is replaced, keep the old one around until after the new one | 203 // In the layer is replaced, keep the old one around until after the new one |
| 208 // is installed to avoid flashes. | 204 // is installed to avoid flashes. |
| 209 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = | 205 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = |
| 210 io_surface_layer_; | 206 io_surface_layer_; |
| 211 | 207 |
| 212 // Create or re-create an IOSurface layer if needed. If there already exists | 208 // Create or re-create an IOSurface layer if needed. If there already exists |
| 213 // a layer but it has the wrong scale factor or it was poisoned, re-create the | 209 // a layer but it has the wrong scale factor or it was poisoned, re-create the |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 // If this replacing a same-type layer, remove it now that the new layer is | 259 // If this replacing a same-type layer, remove it now that the new layer is |
| 264 // in the hierarchy. | 260 // in the hierarchy. |
| 265 if (old_io_surface_layer != io_surface_layer_) | 261 if (old_io_surface_layer != io_surface_layer_) |
| 266 DestroyIOSurfaceLayer(old_io_surface_layer); | 262 DestroyIOSurfaceLayer(old_io_surface_layer); |
| 267 | 263 |
| 268 // Remove any different-type layers that this is replacing. | 264 // Remove any different-type layers that this is replacing. |
| 269 DestroyCAContextLayer(ca_context_layer_); | 265 DestroyCAContextLayer(ca_context_layer_); |
| 270 DestroySoftwareLayer(); | 266 DestroySoftwareLayer(); |
| 271 } | 267 } |
| 272 | 268 |
| 273 void BrowserCompositorCALayerTreeMac::GotSoftwareFrame( | 269 void AcceleratedWidgetMac::GotSoftwareFrame( |
| 274 cc::SoftwareFrameData* frame_data, | 270 cc::SoftwareFrameData* frame_data, |
| 275 float scale_factor, | 271 float scale_factor, |
| 276 SkCanvas* canvas) { | 272 SkCanvas* canvas) { |
| 277 if (!frame_data || !canvas || !view_) | 273 if (!frame_data || !canvas || !view_) |
| 278 return; | 274 return; |
| 279 | 275 |
| 280 // Disable the fade-in or fade-out effect if we create or remove layers. | 276 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 281 ScopedCAActionDisabler disabler; | 277 ScopedCAActionDisabler disabler; |
| 282 | 278 |
| 283 // If there is not a layer for software frames, create one. | 279 // If there is not a layer for software frames, create one. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 295 withRowBytes:row_bytes | 291 withRowBytes:row_bytes |
| 296 withPixelSize:pixel_size | 292 withPixelSize:pixel_size |
| 297 withScaleFactor:scale_factor]; | 293 withScaleFactor:scale_factor]; |
| 298 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); | 294 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
| 299 | 295 |
| 300 // Remove any different-type layers that this is replacing. | 296 // Remove any different-type layers that this is replacing. |
| 301 DestroyCAContextLayer(ca_context_layer_); | 297 DestroyCAContextLayer(ca_context_layer_); |
| 302 DestroyIOSurfaceLayer(io_surface_layer_); | 298 DestroyIOSurfaceLayer(io_surface_layer_); |
| 303 } | 299 } |
| 304 | 300 |
| 305 void BrowserCompositorCALayerTreeMac::DestroyCAContextLayer( | 301 void AcceleratedWidgetMac::DestroyCAContextLayer( |
| 306 base::scoped_nsobject<CALayerHost> ca_context_layer) { | 302 base::scoped_nsobject<CALayerHost> ca_context_layer) { |
| 307 if (!ca_context_layer) | 303 if (!ca_context_layer) |
| 308 return; | 304 return; |
| 309 [ca_context_layer removeFromSuperlayer]; | 305 [ca_context_layer removeFromSuperlayer]; |
| 310 if (ca_context_layer == ca_context_layer_) | 306 if (ca_context_layer == ca_context_layer_) |
| 311 ca_context_layer_.reset(); | 307 ca_context_layer_.reset(); |
| 312 } | 308 } |
| 313 | 309 |
| 314 void BrowserCompositorCALayerTreeMac::DestroyIOSurfaceLayer( | 310 void AcceleratedWidgetMac::DestroyIOSurfaceLayer( |
| 315 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { | 311 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { |
| 316 if (!io_surface_layer) | 312 if (!io_surface_layer) |
| 317 return; | 313 return; |
| 318 [io_surface_layer resetClient]; | 314 [io_surface_layer resetClient]; |
| 319 [io_surface_layer removeFromSuperlayer]; | 315 [io_surface_layer removeFromSuperlayer]; |
| 320 if (io_surface_layer == io_surface_layer_) | 316 if (io_surface_layer == io_surface_layer_) |
| 321 io_surface_layer_.reset(); | 317 io_surface_layer_.reset(); |
| 322 } | 318 } |
| 323 | 319 |
| 324 void BrowserCompositorCALayerTreeMac::DestroySoftwareLayer() { | 320 void AcceleratedWidgetMac::DestroySoftwareLayer() { |
| 325 if (!software_layer_) | 321 if (!software_layer_) |
| 326 return; | 322 return; |
| 327 [software_layer_ removeFromSuperlayer]; | 323 [software_layer_ removeFromSuperlayer]; |
| 328 software_layer_.reset(); | 324 software_layer_.reset(); |
| 329 } | 325 } |
| 330 | 326 |
| 331 bool BrowserCompositorCALayerTreeMac::IOSurfaceLayerShouldAckImmediately() | 327 bool AcceleratedWidgetMac::IOSurfaceLayerShouldAckImmediately() |
| 332 const { | 328 const { |
|
tapted
2014/11/20 23:18:07
nit: pull up
| |
| 333 // If there is no view then the accelerated layer is not in the hierarchy | 329 // If there is no view then the accelerated layer is not in the view |
| 334 // and will never draw. | 330 // hierarchy and will never draw. |
| 335 if (!view_) | 331 if (!view_) |
| 336 return true; | 332 return true; |
| 337 return view_->client()->BrowserCompositorViewShouldAckImmediately(); | 333 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); |
| 338 } | 334 } |
| 339 | 335 |
| 340 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerDidDrawFrame() { | 336 void AcceleratedWidgetMac::IOSurfaceLayerDidDrawFrame() { |
| 341 if (accelerated_output_surface_id_) { | 337 AcknowledgeAcceleratedFrame(); |
| 342 content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed( | 338 } |
| 343 accelerated_output_surface_id_); | |
| 344 accelerated_output_surface_id_ = 0; | |
| 345 } | |
| 346 | 339 |
| 347 if (view_) { | 340 void AcceleratedWidgetMac::AcknowledgeAcceleratedFrame() { |
| 348 view_->client()->BrowserCompositorViewFrameSwapped( | 341 if (accelerated_frame_drawn_callback_.is_null()) |
| 349 accelerated_latency_info_); | 342 return; |
| 350 } | 343 accelerated_frame_drawn_callback_.Run(); |
| 351 | 344 accelerated_frame_drawn_callback_.Reset(); |
| 345 if (view_) | |
| 346 view_->AcceleratedWidgetSwapCompleted(accelerated_latency_info_); | |
| 352 accelerated_latency_info_.clear(); | 347 accelerated_latency_info_.clear(); |
| 353 } | 348 } |
| 354 | 349 |
| 355 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerHitError() { | 350 void AcceleratedWidgetMac::IOSurfaceLayerHitError() { |
| 356 // Perform all acks that would have been done if the frame had succeeded, to | 351 // Perform all acks that would have been done if the frame had succeeded, to |
| 357 // un-block the compositor and renderer. | 352 // un-block the compositor and renderer. |
| 358 IOSurfaceLayerDidDrawFrame(); | 353 AcknowledgeAcceleratedFrame(); |
| 359 | 354 |
| 360 // Poison the context being used and request a mulligan. | 355 // Poison the context being used and request a mulligan. |
| 361 [io_surface_layer_ poisonContextAndSharegroup]; | 356 [io_surface_layer_ poisonContextAndSharegroup]; |
| 362 compositor_->ScheduleFullRedraw(); | 357 |
| 358 if (view_) | |
| 359 view_->AcceleratedWidgetHitError(); | |
| 363 } | 360 } |
| 364 | 361 |
| 365 // static | 362 void AcceleratedWidgetMacGotAcceleratedFrame( |
| 366 BrowserCompositorCALayerTreeMac* BrowserCompositorCALayerTreeMac:: | 363 gfx::AcceleratedWidget widget, uint64 surface_handle, |
| 367 FromAcceleratedWidget(gfx::AcceleratedWidget widget) { | |
| 368 WidgetToInternalsMap::const_iterator found = | |
| 369 g_widget_to_internals_map.Pointer()->find(widget); | |
| 370 // This can end up being accessed after the underlying widget has been | |
| 371 // destroyed, but while the ui::Compositor is still being destroyed. | |
| 372 // Return NULL in these cases. | |
| 373 if (found == g_widget_to_internals_map.Pointer()->end()) | |
| 374 return NULL; | |
| 375 return found->second; | |
| 376 } | |
| 377 | |
| 378 void BrowserCompositorCALayerTreeMacGotAcceleratedFrame( | |
| 379 gfx::AcceleratedWidget widget, | |
| 380 uint64 surface_handle, int surface_id, | |
| 381 const std::vector<ui::LatencyInfo>& latency_info, | 364 const std::vector<ui::LatencyInfo>& latency_info, |
| 382 gfx::Size pixel_size, float scale_factor, | 365 gfx::Size pixel_size, float scale_factor, |
| 366 const base::Closure& drawn_callback, | |
| 383 bool* disable_throttling, int* renderer_id) { | 367 bool* disable_throttling, int* renderer_id) { |
| 384 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 368 AcceleratedWidgetMac* accelerated_widget_mac = |
| 385 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 369 GetHelperFromAcceleratedWidget(widget); |
| 386 if (ca_layer_tree) { | 370 if (accelerated_widget_mac) { |
| 387 ca_layer_tree->GotAcceleratedFrame( | 371 accelerated_widget_mac->GotAcceleratedFrame( |
| 388 surface_handle, surface_id, latency_info, pixel_size, scale_factor); | 372 surface_handle, latency_info, pixel_size, scale_factor, drawn_callback); |
| 389 *disable_throttling = ca_layer_tree->IsRendererThrottlingDisabled(); | 373 *disable_throttling = |
| 390 *renderer_id = ca_layer_tree->GetRendererID(); | 374 accelerated_widget_mac->IsRendererThrottlingDisabled(); |
| 375 *renderer_id = accelerated_widget_mac->GetRendererID(); | |
| 391 } else { | 376 } else { |
| 392 *disable_throttling = false; | 377 *disable_throttling = false; |
| 393 *renderer_id = 0; | 378 *renderer_id = 0; |
| 394 } | 379 } |
| 395 } | 380 } |
| 396 | 381 |
| 397 void BrowserCompositorCALayerTreeMacGotSoftwareFrame( | 382 void AcceleratedWidgetMacGotSoftwareFrame( |
| 398 gfx::AcceleratedWidget widget, | 383 gfx::AcceleratedWidget widget, |
| 399 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { | 384 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { |
| 400 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 385 AcceleratedWidgetMac* accelerated_widget_mac = |
| 401 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 386 GetHelperFromAcceleratedWidget(widget); |
| 402 if (ca_layer_tree) | 387 if (accelerated_widget_mac) |
| 403 ca_layer_tree->GotSoftwareFrame(frame_data, scale_factor, canvas); | 388 accelerated_widget_mac->GotSoftwareFrame(frame_data, scale_factor, canvas); |
| 404 } | 389 } |
| 405 | 390 |
| 406 } // namespace content | 391 } // namespace content |
| OLD | NEW |