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

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: 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 : 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698