| 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 "ui/accelerated_widget_mac/accelerated_widget_mac.h" | 5 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/mac/mac_util.h" |
| 11 #include "base/mac/scoped_cftyperef.h" |
| 10 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 11 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 12 #include "third_party/skia/include/core/SkCanvas.h" | 14 #include "third_party/skia/include/core/SkCanvas.h" |
| 13 #include "ui/accelerated_widget_mac/io_surface_layer.h" | |
| 14 #include "ui/accelerated_widget_mac/surface_handle_types.h" | 15 #include "ui/accelerated_widget_mac/surface_handle_types.h" |
| 15 #include "ui/base/cocoa/animation_utils.h" | 16 #include "ui/base/cocoa/animation_utils.h" |
| 16 #include "ui/gfx/geometry/dip_util.h" | 17 #include "ui/gfx/geometry/dip_util.h" |
| 17 #include "ui/gl/scoped_cgl.h" | 18 #include "ui/gl/scoped_cgl.h" |
| 18 | 19 |
| 20 @interface CALayer (PrivateAPI) |
| 21 - (void)setContentsChanged; |
| 22 @end |
| 23 |
| 19 namespace ui { | 24 namespace ui { |
| 20 namespace { | 25 namespace { |
| 21 | 26 |
| 22 typedef std::map<gfx::AcceleratedWidget,AcceleratedWidgetMac*> | 27 typedef std::map<gfx::AcceleratedWidget,AcceleratedWidgetMac*> |
| 23 WidgetToHelperMap; | 28 WidgetToHelperMap; |
| 24 base::LazyInstance<WidgetToHelperMap> g_widget_to_helper_map; | 29 base::LazyInstance<WidgetToHelperMap> g_widget_to_helper_map; |
| 25 | 30 |
| 26 AcceleratedWidgetMac* GetHelperFromAcceleratedWidget( | 31 AcceleratedWidgetMac* GetHelperFromAcceleratedWidget( |
| 27 gfx::AcceleratedWidget widget) { | 32 gfx::AcceleratedWidget widget) { |
| 28 WidgetToHelperMap::const_iterator found = | 33 WidgetToHelperMap::const_iterator found = |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 } | 89 } |
| 85 | 90 |
| 86 void AcceleratedWidgetMac::ResetNSView() { | 91 void AcceleratedWidgetMac::ResetNSView() { |
| 87 if (!view_) | 92 if (!view_) |
| 88 return; | 93 return; |
| 89 | 94 |
| 90 // Disable the fade-out animation as the view is removed. | 95 // Disable the fade-out animation as the view is removed. |
| 91 ScopedCAActionDisabler disabler; | 96 ScopedCAActionDisabler disabler; |
| 92 | 97 |
| 93 [flipped_layer_ removeFromSuperlayer]; | 98 [flipped_layer_ removeFromSuperlayer]; |
| 94 DestroyIOSurfaceLayer(io_surface_layer_); | |
| 95 DestroyCAContextLayer(ca_context_layer_); | 99 DestroyCAContextLayer(ca_context_layer_); |
| 96 DestroySoftwareLayer(); | 100 DestroyLocalLayer(); |
| 97 | 101 |
| 98 last_swap_size_dip_ = gfx::Size(); | 102 last_swap_size_dip_ = gfx::Size(); |
| 99 view_ = NULL; | 103 view_ = NULL; |
| 100 } | 104 } |
| 101 | 105 |
| 102 bool AcceleratedWidgetMac::HasFrameOfSize( | 106 bool AcceleratedWidgetMac::HasFrameOfSize( |
| 103 const gfx::Size& dip_size) const { | 107 const gfx::Size& dip_size) const { |
| 104 return last_swap_size_dip_ == dip_size; | 108 return last_swap_size_dip_ == dip_size; |
| 105 } | 109 } |
| 106 | 110 |
| 107 int AcceleratedWidgetMac::GetRendererID() const { | 111 int AcceleratedWidgetMac::GetRendererID() const { |
| 108 if (io_surface_layer_) | |
| 109 return [io_surface_layer_ rendererID]; | |
| 110 return 0; | 112 return 0; |
| 111 } | 113 } |
| 112 | 114 |
| 113 void AcceleratedWidgetMac::GetVSyncParameters( | 115 void AcceleratedWidgetMac::GetVSyncParameters( |
| 114 base::TimeTicks* timebase, base::TimeDelta* interval) const { | 116 base::TimeTicks* timebase, base::TimeDelta* interval) const { |
| 115 if (view_) { | 117 if (view_) { |
| 116 view_->AcceleratedWidgetGetVSyncParameters(timebase, interval); | 118 view_->AcceleratedWidgetGetVSyncParameters(timebase, interval); |
| 117 } else { | 119 } else { |
| 118 *timebase = base::TimeTicks(); | 120 *timebase = base::TimeTicks(); |
| 119 *interval = base::TimeDelta(); | 121 *interval = base::TimeDelta(); |
| 120 } | 122 } |
| 121 } | 123 } |
| 122 | 124 |
| 123 bool AcceleratedWidgetMac::IsRendererThrottlingDisabled() const { | 125 bool AcceleratedWidgetMac::IsRendererThrottlingDisabled() const { |
| 124 if (view_) | 126 if (view_) |
| 125 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); | 127 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); |
| 126 return false; | 128 return false; |
| 127 } | 129 } |
| 128 | 130 |
| 129 void AcceleratedWidgetMac::BeginPumpingFrames() { | 131 void AcceleratedWidgetMac::BeginPumpingFrames() { |
| 130 [io_surface_layer_ beginPumpingFrames]; | |
| 131 } | 132 } |
| 132 | 133 |
| 133 void AcceleratedWidgetMac::EndPumpingFrames() { | 134 void AcceleratedWidgetMac::EndPumpingFrames() { |
| 134 [io_surface_layer_ endPumpingFrames]; | |
| 135 } | 135 } |
| 136 | 136 |
| 137 void AcceleratedWidgetMac::GotAcceleratedFrame( | 137 void AcceleratedWidgetMac::GotAcceleratedFrame( |
| 138 uint64 surface_handle, | 138 uint64 surface_handle, |
| 139 const std::vector<ui::LatencyInfo>& latency_info, | 139 const std::vector<ui::LatencyInfo>& latency_info, |
| 140 const gfx::Size& pixel_size, | 140 const gfx::Size& pixel_size, |
| 141 float scale_factor, | 141 float scale_factor, |
| 142 const gfx::Rect& pixel_damage_rect, | 142 const gfx::Rect& pixel_damage_rect, |
| 143 const base::Closure& drawn_callback) { | 143 const base::Closure& drawn_callback) { |
| 144 // Record the surface and latency info to use when acknowledging this frame. | 144 // Record the surface and latency info to use when acknowledging this frame. |
| 145 DCHECK(accelerated_frame_drawn_callback_.is_null()); | 145 DCHECK(accelerated_frame_drawn_callback_.is_null()); |
| 146 accelerated_frame_drawn_callback_ = drawn_callback; | 146 accelerated_frame_drawn_callback_ = drawn_callback; |
| 147 accelerated_latency_info_.insert(accelerated_latency_info_.end(), | 147 accelerated_latency_info_.insert(accelerated_latency_info_.end(), |
| 148 latency_info.begin(), latency_info.end()); | 148 latency_info.begin(), latency_info.end()); |
| 149 | 149 |
| 150 // If there is no view and therefore no superview to draw into, early-out. | 150 // If there is no view and therefore no superview to draw into, early-out. |
| 151 if (!view_) { | 151 if (!view_) { |
| 152 AcknowledgeAcceleratedFrame(); | 152 AcknowledgeAcceleratedFrame(); |
| 153 return; | 153 return; |
| 154 } | 154 } |
| 155 | 155 |
| 156 // Disable the fade-in or fade-out effect if we create or remove layers. | 156 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 157 ScopedCAActionDisabler disabler; | 157 ScopedCAActionDisabler disabler; |
| 158 | 158 |
| 159 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size); | |
| 160 switch (GetSurfaceHandleType(surface_handle)) { | 159 switch (GetSurfaceHandleType(surface_handle)) { |
| 161 case kSurfaceHandleTypeIOSurface: { | 160 case kSurfaceHandleTypeIOSurface: { |
| 162 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); | 161 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); |
| 163 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); | 162 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); |
| 164 break; | 163 break; |
| 165 } | 164 } |
| 166 case kSurfaceHandleTypeCAContext: { | 165 case kSurfaceHandleTypeCAContext: { |
| 167 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); | 166 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); |
| 168 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); | 167 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); |
| 169 break; | 168 break; |
| 170 } | 169 } |
| 171 default: | 170 default: |
| 172 LOG(ERROR) << "Unrecognized accelerated frame type."; | 171 DLOG(ERROR) << "Unrecognized accelerated frame type."; |
| 173 return; | 172 return; |
| 174 } | 173 } |
| 174 |
| 175 AcknowledgeAcceleratedFrame(); |
| 175 } | 176 } |
| 176 | 177 |
| 177 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame( | 178 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame( |
| 178 CAContextID ca_context_id, | 179 CAContextID ca_context_id, |
| 179 const gfx::Size& pixel_size, | 180 const gfx::Size& pixel_size, |
| 180 float scale_factor) { | 181 float scale_factor) { |
| 182 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size); |
| 183 |
| 181 // In the layer is replaced, keep the old one around until after the new one | 184 // In the layer is replaced, keep the old one around until after the new one |
| 182 // is installed to avoid flashes. | 185 // is installed to avoid flashes. |
| 183 base::scoped_nsobject<CALayerHost> old_ca_context_layer = | 186 base::scoped_nsobject<CALayerHost> old_ca_context_layer = |
| 184 ca_context_layer_; | 187 ca_context_layer_; |
| 185 | 188 |
| 186 // Create the layer to host the layer exported by the GPU process with this | 189 // Create the layer to host the layer exported by the GPU process with this |
| 187 // particular CAContext ID. | 190 // particular CAContext ID. |
| 188 if ([ca_context_layer_ contextId] != ca_context_id) { | 191 if ([ca_context_layer_ contextId] != ca_context_id) { |
| 189 ca_context_layer_.reset([[CALayerHost alloc] init]); | 192 ca_context_layer_.reset([[CALayerHost alloc] init]); |
| 190 [ca_context_layer_ setContextId:ca_context_id]; | 193 [ca_context_layer_ setContextId:ca_context_id]; |
| 191 [ca_context_layer_ | 194 [ca_context_layer_ |
| 192 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; | 195 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; |
| 193 [flipped_layer_ addSublayer:ca_context_layer_]; | 196 [flipped_layer_ addSublayer:ca_context_layer_]; |
| 194 } | 197 } |
| 195 | 198 |
| 196 // Acknowledge the frame to unblock the compositor immediately (the GPU | |
| 197 // process will do any required throttling). | |
| 198 AcknowledgeAcceleratedFrame(); | |
| 199 | |
| 200 // If this replacing a same-type layer, remove it now that the new layer is | 199 // If this replacing a same-type layer, remove it now that the new layer is |
| 201 // in the hierarchy. | 200 // in the hierarchy. |
| 202 if (old_ca_context_layer != ca_context_layer_) | 201 if (old_ca_context_layer != ca_context_layer_) |
| 203 DestroyCAContextLayer(old_ca_context_layer); | 202 DestroyCAContextLayer(old_ca_context_layer); |
| 204 | 203 |
| 205 // Remove any different-type layers that this is replacing. | 204 // Remove any different-type layers that this is replacing. |
| 206 DestroyIOSurfaceLayer(io_surface_layer_); | 205 DestroyLocalLayer(); |
| 207 DestroySoftwareLayer(); | |
| 208 } | 206 } |
| 209 | 207 |
| 210 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame( | 208 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame( |
| 211 IOSurfaceID io_surface_id, | 209 IOSurfaceID io_surface_id, |
| 212 const gfx::Size& pixel_size, | 210 const gfx::Size& pixel_size, |
| 213 float scale_factor) { | 211 float scale_factor) { |
| 214 // In the layer is replaced, keep the old one around until after the new one | 212 base::ScopedCFTypeRef<IOSurfaceRef> io_surface( |
| 215 // is installed to avoid flashes. | 213 IOSurfaceLookup(io_surface_id)); |
| 216 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = | 214 GotIOSurfaceFrame(io_surface, pixel_size, scale_factor, true); |
| 217 io_surface_layer_; | |
| 218 | |
| 219 // Create or re-create an IOSurface layer if needed. If there already exists | |
| 220 // a layer but it has the wrong scale factor or it was poisoned, re-create the | |
| 221 // layer. | |
| 222 bool needs_new_layer = | |
| 223 !io_surface_layer_ || | |
| 224 [io_surface_layer_ hasBeenPoisoned] || | |
| 225 [io_surface_layer_ scaleFactor] != scale_factor; | |
| 226 if (needs_new_layer) { | |
| 227 io_surface_layer_.reset( | |
| 228 [[IOSurfaceLayer alloc] initWithClient:this | |
| 229 withScaleFactor:scale_factor | |
| 230 needsGLFinishWorkaround:needs_gl_finish_workaround_]); | |
| 231 if (io_surface_layer_) | |
| 232 [flipped_layer_ addSublayer:io_surface_layer_]; | |
| 233 else | |
| 234 LOG(ERROR) << "Failed to create IOSurfaceLayer"; | |
| 235 } | |
| 236 | |
| 237 // Open the provided IOSurface. | |
| 238 if (io_surface_layer_) { | |
| 239 bool result = [io_surface_layer_ gotFrameWithIOSurface:io_surface_id | |
| 240 withPixelSize:pixel_size | |
| 241 withScaleFactor:scale_factor]; | |
| 242 if (!result) { | |
| 243 DestroyIOSurfaceLayer(io_surface_layer_); | |
| 244 LOG(ERROR) << "Failed open IOSurface in IOSurfaceLayer"; | |
| 245 } | |
| 246 } | |
| 247 | |
| 248 // Give a final complaint if anything with the layer's creation went wrong. | |
| 249 // This frame will appear blank, the compositor will try to create another, | |
| 250 // and maybe that will go better. | |
| 251 if (!io_surface_layer_) { | |
| 252 LOG(ERROR) << "IOSurfaceLayer is nil, tab will be blank"; | |
| 253 IOSurfaceLayerHitError(); | |
| 254 } | |
| 255 | |
| 256 // Make the CALayer draw and set its size appropriately. | |
| 257 if (io_surface_layer_) { | |
| 258 [io_surface_layer_ gotNewFrame]; | |
| 259 | |
| 260 // Set the bounds of the accelerated layer to match the size of the frame. | |
| 261 // If the bounds changed, force the content to be displayed immediately. | |
| 262 CGRect new_layer_bounds = CGRectMake( | |
| 263 0, 0, last_swap_size_dip_.width(), last_swap_size_dip_.height()); | |
| 264 bool bounds_changed = !CGRectEqualToRect( | |
| 265 new_layer_bounds, [io_surface_layer_ bounds]); | |
| 266 [io_surface_layer_ setBounds:new_layer_bounds]; | |
| 267 if (bounds_changed) | |
| 268 [io_surface_layer_ setNeedsDisplayAndDisplayAndAck]; | |
| 269 } | |
| 270 | |
| 271 // If this replacing a same-type layer, remove it now that the new layer is | |
| 272 // in the hierarchy. | |
| 273 if (old_io_surface_layer != io_surface_layer_) | |
| 274 DestroyIOSurfaceLayer(old_io_surface_layer); | |
| 275 | |
| 276 // Remove any different-type layers that this is replacing. | |
| 277 DestroyCAContextLayer(ca_context_layer_); | |
| 278 DestroySoftwareLayer(); | |
| 279 } | 215 } |
| 280 | 216 |
| 281 void AcceleratedWidgetMac::GotSoftwareFrame(float scale_factor, | 217 void AcceleratedWidgetMac::EnsureLocalLayer() { |
| 282 SkCanvas* canvas) { | 218 if (!local_layer_) { |
| 283 if (!canvas || !view_) | 219 local_layer_.reset([[CALayer alloc] init]); |
| 284 return; | 220 // Setting contents gravity is necessary to prevent the layer from being |
| 221 // scaled during dyanmic resizes (especially with devtools open). |
| 222 [local_layer_ setContentsGravity:kCAGravityTopLeft]; |
| 223 [flipped_layer_ addSublayer:local_layer_]; |
| 224 } |
| 225 } |
| 226 |
| 227 void AcceleratedWidgetMac::GotIOSurfaceFrame( |
| 228 base::ScopedCFTypeRef<IOSurfaceRef> io_surface, |
| 229 const gfx::Size& pixel_size, |
| 230 float scale_factor, |
| 231 bool flip_y) { |
| 232 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size); |
| 285 | 233 |
| 286 // Disable the fade-in or fade-out effect if we create or remove layers. | 234 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 287 ScopedCAActionDisabler disabler; | 235 ScopedCAActionDisabler disabler; |
| 288 | 236 |
| 289 // If there is not a layer for software frames, create one. | 237 // If there is not a layer for local frames, create one. |
| 290 if (!software_layer_) { | 238 EnsureLocalLayer(); |
| 291 software_layer_.reset([[SoftwareLayer alloc] init]); | 239 |
| 292 [flipped_layer_ addSublayer:software_layer_]; | 240 id new_contents = static_cast<id>(io_surface.get()); |
| 241 |
| 242 if (new_contents && new_contents == [local_layer_ contents]) { |
| 243 [local_layer_ setContentsChanged]; |
| 244 } else { |
| 245 [local_layer_ setContents:new_contents]; |
| 293 } | 246 } |
| 294 | 247 |
| 295 // Set the software layer to draw the provided canvas. | 248 [local_layer_ setBounds:CGRectMake(0, 0, pixel_size.width() / scale_factor, |
| 296 SkImageInfo info; | 249 pixel_size.height() / scale_factor)]; |
| 297 size_t row_bytes; | 250 |
| 298 const void* pixels = canvas->peekPixels(&info, &row_bytes); | 251 if ([local_layer_ respondsToSelector:(@selector(contentsScale))] && |
| 299 gfx::Size pixel_size(info.width(), info.height()); | 252 [local_layer_ respondsToSelector:(@selector(setContentsScale:))] && |
| 300 [software_layer_ setContentsToData:pixels | 253 [local_layer_ contentsScale] != scale_factor) { |
| 301 withRowBytes:row_bytes | 254 DCHECK(base::mac::IsOSLionOrLater()); |
| 302 withPixelSize:pixel_size | 255 [local_layer_ setContentsScale:scale_factor]; |
| 303 withScaleFactor:scale_factor]; | 256 } |
| 304 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size); | 257 |
| 258 if (flip_y) { |
| 259 [local_layer_ setAnchorPoint:CGPointMake(0, 1)]; |
| 260 [local_layer_ setAffineTransform:CGAffineTransformMakeScale(1.0, -1.0)]; |
| 261 } else { |
| 262 [local_layer_ setAnchorPoint:CGPointMake(0, 0)]; |
| 263 [local_layer_ setAffineTransform:CGAffineTransformMakeScale(1.0, 1.0)]; |
| 264 } |
| 305 | 265 |
| 306 // Remove any different-type layers that this is replacing. | 266 // Remove any different-type layers that this is replacing. |
| 307 DestroyCAContextLayer(ca_context_layer_); | 267 DestroyCAContextLayer(ca_context_layer_); |
| 308 DestroyIOSurfaceLayer(io_surface_layer_); | |
| 309 } | 268 } |
| 310 | 269 |
| 311 void AcceleratedWidgetMac::DestroyCAContextLayer( | 270 void AcceleratedWidgetMac::DestroyCAContextLayer( |
| 312 base::scoped_nsobject<CALayerHost> ca_context_layer) { | 271 base::scoped_nsobject<CALayerHost> ca_context_layer) { |
| 313 if (!ca_context_layer) | 272 if (!ca_context_layer) |
| 314 return; | 273 return; |
| 315 [ca_context_layer removeFromSuperlayer]; | 274 [ca_context_layer removeFromSuperlayer]; |
| 316 if (ca_context_layer == ca_context_layer_) | 275 if (ca_context_layer == ca_context_layer_) |
| 317 ca_context_layer_.reset(); | 276 ca_context_layer_.reset(); |
| 318 } | 277 } |
| 319 | 278 |
| 320 void AcceleratedWidgetMac::DestroyIOSurfaceLayer( | 279 void AcceleratedWidgetMac::DestroyLocalLayer() { |
| 321 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { | 280 if (!local_layer_) |
| 322 if (!io_surface_layer) | |
| 323 return; | 281 return; |
| 324 [io_surface_layer resetClient]; | 282 [local_layer_ removeFromSuperlayer]; |
| 325 [io_surface_layer removeFromSuperlayer]; | 283 local_layer_.reset(); |
| 326 if (io_surface_layer == io_surface_layer_) | |
| 327 io_surface_layer_.reset(); | |
| 328 } | |
| 329 | |
| 330 void AcceleratedWidgetMac::DestroySoftwareLayer() { | |
| 331 if (!software_layer_) | |
| 332 return; | |
| 333 [software_layer_ removeFromSuperlayer]; | |
| 334 software_layer_.reset(); | |
| 335 } | |
| 336 | |
| 337 bool AcceleratedWidgetMac::IOSurfaceLayerShouldAckImmediately() const { | |
| 338 // If there is no view then the accelerated layer is not in the view | |
| 339 // hierarchy and will never draw. | |
| 340 if (!view_) | |
| 341 return true; | |
| 342 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); | |
| 343 } | |
| 344 | |
| 345 void AcceleratedWidgetMac::IOSurfaceLayerDidDrawFrame() { | |
| 346 AcknowledgeAcceleratedFrame(); | |
| 347 } | 284 } |
| 348 | 285 |
| 349 void AcceleratedWidgetMac::AcknowledgeAcceleratedFrame() { | 286 void AcceleratedWidgetMac::AcknowledgeAcceleratedFrame() { |
| 350 if (accelerated_frame_drawn_callback_.is_null()) | 287 if (accelerated_frame_drawn_callback_.is_null()) |
| 351 return; | 288 return; |
| 352 accelerated_frame_drawn_callback_.Run(); | 289 accelerated_frame_drawn_callback_.Run(); |
| 353 accelerated_frame_drawn_callback_.Reset(); | 290 accelerated_frame_drawn_callback_.Reset(); |
| 354 if (view_) | 291 if (view_) |
| 355 view_->AcceleratedWidgetSwapCompleted(accelerated_latency_info_); | 292 view_->AcceleratedWidgetSwapCompleted(accelerated_latency_info_); |
| 356 accelerated_latency_info_.clear(); | 293 accelerated_latency_info_.clear(); |
| 357 } | 294 } |
| 358 | 295 |
| 359 void AcceleratedWidgetMac::IOSurfaceLayerHitError() { | |
| 360 // Perform all acks that would have been done if the frame had succeeded, to | |
| 361 // un-block the compositor and renderer. | |
| 362 AcknowledgeAcceleratedFrame(); | |
| 363 | |
| 364 // Poison the context being used and request a mulligan. | |
| 365 [io_surface_layer_ poisonContextAndSharegroup]; | |
| 366 | |
| 367 if (view_) | |
| 368 view_->AcceleratedWidgetHitError(); | |
| 369 } | |
| 370 | |
| 371 void AcceleratedWidgetMacGotAcceleratedFrame( | 296 void AcceleratedWidgetMacGotAcceleratedFrame( |
| 372 gfx::AcceleratedWidget widget, uint64 surface_handle, | 297 gfx::AcceleratedWidget widget, uint64 surface_handle, |
| 373 const std::vector<ui::LatencyInfo>& latency_info, | 298 const std::vector<ui::LatencyInfo>& latency_info, |
| 374 const gfx::Size& pixel_size, | 299 const gfx::Size& pixel_size, |
| 375 float scale_factor, | 300 float scale_factor, |
| 376 const gfx::Rect& pixel_damage_rect, | 301 const gfx::Rect& pixel_damage_rect, |
| 377 const base::Closure& drawn_callback, | 302 const base::Closure& drawn_callback, |
| 378 bool* disable_throttling, int* renderer_id, | 303 bool* disable_throttling, int* renderer_id, |
| 379 base::TimeTicks* vsync_timebase, base::TimeDelta* vsync_interval) { | 304 base::TimeTicks* vsync_timebase, base::TimeDelta* vsync_interval) { |
| 380 AcceleratedWidgetMac* accelerated_widget_mac = | 305 AcceleratedWidgetMac* accelerated_widget_mac = |
| 381 GetHelperFromAcceleratedWidget(widget); | 306 GetHelperFromAcceleratedWidget(widget); |
| 382 if (accelerated_widget_mac) { | 307 if (accelerated_widget_mac) { |
| 383 accelerated_widget_mac->GotAcceleratedFrame( | 308 accelerated_widget_mac->GotAcceleratedFrame( |
| 384 surface_handle, latency_info, pixel_size, scale_factor, | 309 surface_handle, latency_info, pixel_size, scale_factor, |
| 385 pixel_damage_rect, drawn_callback); | 310 pixel_damage_rect, drawn_callback); |
| 386 *disable_throttling = | 311 *disable_throttling = |
| 387 accelerated_widget_mac->IsRendererThrottlingDisabled(); | 312 accelerated_widget_mac->IsRendererThrottlingDisabled(); |
| 388 *renderer_id = accelerated_widget_mac->GetRendererID(); | 313 *renderer_id = accelerated_widget_mac->GetRendererID(); |
| 389 accelerated_widget_mac->GetVSyncParameters(vsync_timebase, vsync_interval); | 314 accelerated_widget_mac->GetVSyncParameters(vsync_timebase, vsync_interval); |
| 390 } else { | 315 } else { |
| 391 *disable_throttling = false; | 316 *disable_throttling = false; |
| 392 *renderer_id = 0; | 317 *renderer_id = 0; |
| 393 *vsync_timebase = base::TimeTicks(); | 318 *vsync_timebase = base::TimeTicks(); |
| 394 *vsync_interval = base::TimeDelta(); | 319 *vsync_interval = base::TimeDelta(); |
| 395 } | 320 } |
| 396 } | 321 } |
| 397 | 322 |
| 398 void AcceleratedWidgetMacGotSoftwareFrame( | 323 void AcceleratedWidgetMacGotIOSurfaceFrame( |
| 399 gfx::AcceleratedWidget widget, float scale_factor, SkCanvas* canvas) { | 324 gfx::AcceleratedWidget widget, |
| 325 base::ScopedCFTypeRef<IOSurfaceRef> io_surface, |
| 326 const gfx::Size& pixel_size, |
| 327 float scale_factor, |
| 328 bool flip_y) { |
| 400 AcceleratedWidgetMac* accelerated_widget_mac = | 329 AcceleratedWidgetMac* accelerated_widget_mac = |
| 401 GetHelperFromAcceleratedWidget(widget); | 330 GetHelperFromAcceleratedWidget(widget); |
| 402 if (accelerated_widget_mac) | 331 if (accelerated_widget_mac) { |
| 403 accelerated_widget_mac->GotSoftwareFrame(scale_factor, canvas); | 332 accelerated_widget_mac->GotIOSurfaceFrame(io_surface, pixel_size, |
| 333 scale_factor, flip_y); |
| 334 } |
| 404 } | 335 } |
| 405 | 336 |
| 406 } // namespace ui | 337 } // namespace ui |
| OLD | NEW |