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

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: Fix compile 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) {
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698