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() const { |
332 const { | 328 // If there is no view then the accelerated layer is not in the view |
333 // If there is no view then the accelerated layer is not in the hierarchy | 329 // hierarchy and will never draw. |
334 // and will never draw. | |
335 if (!view_) | 330 if (!view_) |
336 return true; | 331 return true; |
337 return view_->client()->BrowserCompositorViewShouldAckImmediately(); | 332 return view_->AcceleratedWidgetShouldIgnoreBackpressure(); |
338 } | 333 } |
339 | 334 |
340 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerDidDrawFrame() { | 335 void AcceleratedWidgetMac::IOSurfaceLayerDidDrawFrame() { |
341 if (accelerated_output_surface_id_) { | 336 AcknowledgeAcceleratedFrame(); |
342 content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed( | 337 } |
343 accelerated_output_surface_id_); | |
344 accelerated_output_surface_id_ = 0; | |
345 } | |
346 | 338 |
347 if (view_) { | 339 void AcceleratedWidgetMac::AcknowledgeAcceleratedFrame() { |
348 view_->client()->BrowserCompositorViewFrameSwapped( | 340 if (accelerated_frame_drawn_callback_.is_null()) |
349 accelerated_latency_info_); | 341 return; |
350 } | 342 accelerated_frame_drawn_callback_.Run(); |
351 | 343 accelerated_frame_drawn_callback_.Reset(); |
| 344 if (view_) |
| 345 view_->AcceleratedWidgetSwapCompleted(accelerated_latency_info_); |
352 accelerated_latency_info_.clear(); | 346 accelerated_latency_info_.clear(); |
353 } | 347 } |
354 | 348 |
355 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerHitError() { | 349 void AcceleratedWidgetMac::IOSurfaceLayerHitError() { |
356 // Perform all acks that would have been done if the frame had succeeded, to | 350 // Perform all acks that would have been done if the frame had succeeded, to |
357 // un-block the compositor and renderer. | 351 // un-block the compositor and renderer. |
358 IOSurfaceLayerDidDrawFrame(); | 352 AcknowledgeAcceleratedFrame(); |
359 | 353 |
360 // Poison the context being used and request a mulligan. | 354 // Poison the context being used and request a mulligan. |
361 [io_surface_layer_ poisonContextAndSharegroup]; | 355 [io_surface_layer_ poisonContextAndSharegroup]; |
362 compositor_->ScheduleFullRedraw(); | 356 |
| 357 if (view_) |
| 358 view_->AcceleratedWidgetHitError(); |
363 } | 359 } |
364 | 360 |
365 // static | 361 void AcceleratedWidgetMacGotAcceleratedFrame( |
366 BrowserCompositorCALayerTreeMac* BrowserCompositorCALayerTreeMac:: | 362 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, | 363 const std::vector<ui::LatencyInfo>& latency_info, |
382 gfx::Size pixel_size, float scale_factor, | 364 gfx::Size pixel_size, float scale_factor, |
| 365 const base::Closure& drawn_callback, |
383 bool* disable_throttling, int* renderer_id) { | 366 bool* disable_throttling, int* renderer_id) { |
384 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 367 AcceleratedWidgetMac* accelerated_widget_mac = |
385 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 368 GetHelperFromAcceleratedWidget(widget); |
386 if (ca_layer_tree) { | 369 if (accelerated_widget_mac) { |
387 ca_layer_tree->GotAcceleratedFrame( | 370 accelerated_widget_mac->GotAcceleratedFrame( |
388 surface_handle, surface_id, latency_info, pixel_size, scale_factor); | 371 surface_handle, latency_info, pixel_size, scale_factor, drawn_callback); |
389 *disable_throttling = ca_layer_tree->IsRendererThrottlingDisabled(); | 372 *disable_throttling = |
390 *renderer_id = ca_layer_tree->GetRendererID(); | 373 accelerated_widget_mac->IsRendererThrottlingDisabled(); |
| 374 *renderer_id = accelerated_widget_mac->GetRendererID(); |
391 } else { | 375 } else { |
392 *disable_throttling = false; | 376 *disable_throttling = false; |
393 *renderer_id = 0; | 377 *renderer_id = 0; |
394 } | 378 } |
395 } | 379 } |
396 | 380 |
397 void BrowserCompositorCALayerTreeMacGotSoftwareFrame( | 381 void AcceleratedWidgetMacGotSoftwareFrame( |
398 gfx::AcceleratedWidget widget, | 382 gfx::AcceleratedWidget widget, |
399 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { | 383 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { |
400 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 384 AcceleratedWidgetMac* accelerated_widget_mac = |
401 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 385 GetHelperFromAcceleratedWidget(widget); |
402 if (ca_layer_tree) | 386 if (accelerated_widget_mac) |
403 ca_layer_tree->GotSoftwareFrame(frame_data, scale_factor, canvas); | 387 accelerated_widget_mac->GotSoftwareFrame(frame_data, scale_factor, canvas); |
404 } | 388 } |
405 | 389 |
406 } // namespace content | 390 } // namespace content |
OLD | NEW |