Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: content/browser/compositor/browser_compositor_ca_layer_tree_mac.mm

Issue 745453002: Create an AcceleratedWidgetMac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Chnage names from client to NSView Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698