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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 745453002: Create an AcceleratedWidgetMac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/render_widget_host_view_mac.h" 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
6 6
7 #import <objc/runtime.h> 7 #import <objc/runtime.h>
8 #include <OpenGL/gl.h> 8 #include <OpenGL/gl.h>
9 #include <QuartzCore/QuartzCore.h> 9 #include <QuartzCore/QuartzCore.h>
10 10
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 } 388 }
389 389
390 } // namespace 390 } // namespace
391 391
392 namespace content { 392 namespace content {
393 393
394 //////////////////////////////////////////////////////////////////////////////// 394 ////////////////////////////////////////////////////////////////////////////////
395 // DelegatedFrameHost, public: 395 // DelegatedFrameHost, public:
396 396
397 ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const { 397 ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const {
398 // When |browser_compositor_view_| is suspended or destroyed, the connection 398 // When |browser_compositor_| is suspended or destroyed, the connection
399 // between its ui::Compositor and |delegated_frame_host_| has been severed. 399 // between its ui::Compositor and |delegated_frame_host_| has been severed.
400 if (browser_compositor_state_ == BrowserCompositorActive) 400 if (browser_compositor_state_ == BrowserCompositorActive)
401 return browser_compositor_view_->GetCompositor(); 401 return browser_compositor_->compositor();
402 return NULL; 402 return NULL;
403 } 403 }
404 404
405 ui::Layer* RenderWidgetHostViewMac::GetLayer() { 405 ui::Layer* RenderWidgetHostViewMac::GetLayer() {
406 return root_layer_.get(); 406 return root_layer_.get();
407 } 407 }
408 408
409 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { 409 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
410 return render_widget_host_; 410 return render_widget_host_;
411 } 411 }
(...skipping 21 matching lines...) Expand all
433 NOTREACHED(); 433 NOTREACHED();
434 ResizeLock* lock = NULL; 434 ResizeLock* lock = NULL;
435 return scoped_ptr<ResizeLock>(lock); 435 return scoped_ptr<ResizeLock>(lock);
436 } 436 }
437 437
438 DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const { 438 DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const {
439 return delegated_frame_host_.get(); 439 return delegated_frame_host_.get();
440 } 440 }
441 441
442 //////////////////////////////////////////////////////////////////////////////// 442 ////////////////////////////////////////////////////////////////////////////////
443 // BrowserCompositorViewMacClient, public: 443 // AcceleratedWidgetMacNSView, public:
444 444
445 bool RenderWidgetHostViewMac::BrowserCompositorViewShouldAckImmediately() 445 NSView* RenderWidgetHostViewMac::AcceleratedWidgetGetNSView() const {
446 return cocoa_view_;
447 }
448
449 bool RenderWidgetHostViewMac::AcceleratedWidgetShouldIgnoreBackpressure()
446 const { 450 const {
447 // If vsync is disabled, then always draw and ack frames immediately. 451 // If vsync is disabled, then always draw and ack frames immediately.
448 static bool is_vsync_disabled = 452 static bool is_vsync_disabled =
449 base::CommandLine::ForCurrentProcess()->HasSwitch( 453 base::CommandLine::ForCurrentProcess()->HasSwitch(
450 switches::kDisableGpuVsync); 454 switches::kDisableGpuVsync);
451 if (is_vsync_disabled) 455 if (is_vsync_disabled)
452 return true; 456 return true;
453 457
454 // If the window is occluded, then this frame's display call may be severely 458 // If the window is occluded, then this frame's display call may be severely
455 // throttled. This is a good thing, unless tab capture may be active, because 459 // throttled. This is a good thing, unless tab capture may be active, because
(...skipping 21 matching lines...) Expand all
477 // immediately. 481 // immediately.
478 return true; 482 return true;
479 } 483 }
480 } 484 }
481 485
482 // If the window occlusion API is not present then ack frames when we draw 486 // If the window occlusion API is not present then ack frames when we draw
483 // them. 487 // them.
484 return false; 488 return false;
485 } 489 }
486 490
487 void RenderWidgetHostViewMac::BrowserCompositorViewFrameSwapped( 491 void RenderWidgetHostViewMac::AcceleratedWidgetSwapCompleted(
488 const std::vector<ui::LatencyInfo>& all_latency_info) { 492 const std::vector<ui::LatencyInfo>& all_latency_info) {
489 if (!render_widget_host_) 493 if (!render_widget_host_)
490 return; 494 return;
491 for (auto latency_info : all_latency_info) { 495 for (auto latency_info : all_latency_info) {
492 latency_info.AddLatencyNumber( 496 latency_info.AddLatencyNumber(
493 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); 497 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
494 render_widget_host_->FrameSwapped(latency_info); 498 render_widget_host_->FrameSwapped(latency_info);
495 } 499 }
496 } 500 }
497 501
502 void RenderWidgetHostViewMac::AcceleratedWidgetHitError() {
503 // Request a new frame be drawn.
504 browser_compositor_->compositor()->ScheduleFullRedraw();
505 }
506
498 /////////////////////////////////////////////////////////////////////////////// 507 ///////////////////////////////////////////////////////////////////////////////
499 // RenderWidgetHostViewBase, public: 508 // RenderWidgetHostViewBase, public:
500 509
501 // static 510 // static
502 void RenderWidgetHostViewBase::GetDefaultScreenInfo( 511 void RenderWidgetHostViewBase::GetDefaultScreenInfo(
503 blink::WebScreenInfo* results) { 512 blink::WebScreenInfo* results) {
504 *results = GetWebScreenInfo(NULL); 513 *results = GetWebScreenInfo(NULL);
505 } 514 }
506 515
507 /////////////////////////////////////////////////////////////////////////////// 516 ///////////////////////////////////////////////////////////////////////////////
508 // RenderWidgetHostViewMac, public: 517 // RenderWidgetHostViewMac, public:
509 518
510 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget, 519 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget,
511 bool is_guest_view_hack) 520 bool is_guest_view_hack)
512 : render_widget_host_(RenderWidgetHostImpl::From(widget)), 521 : render_widget_host_(RenderWidgetHostImpl::From(widget)),
513 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 522 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
514 can_compose_inline_(true), 523 can_compose_inline_(true),
515 browser_compositor_state_(BrowserCompositorDestroyed), 524 browser_compositor_state_(BrowserCompositorDestroyed),
516 browser_compositor_view_placeholder_( 525 browser_compositor_placeholder_(new BrowserCompositorMacPlaceholder),
517 new BrowserCompositorViewPlaceholderMac),
518 is_loading_(false), 526 is_loading_(false),
519 allow_pause_for_resize_or_repaint_(true), 527 allow_pause_for_resize_or_repaint_(true),
520 is_guest_view_hack_(is_guest_view_hack), 528 is_guest_view_hack_(is_guest_view_hack),
521 weak_factory_(this), 529 weak_factory_(this),
522 fullscreen_parent_host_view_(NULL) { 530 fullscreen_parent_host_view_(NULL) {
523 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| 531 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_|
524 // goes away. Since we autorelease it, our caller must put 532 // goes away. Since we autorelease it, our caller must put
525 // |GetNativeView()| into the view hierarchy right after calling us. 533 // |GetNativeView()| into the view hierarchy right after calling us.
526 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] 534 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc]
527 initWithRenderWidgetHostViewMac:this] autorelease]; 535 initWithRenderWidgetHostViewMac:this] autorelease];
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 589
582 /////////////////////////////////////////////////////////////////////////////// 590 ///////////////////////////////////////////////////////////////////////////////
583 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: 591 // RenderWidgetHostViewMac, RenderWidgetHostView implementation:
584 592
585 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { 593 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() {
586 TRACE_EVENT0("browser", 594 TRACE_EVENT0("browser",
587 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); 595 "RenderWidgetHostViewMac::EnsureBrowserCompositorView");
588 596
589 // Create the view, to transition from Destroyed -> Suspended. 597 // Create the view, to transition from Destroyed -> Suspended.
590 if (browser_compositor_state_ == BrowserCompositorDestroyed) { 598 if (browser_compositor_state_ == BrowserCompositorDestroyed) {
591 browser_compositor_view_.reset( 599 browser_compositor_.reset(BrowserCompositorMac::Create());
tapted 2014/11/20 23:18:07 with the scoped_ptr arg tweaks, this would become
ccameron 2014/11/21 01:32:41 Done.
592 new BrowserCompositorViewMac(this, cocoa_view_, root_layer_.get())); 600 browser_compositor_->compositor()->SetRootLayer(
601 root_layer_.get());
602 browser_compositor_->accelerated_widget_mac()->SetNSView(this);
603 browser_compositor_->compositor()->SetVisible(true);
593 browser_compositor_state_ = BrowserCompositorSuspended; 604 browser_compositor_state_ = BrowserCompositorSuspended;
594 } 605 }
595 606
596 // Show the DelegatedFrameHost to transition from Suspended -> Active. 607 // Show the DelegatedFrameHost to transition from Suspended -> Active.
597 if (browser_compositor_state_ == BrowserCompositorSuspended) { 608 if (browser_compositor_state_ == BrowserCompositorSuspended) {
598 delegated_frame_host_->AddedToWindow(); 609 delegated_frame_host_->AddedToWindow();
599 delegated_frame_host_->WasShown(ui::LatencyInfo()); 610 delegated_frame_host_->WasShown(ui::LatencyInfo());
600 browser_compositor_state_ = BrowserCompositorActive; 611 browser_compositor_state_ = BrowserCompositorActive;
601 } 612 }
602 } 613 }
(...skipping 14 matching lines...) Expand all
617 628
618 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { 629 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
619 TRACE_EVENT0("browser", 630 TRACE_EVENT0("browser",
620 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); 631 "RenderWidgetHostViewMac::DestroyBrowserCompositorView");
621 632
622 // Transition from Active -> Suspended if need be. 633 // Transition from Active -> Suspended if need be.
623 SuspendBrowserCompositorView(); 634 SuspendBrowserCompositorView();
624 635
625 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. 636 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed.
626 if (browser_compositor_state_ == BrowserCompositorSuspended) { 637 if (browser_compositor_state_ == BrowserCompositorSuspended) {
627 browser_compositor_view_.reset(); 638 browser_compositor_->accelerated_widget_mac()->ResetNSView();
639 browser_compositor_->compositor()->SetVisible(false);
640 browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0));
641 browser_compositor_->compositor()->SetRootLayer(NULL);
642 BrowserCompositorMac::Recycle(browser_compositor_.release());
tapted 2014/11/20 23:18:07 and .release() -> .Pass()
ccameron 2014/11/21 01:32:41 Done.
628 browser_compositor_state_ = BrowserCompositorDestroyed; 643 browser_compositor_state_ = BrowserCompositorDestroyed;
629 } 644 }
630 } 645 }
631 646
632 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { 647 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() {
633 if (browser_compositor_state_ != BrowserCompositorSuspended) 648 if (browser_compositor_state_ != BrowserCompositorSuspended)
634 return; 649 return;
635 650
636 // If this view is in a window that is visible, keep around the suspended 651 // If this view is in a window that is visible, keep around the suspended
637 // BrowserCompositorView in case |cocoa_view_| is suddenly revealed (so that 652 // BrowserCompositorView in case |cocoa_view_| is suddenly revealed (so that
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 if (actual_range) { 1408 if (actual_range) {
1394 *actual_range = gfx::Range( 1409 *actual_range = gfx::Range(
1395 composition_range_.start() + ui_actual_range.start(), 1410 composition_range_.start() + ui_actual_range.start(),
1396 composition_range_.start() + ui_actual_range.end()).ToNSRange(); 1411 composition_range_.start() + ui_actual_range.end()).ToNSRange();
1397 } 1412 }
1398 return true; 1413 return true;
1399 } 1414 }
1400 1415
1401 bool RenderWidgetHostViewMac::HasAcceleratedSurface( 1416 bool RenderWidgetHostViewMac::HasAcceleratedSurface(
1402 const gfx::Size& desired_size) { 1417 const gfx::Size& desired_size) {
1403 if (browser_compositor_view_) 1418 if (browser_compositor_) {
1404 return browser_compositor_view_->HasFrameOfSize(desired_size); 1419 return browser_compositor_->accelerated_widget_mac()->HasFrameOfSize(
1420 desired_size);
1421 }
1405 return false; 1422 return false;
1406 } 1423 }
1407 1424
1408 void RenderWidgetHostViewMac::OnSwapCompositorFrame( 1425 void RenderWidgetHostViewMac::OnSwapCompositorFrame(
1409 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { 1426 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) {
1410 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); 1427 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame");
1411 1428
1412 last_scroll_offset_ = frame->metadata.root_scroll_offset; 1429 last_scroll_offset_ = frame->metadata.root_scroll_offset;
1413 if (frame->delegated_frame_data) { 1430 if (frame->delegated_frame_data) {
1414 float scale_factor = frame->metadata.device_scale_factor; 1431 float scale_factor = frame->metadata.device_scale_factor;
1415 1432
1416 // Compute the frame size based on the root render pass rect size. 1433 // Compute the frame size based on the root render pass rect size.
1417 cc::RenderPass* root_pass = 1434 cc::RenderPass* root_pass =
1418 frame->delegated_frame_data->render_pass_list.back(); 1435 frame->delegated_frame_data->render_pass_list.back();
1419 gfx::Size pixel_size = root_pass->output_rect.size(); 1436 gfx::Size pixel_size = root_pass->output_rect.size();
1420 gfx::Size dip_size = 1437 gfx::Size dip_size =
1421 ConvertSizeToDIP(scale_factor, pixel_size); 1438 ConvertSizeToDIP(scale_factor, pixel_size);
1422 1439
1423 root_layer_->SetBounds(gfx::Rect(dip_size)); 1440 root_layer_->SetBounds(gfx::Rect(dip_size));
1424 if (!render_widget_host_->is_hidden()) { 1441 if (!render_widget_host_->is_hidden()) {
1425 EnsureBrowserCompositorView(); 1442 EnsureBrowserCompositorView();
1426 browser_compositor_view_->GetCompositor()->SetScaleAndSize( 1443 browser_compositor_->compositor()->SetScaleAndSize(
1427 scale_factor, pixel_size); 1444 scale_factor, pixel_size);
1428 } 1445 }
1429 1446
1430 SendVSyncParametersToRenderer(); 1447 SendVSyncParametersToRenderer();
1431 1448
1432 delegated_frame_host_->SwapDelegatedFrame( 1449 delegated_frame_host_->SwapDelegatedFrame(
1433 output_surface_id, 1450 output_surface_id,
1434 frame->delegated_frame_data.Pass(), 1451 frame->delegated_frame_data.Pass(),
1435 frame->metadata.device_scale_factor, 1452 frame->metadata.device_scale_factor,
1436 frame->metadata.latency_info); 1453 frame->metadata.latency_info);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 void RenderWidgetHostViewMac::ShutdownHost() { 1530 void RenderWidgetHostViewMac::ShutdownHost() {
1514 weak_factory_.InvalidateWeakPtrs(); 1531 weak_factory_.InvalidateWeakPtrs();
1515 render_widget_host_->Shutdown(); 1532 render_widget_host_->Shutdown();
1516 // Do not touch any members at this point, |this| has been deleted. 1533 // Do not touch any members at this point, |this| has been deleted.
1517 } 1534 }
1518 1535
1519 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() { 1536 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() {
1520 DestroyBrowserCompositorView(); 1537 DestroyBrowserCompositorView();
1521 delegated_frame_host_.reset(); 1538 delegated_frame_host_.reset();
1522 root_layer_.reset(); 1539 root_layer_.reset();
1523 browser_compositor_view_placeholder_.reset(); 1540 browser_compositor_placeholder_.reset();
1524 } 1541 }
1525 1542
1526 void RenderWidgetHostViewMac::SetActive(bool active) { 1543 void RenderWidgetHostViewMac::SetActive(bool active) {
1527 if (render_widget_host_) { 1544 if (render_widget_host_) {
1528 render_widget_host_->SetActive(active); 1545 render_widget_host_->SetActive(active);
1529 if (active) { 1546 if (active) {
1530 if (HasFocus()) 1547 if (HasFocus())
1531 render_widget_host_->Focus(); 1548 render_widget_host_->Focus();
1532 } else { 1549 } else {
1533 render_widget_host_->Blur(); 1550 render_widget_host_->Blur();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { 1656 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
1640 if (!render_widget_host_ || render_widget_host_->is_hidden()) 1657 if (!render_widget_host_ || render_widget_host_->is_hidden())
1641 return; 1658 return;
1642 1659
1643 // Pausing for one view prevents others from receiving frames. 1660 // Pausing for one view prevents others from receiving frames.
1644 // This may lead to large delays, causing overlaps. See crbug.com/352020. 1661 // This may lead to large delays, causing overlaps. See crbug.com/352020.
1645 if (!allow_pause_for_resize_or_repaint_) 1662 if (!allow_pause_for_resize_or_repaint_)
1646 return; 1663 return;
1647 1664
1648 // Wait for a frame of the right size to come in. 1665 // Wait for a frame of the right size to come in.
1649 if (browser_compositor_view_) 1666 if (browser_compositor_)
1650 browser_compositor_view_->BeginPumpingFrames(); 1667 browser_compositor_->accelerated_widget_mac()->BeginPumpingFrames();
1651 render_widget_host_->PauseForPendingResizeOrRepaints(); 1668 render_widget_host_->PauseForPendingResizeOrRepaints();
1652 if (browser_compositor_view_) 1669 if (browser_compositor_)
1653 browser_compositor_view_->EndPumpingFrames(); 1670 browser_compositor_->accelerated_widget_mac()->EndPumpingFrames();
1654 } 1671 }
1655 1672
1656 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() { 1673 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() {
1657 return kN32_SkColorType; 1674 return kN32_SkColorType;
1658 } 1675 }
1659 1676
1660 //////////////////////////////////////////////////////////////////////////////// 1677 ////////////////////////////////////////////////////////////////////////////////
1661 // gfx::DisplayObserver, public: 1678 // gfx::DisplayObserver, public:
1662 1679
1663 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) { 1680 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) {
(...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after
3354 3371
3355 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding 3372 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding
3356 // regions that are not draggable. (See ControlRegionView in 3373 // regions that are not draggable. (See ControlRegionView in
3357 // native_app_window_cocoa.mm). This requires the render host view to be 3374 // native_app_window_cocoa.mm). This requires the render host view to be
3358 // draggable by default. 3375 // draggable by default.
3359 - (BOOL)mouseDownCanMoveWindow { 3376 - (BOOL)mouseDownCanMoveWindow {
3360 return YES; 3377 return YES;
3361 } 3378 }
3362 3379
3363 @end 3380 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698