OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/browser_compositor_view_mac.h" | 5 #include "content/browser/renderer_host/browser_compositor_view_mac.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
13 #include "content/browser/compositor/image_transport_factory.h" | 13 #include "content/browser/compositor/image_transport_factory.h" |
| 14 #include "content/browser/renderer_host/resize_lock.h" |
14 #include "content/public/browser/context_factory.h" | 15 #include "content/public/browser/context_factory.h" |
15 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" | 16 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" |
16 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" | 17 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" |
17 #include "ui/base/layout.h" | 18 #include "ui/base/layout.h" |
18 #include "ui/gfx/geometry/dip_util.h" | 19 #include "ui/gfx/geometry/dip_util.h" |
19 | 20 |
20 namespace content { | 21 namespace content { |
21 | 22 |
22 namespace { | 23 namespace { |
23 | 24 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 // RecyclableCompositorMac that we just populated. | 143 // RecyclableCompositorMac that we just populated. |
143 if (!g_browser_compositor_count) | 144 if (!g_browser_compositor_count) |
144 g_spare_recyclable_compositor.Get().reset(); | 145 g_spare_recyclable_compositor.Get().reset(); |
145 } | 146 } |
146 | 147 |
147 //////////////////////////////////////////////////////////////////////////////// | 148 //////////////////////////////////////////////////////////////////////////////// |
148 // BrowserCompositorMac | 149 // BrowserCompositorMac |
149 | 150 |
150 BrowserCompositorMac::BrowserCompositorMac( | 151 BrowserCompositorMac::BrowserCompositorMac( |
151 ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view, | 152 ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view, |
152 DelegatedFrameHostClient* delegated_frame_host_client, | 153 BrowserCompositorMacClient* client, |
153 bool render_widget_host_is_hidden, | 154 bool render_widget_host_is_hidden, |
154 bool ns_view_attached_to_window) | 155 bool ns_view_attached_to_window) |
155 : accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view), | 156 : client_(client), |
| 157 accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view), |
156 weak_factory_(this) { | 158 weak_factory_(this) { |
157 g_browser_compositor_count += 1; | 159 g_browser_compositor_count += 1; |
158 | 160 |
159 root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); | 161 root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); |
160 delegated_frame_host_.reset( | 162 delegated_frame_host_.reset(new DelegatedFrameHost(this)); |
161 new DelegatedFrameHost(delegated_frame_host_client)); | |
162 | 163 |
163 SetRenderWidgetHostIsHidden(render_widget_host_is_hidden); | 164 SetRenderWidgetHostIsHidden(render_widget_host_is_hidden); |
164 SetNSViewAttachedToWindow(ns_view_attached_to_window); | 165 SetNSViewAttachedToWindow(ns_view_attached_to_window); |
165 } | 166 } |
166 | 167 |
167 BrowserCompositorMac::~BrowserCompositorMac() { | 168 BrowserCompositorMac::~BrowserCompositorMac() { |
168 DCHECK(has_been_destroyed_); | 169 // Ensure that copy callbacks completed or cancelled during further tear-down |
169 } | 170 // do not call back into this. |
170 | 171 weak_factory_.InvalidateWeakPtrs(); |
171 void BrowserCompositorMac::Destroy() { | |
172 if (has_been_destroyed_) | |
173 return; | |
174 | 172 |
175 TransitionToState(HasNoCompositor); | 173 TransitionToState(HasNoCompositor); |
176 delegated_frame_host_.reset(); | 174 delegated_frame_host_.reset(); |
177 root_layer_.reset(); | 175 root_layer_.reset(); |
178 has_been_destroyed_ = true; | |
179 | 176 |
180 DCHECK_GT(g_browser_compositor_count, 0u); | 177 DCHECK_GT(g_browser_compositor_count, 0u); |
181 g_browser_compositor_count -= 1; | 178 g_browser_compositor_count -= 1; |
182 | 179 |
183 // If there are no compositors allocated, destroy the recyclable | 180 // If there are no compositors allocated, destroy the recyclable |
184 // RecyclableCompositorMac. | 181 // RecyclableCompositorMac. |
185 if (!g_browser_compositor_count) | 182 if (!g_browser_compositor_count) |
186 g_spare_recyclable_compositor.Get().reset(); | 183 g_spare_recyclable_compositor.Get().reset(); |
187 } | 184 } |
188 | 185 |
189 ui::AcceleratedWidgetMac* BrowserCompositorMac::GetAcceleratedWidgetMac() { | 186 ui::AcceleratedWidgetMac* BrowserCompositorMac::GetAcceleratedWidgetMac() { |
190 if (recyclable_compositor_) | 187 if (recyclable_compositor_) |
191 return recyclable_compositor_->accelerated_widget_mac(); | 188 return recyclable_compositor_->accelerated_widget_mac(); |
192 return nullptr; | 189 return nullptr; |
193 } | 190 } |
194 | 191 |
195 ui::Layer* BrowserCompositorMac::GetRootLayer() { | |
196 return root_layer_.get(); | |
197 } | |
198 | |
199 DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() { | 192 DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() { |
200 DCHECK(delegated_frame_host_); | 193 DCHECK(delegated_frame_host_); |
201 return delegated_frame_host_.get(); | 194 return delegated_frame_host_.get(); |
202 } | 195 } |
203 | 196 |
204 void BrowserCompositorMac::CopyCompleted( | 197 void BrowserCompositorMac::CopyCompleted( |
205 base::WeakPtr<BrowserCompositorMac> browser_compositor, | 198 base::WeakPtr<BrowserCompositorMac> browser_compositor, |
206 const ReadbackRequestCallback& callback, | 199 const ReadbackRequestCallback& callback, |
207 const SkBitmap& bitmap, | 200 const SkBitmap& bitmap, |
208 ReadbackResponse response) { | 201 ReadbackResponse response) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 auto callback_with_decrement = | 245 auto callback_with_decrement = |
253 base::Bind(&BrowserCompositorMac::CopyToVideoFrameCompleted, | 246 base::Bind(&BrowserCompositorMac::CopyToVideoFrameCompleted, |
254 weak_factory_.GetWeakPtr(), callback); | 247 weak_factory_.GetWeakPtr(), callback); |
255 | 248 |
256 delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame( | 249 delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame( |
257 src_subrect, target, callback_with_decrement); | 250 src_subrect, target, callback_with_decrement); |
258 } | 251 } |
259 | 252 |
260 void BrowserCompositorMac::SwapCompositorFrame(uint32_t output_surface_id, | 253 void BrowserCompositorMac::SwapCompositorFrame(uint32_t output_surface_id, |
261 cc::CompositorFrame frame) { | 254 cc::CompositorFrame frame) { |
262 DCHECK(!has_been_destroyed_); | |
263 | |
264 // Compute the frame size based on the root render pass rect size. | 255 // Compute the frame size based on the root render pass rect size. |
265 cc::RenderPass* root_pass = | 256 cc::RenderPass* root_pass = |
266 frame.delegated_frame_data->render_pass_list.back().get(); | 257 frame.delegated_frame_data->render_pass_list.back().get(); |
267 float scale_factor = frame.metadata.device_scale_factor; | 258 float scale_factor = frame.metadata.device_scale_factor; |
268 gfx::Size pixel_size = root_pass->output_rect.size(); | 259 gfx::Size pixel_size = root_pass->output_rect.size(); |
269 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size); | 260 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size); |
270 root_layer_->SetBounds(gfx::Rect(dip_size)); | 261 root_layer_->SetBounds(gfx::Rect(dip_size)); |
271 if (recyclable_compositor_) { | 262 if (recyclable_compositor_) { |
272 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, | 263 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, |
273 pixel_size); | 264 pixel_size); |
274 } | 265 } |
275 delegated_frame_host_->SwapDelegatedFrame(output_surface_id, | 266 delegated_frame_host_->SwapDelegatedFrame(output_surface_id, |
276 std::move(frame)); | 267 std::move(frame)); |
277 } | 268 } |
278 | 269 |
279 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { | 270 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { |
280 DCHECK(!has_been_destroyed_); | |
281 has_transparent_background_ = transparent; | 271 has_transparent_background_ = transparent; |
282 if (recyclable_compositor_) { | 272 if (recyclable_compositor_) { |
283 recyclable_compositor_->compositor()->SetHostHasTransparentBackground( | 273 recyclable_compositor_->compositor()->SetHostHasTransparentBackground( |
284 has_transparent_background_); | 274 has_transparent_background_); |
285 } | 275 } |
286 } | 276 } |
287 | 277 |
288 void BrowserCompositorMac::SetDisplayColorSpace( | 278 void BrowserCompositorMac::SetDisplayColorSpace( |
289 const gfx::ColorSpace& color_space) { | 279 const gfx::ColorSpace& color_space) { |
290 if (recyclable_compositor_) | 280 if (recyclable_compositor_) |
291 recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space); | 281 recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space); |
292 } | 282 } |
293 | 283 |
294 void BrowserCompositorMac::UpdateVSyncParameters( | 284 void BrowserCompositorMac::UpdateVSyncParameters( |
295 const base::TimeTicks& timebase, | 285 const base::TimeTicks& timebase, |
296 const base::TimeDelta& interval) { | 286 const base::TimeDelta& interval) { |
297 DCHECK(!has_been_destroyed_); | |
298 if (recyclable_compositor_) { | 287 if (recyclable_compositor_) { |
299 recyclable_compositor_->compositor() | 288 recyclable_compositor_->compositor() |
300 ->vsync_manager() | 289 ->vsync_manager() |
301 ->UpdateVSyncParameters(timebase, interval); | 290 ->UpdateVSyncParameters(timebase, interval); |
302 } | 291 } |
303 } | 292 } |
304 | 293 |
305 void BrowserCompositorMac::SetRenderWidgetHostIsHidden(bool hidden) { | 294 void BrowserCompositorMac::SetRenderWidgetHostIsHidden(bool hidden) { |
306 render_widget_host_is_hidden_ = hidden; | 295 render_widget_host_is_hidden_ = hidden; |
307 UpdateState(); | 296 UpdateState(); |
308 } | 297 } |
309 | 298 |
310 void BrowserCompositorMac::SetNSViewAttachedToWindow(bool attached) { | 299 void BrowserCompositorMac::SetNSViewAttachedToWindow(bool attached) { |
311 ns_view_attached_to_window_ = attached; | 300 ns_view_attached_to_window_ = attached; |
312 UpdateState(); | 301 UpdateState(); |
313 } | 302 } |
314 | 303 |
315 void BrowserCompositorMac::UpdateState() { | 304 void BrowserCompositorMac::UpdateState() { |
316 if (has_been_destroyed_) { | |
317 DCHECK(state_ == HasNoCompositor); | |
318 return; | |
319 } | |
320 | |
321 if (!render_widget_host_is_hidden_ || outstanding_copy_count_ > 0) | 305 if (!render_widget_host_is_hidden_ || outstanding_copy_count_ > 0) |
322 TransitionToState(HasAttachedCompositor); | 306 TransitionToState(HasAttachedCompositor); |
323 else if (ns_view_attached_to_window_) | 307 else if (ns_view_attached_to_window_) |
324 TransitionToState(HasDetachedCompositor); | 308 TransitionToState(HasDetachedCompositor); |
325 else | 309 else |
326 TransitionToState(HasNoCompositor); | 310 TransitionToState(HasNoCompositor); |
327 } | 311 } |
328 | 312 |
329 void BrowserCompositorMac::TransitionToState(State new_state) { | 313 void BrowserCompositorMac::TransitionToState(State new_state) { |
330 // Transition HasNoCompositor -> HasDetachedCompositor. | 314 // Transition HasNoCompositor -> HasDetachedCompositor. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 state_ = HasNoCompositor; | 363 state_ = HasNoCompositor; |
380 } | 364 } |
381 } | 365 } |
382 | 366 |
383 // static | 367 // static |
384 void BrowserCompositorMac::DisableRecyclingForShutdown() { | 368 void BrowserCompositorMac::DisableRecyclingForShutdown() { |
385 g_has_shut_down = true; | 369 g_has_shut_down = true; |
386 g_spare_recyclable_compositor.Get().reset(); | 370 g_spare_recyclable_compositor.Get().reset(); |
387 } | 371 } |
388 | 372 |
| 373 void BrowserCompositorMac::SetNeedsBeginFrames(bool needs_begin_frames) { |
| 374 if (needs_begin_frames_ == needs_begin_frames) |
| 375 return; |
| 376 |
| 377 needs_begin_frames_ = needs_begin_frames; |
| 378 if (begin_frame_source_) { |
| 379 if (needs_begin_frames_) |
| 380 begin_frame_source_->AddObserver(this); |
| 381 else |
| 382 begin_frame_source_->RemoveObserver(this); |
| 383 } |
| 384 } |
| 385 |
| 386 //////////////////////////////////////////////////////////////////////////////// |
| 387 // DelegatedFrameHost, public: |
| 388 |
| 389 ui::Layer* BrowserCompositorMac::DelegatedFrameHostGetLayer() const { |
| 390 return root_layer_.get(); |
| 391 } |
| 392 |
| 393 bool BrowserCompositorMac::DelegatedFrameHostIsVisible() const { |
| 394 // TODO(ccameron): This should return the same value as |
| 395 // |render_widget_host_is_hidden_|, rather than going back to the |
| 396 // RenderWidgetHostImpl. |
| 397 return client_->BrowserCompositorMacIsVisible(); |
| 398 } |
| 399 |
| 400 SkColor BrowserCompositorMac::DelegatedFrameHostGetGutterColor( |
| 401 SkColor color) const { |
| 402 return client_->BrowserCompositorMacGetGutterColor(color); |
| 403 } |
| 404 |
| 405 gfx::Size BrowserCompositorMac::DelegatedFrameHostDesiredSizeInDIP() const { |
| 406 NSRect bounds = [client_->BrowserCompositorMacGetNSView() bounds]; |
| 407 return gfx::Size(bounds.size.width, bounds.size.height); |
| 408 } |
| 409 |
| 410 bool BrowserCompositorMac::DelegatedFrameCanCreateResizeLock() const { |
| 411 // Mac uses the RenderWidgetResizeHelper instead of a resize lock. |
| 412 return false; |
| 413 } |
| 414 |
| 415 std::unique_ptr<ResizeLock> |
| 416 BrowserCompositorMac::DelegatedFrameHostCreateResizeLock( |
| 417 bool defer_compositor_lock) { |
| 418 NOTREACHED(); |
| 419 return std::unique_ptr<ResizeLock>(); |
| 420 } |
| 421 |
| 422 void BrowserCompositorMac::DelegatedFrameHostResizeLockWasReleased() { |
| 423 NOTREACHED(); |
| 424 } |
| 425 |
| 426 void BrowserCompositorMac::DelegatedFrameHostSendCompositorSwapAck( |
| 427 int output_surface_id, |
| 428 const cc::CompositorFrameAck& ack) { |
| 429 client_->BrowserCompositorMacSendCompositorSwapAck(output_surface_id, ack); |
| 430 } |
| 431 |
| 432 void BrowserCompositorMac::DelegatedFrameHostSendReclaimCompositorResources( |
| 433 int output_surface_id, |
| 434 const cc::CompositorFrameAck& ack) { |
| 435 client_->BrowserCompositorMacSendReclaimCompositorResources(output_surface_id, |
| 436 ack); |
| 437 } |
| 438 |
| 439 void BrowserCompositorMac::DelegatedFrameHostOnLostCompositorResources() { |
| 440 client_->BrowserCompositorMacOnLostCompositorResources(); |
| 441 } |
| 442 |
| 443 void BrowserCompositorMac::DelegatedFrameHostUpdateVSyncParameters( |
| 444 const base::TimeTicks& timebase, |
| 445 const base::TimeDelta& interval) { |
| 446 client_->BrowserCompositorMacUpdateVSyncParameters(timebase, interval); |
| 447 } |
| 448 |
| 449 void BrowserCompositorMac::SetBeginFrameSource(cc::BeginFrameSource* source) { |
| 450 if (begin_frame_source_ && needs_begin_frames_) |
| 451 begin_frame_source_->RemoveObserver(this); |
| 452 begin_frame_source_ = source; |
| 453 if (begin_frame_source_ && needs_begin_frames_) |
| 454 begin_frame_source_->AddObserver(this); |
| 455 } |
| 456 |
| 457 //////////////////////////////////////////////////////////////////////////////// |
| 458 // cc::BeginFrameSourceBase, public: |
| 459 |
| 460 void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| 461 delegated_frame_host_->SetVSyncParameters(args.frame_time, args.interval); |
| 462 client_->BrowserCompositorMacSendBeginFrame(args); |
| 463 last_begin_frame_args_ = args; |
| 464 } |
| 465 |
| 466 const cc::BeginFrameArgs& BrowserCompositorMac::LastUsedBeginFrameArgs() const { |
| 467 return last_begin_frame_args_; |
| 468 } |
| 469 |
| 470 void BrowserCompositorMac::OnBeginFrameSourcePausedChanged(bool paused) { |
| 471 // Only used on Android WebView. |
| 472 } |
| 473 |
389 } // namespace content | 474 } // namespace content |
OLD | NEW |