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