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

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

Issue 638123003: Prepare to move BrowserCompositorViewMac to ui (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 6 years, 2 months 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 "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 14 matching lines...) Expand all
25 typedef std::map<gfx::AcceleratedWidget,BrowserCompositorCALayerTreeMac*> 25 typedef std::map<gfx::AcceleratedWidget,BrowserCompositorCALayerTreeMac*>
26 WidgetToInternalsMap; 26 WidgetToInternalsMap;
27 base::LazyInstance<WidgetToInternalsMap> g_widget_to_internals_map; 27 base::LazyInstance<WidgetToInternalsMap> g_widget_to_internals_map;
28 28
29 } 29 }
30 30
31 //////////////////////////////////////////////////////////////////////////////// 31 ////////////////////////////////////////////////////////////////////////////////
32 // BrowserCompositorCALayerTreeMac 32 // BrowserCompositorCALayerTreeMac
33 33
34 BrowserCompositorCALayerTreeMac::BrowserCompositorCALayerTreeMac() 34 BrowserCompositorCALayerTreeMac::BrowserCompositorCALayerTreeMac()
35 : client_(NULL), 35 : view_(NULL),
36 accelerated_output_surface_id_(0) { 36 accelerated_output_surface_id_(0) {
37 // Disable the fade-in animation as the layers are added. 37 // Disable the fade-in animation as the layers are added.
38 ScopedCAActionDisabler disabler; 38 ScopedCAActionDisabler disabler;
39 39
40 // Add a flipped transparent layer as a child, so that we don't need to 40 // 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 41 // fiddle with the position of sub-layers -- they will always be at the
42 // origin. 42 // origin.
43 flipped_layer_.reset([[CALayer alloc] init]); 43 flipped_layer_.reset([[CALayer alloc] init]);
44 [flipped_layer_ setGeometryFlipped:YES]; 44 [flipped_layer_ setGeometryFlipped:YES];
45 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)]; 45 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)];
(...skipping 11 matching lines...) Expand all
57 57
58 // Create a compositor to draw the contents of this view. 58 // Create a compositor to draw the contents of this view.
59 compositor_.reset(new ui::Compositor( 59 compositor_.reset(new ui::Compositor(
60 native_widget_, 60 native_widget_,
61 content::GetContextFactory(), 61 content::GetContextFactory(),
62 RenderWidgetResizeHelper::Get()->task_runner())); 62 RenderWidgetResizeHelper::Get()->task_runner()));
63 compositor_->SetVisible(false); 63 compositor_->SetVisible(false);
64 } 64 }
65 65
66 BrowserCompositorCALayerTreeMac::~BrowserCompositorCALayerTreeMac() { 66 BrowserCompositorCALayerTreeMac::~BrowserCompositorCALayerTreeMac() {
67 DCHECK(!client_); 67 DCHECK(!view_);
68 g_widget_to_internals_map.Pointer()->erase(native_widget_); 68 g_widget_to_internals_map.Pointer()->erase(native_widget_);
69 } 69 }
70 70
71 void BrowserCompositorCALayerTreeMac::SetClient( 71 void BrowserCompositorCALayerTreeMac::SetView(
72 BrowserCompositorViewMacClient* client) { 72 BrowserCompositorViewMac* view) {
73 // Disable the fade-in animation as the view is added. 73 // Disable the fade-in animation as the view is added.
74 ScopedCAActionDisabler disabler; 74 ScopedCAActionDisabler disabler;
75 75
76 DCHECK(client && !client_); 76 DCHECK(view && !view_);
77 client_ = client; 77 view_ = view;
78 compositor_->SetRootLayer(client_->BrowserCompositorRootLayer()); 78 compositor_->SetRootLayer(view_->ui_root_layer());
79 79
80 CALayer* background_layer = [client_->BrowserCompositorSuperview() layer]; 80 CALayer* background_layer = [view_->native_view() layer];
81 DCHECK(background_layer); 81 DCHECK(background_layer);
82 [flipped_layer_ setBounds:[background_layer bounds]]; 82 [flipped_layer_ setBounds:[background_layer bounds]];
83 [background_layer addSublayer:flipped_layer_]; 83 [background_layer addSublayer:flipped_layer_];
84 compositor_->SetVisible(true); 84 compositor_->SetVisible(true);
85 } 85 }
86 86
87 void BrowserCompositorCALayerTreeMac::ResetClient() { 87 void BrowserCompositorCALayerTreeMac::ResetView() {
88 if (!client_) 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; 99 accelerated_output_surface_id_ = 0;
100 last_swap_size_dip_ = gfx::Size(); 100 last_swap_size_dip_ = gfx::Size();
101 101
102 compositor_->SetVisible(false); 102 compositor_->SetVisible(false);
103 compositor_->SetScaleAndSize(1.0, gfx::Size(0, 0)); 103 compositor_->SetScaleAndSize(1.0, gfx::Size(0, 0));
104 compositor_->SetRootLayer(NULL); 104 compositor_->SetRootLayer(NULL);
105 client_ = NULL; 105 view_ = NULL;
106 } 106 }
107 107
108 bool BrowserCompositorCALayerTreeMac::HasFrameOfSize( 108 bool BrowserCompositorCALayerTreeMac::HasFrameOfSize(
109 const gfx::Size& dip_size) const { 109 const gfx::Size& dip_size) const {
110 return last_swap_size_dip_ == dip_size; 110 return last_swap_size_dip_ == dip_size;
111 } 111 }
112 112
113 int BrowserCompositorCALayerTreeMac::GetRendererID() const { 113 int BrowserCompositorCALayerTreeMac::GetRendererID() const {
114 if (io_surface_layer_) 114 if (io_surface_layer_)
115 return [io_surface_layer_ rendererID]; 115 return [io_surface_layer_ rendererID];
116 return 0; 116 return 0;
117 } 117 }
118 118
119 bool BrowserCompositorCALayerTreeMac::IsRendererThrottlingDisabled() const { 119 bool BrowserCompositorCALayerTreeMac::IsRendererThrottlingDisabled() const {
120 if (client_) 120 if (view_)
121 return client_->BrowserCompositorViewShouldAckImmediately(); 121 return view_->client()->BrowserCompositorViewShouldAckImmediately();
122 return false; 122 return false;
123 } 123 }
124 124
125 void BrowserCompositorCALayerTreeMac::BeginPumpingFrames() { 125 void BrowserCompositorCALayerTreeMac::BeginPumpingFrames() {
126 [io_surface_layer_ beginPumpingFrames]; 126 [io_surface_layer_ beginPumpingFrames];
127 } 127 }
128 128
129 void BrowserCompositorCALayerTreeMac::EndPumpingFrames() { 129 void BrowserCompositorCALayerTreeMac::EndPumpingFrames() {
130 [io_surface_layer_ endPumpingFrames]; 130 [io_surface_layer_ endPumpingFrames];
131 } 131 }
132 132
133 void BrowserCompositorCALayerTreeMac::GotAcceleratedFrame( 133 void BrowserCompositorCALayerTreeMac::GotAcceleratedFrame(
134 uint64 surface_handle, int output_surface_id, 134 uint64 surface_handle, int output_surface_id,
135 const std::vector<ui::LatencyInfo>& latency_info, 135 const std::vector<ui::LatencyInfo>& latency_info,
136 gfx::Size pixel_size, float scale_factor) { 136 gfx::Size pixel_size, float scale_factor) {
137 // Record the surface and latency info to use when acknowledging this frame. 137 // Record the surface and latency info to use when acknowledging this frame.
138 DCHECK(!accelerated_output_surface_id_); 138 DCHECK(!accelerated_output_surface_id_);
139 accelerated_output_surface_id_ = output_surface_id; 139 accelerated_output_surface_id_ = output_surface_id;
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 client and therefore no superview to draw into, early-out. 143 // If there is no view and therefore no superview to draw into, early-out.
144 if (!client_) { 144 if (!view_) {
145 IOSurfaceLayerDidDrawFrame(); 145 IOSurfaceLayerDidDrawFrame();
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: {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 BrowserCompositorCALayerTreeMac::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 || !client_) 277 if (!frame_data || !canvas || !view_)
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 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 323
324 void BrowserCompositorCALayerTreeMac::DestroySoftwareLayer() { 324 void BrowserCompositorCALayerTreeMac::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 BrowserCompositorCALayerTreeMac::IOSurfaceLayerShouldAckImmediately()
332 const { 332 const {
333 // If there is no client then the accelerated layer is not in the hierarchy 333 // If there is no view then the accelerated layer is not in the hierarchy
334 // and will never draw. 334 // and will never draw.
335 if (!client_) 335 if (!view_)
336 return true; 336 return true;
337 return client_->BrowserCompositorViewShouldAckImmediately(); 337 return view_->client()->BrowserCompositorViewShouldAckImmediately();
338 } 338 }
339 339
340 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerDidDrawFrame() { 340 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerDidDrawFrame() {
341 if (accelerated_output_surface_id_) { 341 if (accelerated_output_surface_id_) {
342 content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed( 342 content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed(
343 accelerated_output_surface_id_); 343 accelerated_output_surface_id_);
344 accelerated_output_surface_id_ = 0; 344 accelerated_output_surface_id_ = 0;
345 } 345 }
346 346
347 if (client_) 347 if (view_) {
348 client_->BrowserCompositorViewFrameSwapped(accelerated_latency_info_); 348 view_->client()->BrowserCompositorViewFrameSwapped(
349 accelerated_latency_info_);
350 }
349 351
350 accelerated_latency_info_.clear(); 352 accelerated_latency_info_.clear();
351 } 353 }
352 354
353 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerHitError() { 355 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerHitError() {
354 // Perform all acks that would have been done if the frame had succeeded, to 356 // Perform all acks that would have been done if the frame had succeeded, to
355 // un-block the compositor and renderer. 357 // un-block the compositor and renderer.
356 IOSurfaceLayerDidDrawFrame(); 358 IOSurfaceLayerDidDrawFrame();
357 359
358 // Poison the context being used and request a mulligan. 360 // Poison the context being used and request a mulligan.
359 [io_surface_layer_ poisonContextAndSharegroup]; 361 [io_surface_layer_ poisonContextAndSharegroup];
360 compositor_->ScheduleFullRedraw(); 362 compositor_->ScheduleFullRedraw();
361 } 363 }
362 364
363 // static 365 // static
364 BrowserCompositorCALayerTreeMac* BrowserCompositorCALayerTreeMac:: 366 BrowserCompositorCALayerTreeMac* BrowserCompositorCALayerTreeMac::
365 FromAcceleratedWidget(gfx::AcceleratedWidget widget) { 367 FromAcceleratedWidget(gfx::AcceleratedWidget widget) {
366 WidgetToInternalsMap::const_iterator found = 368 WidgetToInternalsMap::const_iterator found =
367 g_widget_to_internals_map.Pointer()->find(widget); 369 g_widget_to_internals_map.Pointer()->find(widget);
368 // This can end up being accessed after the underlying widget has been 370 // This can end up being accessed after the underlying widget has been
369 // destroyed, but while the ui::Compositor is still being destroyed. 371 // destroyed, but while the ui::Compositor is still being destroyed.
370 // Return NULL in these cases. 372 // Return NULL in these cases.
371 if (found == g_widget_to_internals_map.Pointer()->end()) 373 if (found == g_widget_to_internals_map.Pointer()->end())
372 return NULL; 374 return NULL;
373 return found->second; 375 return found->second;
374 } 376 }
375 377
378 void BrowserCompositorCALayerTreeMacGotAcceleratedFrame(
379 gfx::AcceleratedWidget widget,
380 uint64 surface_handle, int surface_id,
381 const std::vector<ui::LatencyInfo>& latency_info,
382 gfx::Size pixel_size, float scale_factor,
383 bool* disable_throttling, int* renderer_id) {
384 BrowserCompositorCALayerTreeMac* ca_layer_tree =
385 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget);
386 if (ca_layer_tree) {
387 ca_layer_tree->GotAcceleratedFrame(
388 surface_handle, surface_id, latency_info, pixel_size, scale_factor);
389 *disable_throttling = ca_layer_tree->IsRendererThrottlingDisabled();
390 *renderer_id = ca_layer_tree->GetRendererID();
391 } else {
392 *disable_throttling = false;
393 *renderer_id = 0;
394 }
395 }
396
397 void BrowserCompositorCALayerTreeMacGotSoftwareFrame(
398 gfx::AcceleratedWidget widget,
399 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) {
400 BrowserCompositorCALayerTreeMac* ca_layer_tree =
401 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget);
402 if (ca_layer_tree)
403 ca_layer_tree->GotSoftwareFrame(frame_data, scale_factor, canvas);
404 }
405
376 } // namespace content 406 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698