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