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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 25942002: Make software compositing work on Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix windows resolve Created 7 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 | Annotate | Revision Log
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_aura.h" 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 #endif 86 #endif
87 87
88 using gfx::RectToSkIRect; 88 using gfx::RectToSkIRect;
89 using gfx::SkIRectToRect; 89 using gfx::SkIRectToRect;
90 90
91 using WebKit::WebScreenInfo; 91 using WebKit::WebScreenInfo;
92 using WebKit::WebTouchEvent; 92 using WebKit::WebTouchEvent;
93 93
94 namespace content { 94 namespace content {
95 95
96 void ReleaseMailbox(scoped_refptr<MemoryHolder> holder,
97 unsigned sync_point,
98 bool lost_resource) {}
99
100 class MemoryHolder : public base::RefCounted<MemoryHolder> {
101 public:
102 MemoryHolder(scoped_ptr<base::SharedMemory> shared_memory,
103 gfx::Size frame_size,
104 base::Callback<void()> callback)
105 : shared_memory_(shared_memory.Pass()),
106 frame_size_(frame_size),
107 callback_(callback) {}
108
109 void GetMailbox(cc::TextureMailbox* mailbox,
110 scoped_ptr<cc::SingleReleaseCallback>* release_callback) {
111 *mailbox = cc::TextureMailbox(shared_memory_.get(), frame_size_);
112 *release_callback = cc::SingleReleaseCallback::Create(
113 base::Bind(ReleaseMailbox, make_scoped_refptr(this)));
114 }
115
116 private:
117 friend class base::RefCounted<MemoryHolder>;
118 ~MemoryHolder() { callback_.Run(); }
119
120 scoped_ptr<base::SharedMemory> shared_memory_;
121 gfx::Size frame_size_;
122 base::Callback<void()> callback_;
123 };
124
125 namespace { 96 namespace {
126 97
127 void MailboxReleaseCallback(scoped_ptr<base::SharedMemory> shared_memory, 98 void MailboxReleaseCallback(scoped_ptr<base::SharedMemory> shared_memory,
128 unsigned sync_point, bool lost_resource) { 99 unsigned sync_point, bool lost_resource) {
129 // NOTE: shared_memory will get released when we go out of scope. 100 // NOTE: shared_memory will get released when we go out of scope.
130 } 101 }
131 102
132 // In mouse lock mode, we need to prevent the (invisible) cursor from hitting 103 // In mouse lock mode, we need to prevent the (invisible) cursor from hitting
133 // the border of the view, in order to get valid movement information. However, 104 // the border of the view, in order to get valid movement information. However,
134 // forcing the cursor back to the center of the view after each mouse move 105 // forcing the cursor back to the center of the view after each mouse move
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 last_output_surface_id_(0), 567 last_output_surface_id_(0),
597 pending_delegated_ack_count_(0), 568 pending_delegated_ack_count_(0),
598 skipped_frames_(false), 569 skipped_frames_(false),
599 last_swapped_surface_scale_factor_(1.f), 570 last_swapped_surface_scale_factor_(1.f),
600 paint_canvas_(NULL), 571 paint_canvas_(NULL),
601 synthetic_move_sent_(false), 572 synthetic_move_sent_(false),
602 accelerated_compositing_state_changed_(false), 573 accelerated_compositing_state_changed_(false),
603 can_lock_compositor_(YES), 574 can_lock_compositor_(YES),
604 cursor_visibility_state_in_renderer_(UNKNOWN), 575 cursor_visibility_state_in_renderer_(UNKNOWN),
605 paint_observer_(NULL), 576 paint_observer_(NULL),
606 touch_editing_client_(NULL) { 577 touch_editing_client_(NULL),
578 weak_ptr_factory_(this) {
607 host_->SetView(this); 579 host_->SetView(this);
608 window_observer_.reset(new WindowObserver(this)); 580 window_observer_.reset(new WindowObserver(this));
609 aura::client::SetTooltipText(window_, &tooltip_); 581 aura::client::SetTooltipText(window_, &tooltip_);
610 aura::client::SetActivationDelegate(window_, this); 582 aura::client::SetActivationDelegate(window_, this);
611 aura::client::SetActivationChangeObserver(window_, this); 583 aura::client::SetActivationChangeObserver(window_, this);
612 aura::client::SetFocusChangeObserver(window_, this); 584 aura::client::SetFocusChangeObserver(window_, this);
613 gfx::Screen::GetScreenFor(window_)->AddObserver(this); 585 gfx::Screen::GetScreenFor(window_)->AddObserver(this);
614 #if defined(OS_WIN) 586 #if defined(OS_WIN)
615 transient_observer_.reset(new TransientWindowObserver(this)); 587 transient_observer_.reset(new TransientWindowObserver(this));
616 #endif 588 #endif
589 software_frame_manager_.reset(new SoftwareFrameManager(
590 weak_ptr_factory_.GetWeakPtr()));
617 } 591 }
618 592
619 //////////////////////////////////////////////////////////////////////////////// 593 ////////////////////////////////////////////////////////////////////////////////
620 // RenderWidgetHostViewAura, RenderWidgetHostView implementation: 594 // RenderWidgetHostViewAura, RenderWidgetHostView implementation:
621 595
622 void RenderWidgetHostViewAura::InitAsChild( 596 void RenderWidgetHostViewAura::InitAsChild(
623 gfx::NativeView parent_view) { 597 gfx::NativeView parent_view) {
624 window_->Init(ui::LAYER_TEXTURED); 598 window_->Init(ui::LAYER_TEXTURED);
625 window_->SetName("RenderWidgetHostViewAura"); 599 window_->SetName("RenderWidgetHostViewAura");
626 } 600 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 665
692 RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const { 666 RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const {
693 return host_; 667 return host_;
694 } 668 }
695 669
696 void RenderWidgetHostViewAura::WasShown() { 670 void RenderWidgetHostViewAura::WasShown() {
697 DCHECK(host_); 671 DCHECK(host_);
698 if (!host_->is_hidden()) 672 if (!host_->is_hidden())
699 return; 673 return;
700 host_->WasShown(); 674 host_->WasShown();
701 if (framebuffer_holder_) 675 software_frame_manager_->SetVisibility(true);
702 FrameMemoryManager::GetInstance()->SetFrameVisibility(this, true);
703 676
704 aura::RootWindow* root = window_->GetRootWindow(); 677 aura::RootWindow* root = window_->GetRootWindow();
705 if (root) { 678 if (root) {
706 aura::client::CursorClient* cursor_client = 679 aura::client::CursorClient* cursor_client =
707 aura::client::GetCursorClient(root); 680 aura::client::GetCursorClient(root);
708 if (cursor_client) 681 if (cursor_client)
709 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); 682 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
710 } 683 }
711 684
712 if (!current_surface_.get() && host_->is_accelerated_compositing_active() && 685 if (!current_surface_.get() && host_->is_accelerated_compositing_active() &&
713 !released_front_lock_.get()) { 686 !released_front_lock_.get()) {
714 ui::Compositor* compositor = GetCompositor(); 687 ui::Compositor* compositor = GetCompositor();
715 if (compositor) 688 if (compositor)
716 released_front_lock_ = compositor->GetCompositorLock(); 689 released_front_lock_ = compositor->GetCompositorLock();
717 } 690 }
718 691
719 #if defined(OS_WIN) 692 #if defined(OS_WIN)
720 LPARAM lparam = reinterpret_cast<LPARAM>(this); 693 LPARAM lparam = reinterpret_cast<LPARAM>(this);
721 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); 694 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
722 transient_observer_->SendPluginCutoutRects(); 695 transient_observer_->SendPluginCutoutRects();
723 #endif 696 #endif
724 } 697 }
725 698
726 void RenderWidgetHostViewAura::WasHidden() { 699 void RenderWidgetHostViewAura::WasHidden() {
727 if (!host_ || host_->is_hidden()) 700 if (!host_ || host_->is_hidden())
728 return; 701 return;
729 host_->WasHidden(); 702 host_->WasHidden();
730 if (framebuffer_holder_) 703 software_frame_manager_->SetVisibility(false);
731 FrameMemoryManager::GetInstance()->SetFrameVisibility(this, false);
732
733 released_front_lock_ = NULL; 704 released_front_lock_ = NULL;
734 705
735 #if defined(OS_WIN) 706 #if defined(OS_WIN)
736 aura::RootWindow* root_window = window_->GetRootWindow(); 707 aura::RootWindow* root_window = window_->GetRootWindow();
737 if (root_window) { 708 if (root_window) {
738 HWND parent = root_window->GetAcceleratedWidget(); 709 HWND parent = root_window->GetAcceleratedWidget();
739 LPARAM lparam = reinterpret_cast<LPARAM>(this); 710 LPARAM lparam = reinterpret_cast<LPARAM>(this);
740 711
741 EnumChildWindows(parent, HideWindowsCallback, lparam); 712 EnumChildWindows(parent, HideWindowsCallback, lparam);
742 } 713 }
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1281 // software mode or set the external texture if going to accelerated mode). 1252 // software mode or set the external texture if going to accelerated mode).
1282 if (accelerated_compositing_state_changed_) 1253 if (accelerated_compositing_state_changed_)
1283 accelerated_compositing_state_changed_ = false; 1254 accelerated_compositing_state_changed_ = false;
1284 1255
1285 bool is_compositing_active = host_->is_accelerated_compositing_active(); 1256 bool is_compositing_active = host_->is_accelerated_compositing_active();
1286 if (is_compositing_active && current_surface_.get()) { 1257 if (is_compositing_active && current_surface_.get()) {
1287 window_->layer()->SetExternalTexture(current_surface_.get()); 1258 window_->layer()->SetExternalTexture(current_surface_.get());
1288 current_frame_size_ = ConvertSizeToDIP( 1259 current_frame_size_ = ConvertSizeToDIP(
1289 current_surface_->device_scale_factor(), current_surface_->size()); 1260 current_surface_->device_scale_factor(), current_surface_->size());
1290 CheckResizeLock(); 1261 CheckResizeLock();
1291 framebuffer_holder_ = NULL; 1262 software_frame_manager_->DiscardCurrentFrame();
1292 FrameMemoryManager::GetInstance()->RemoveFrame(this); 1263 } else if (is_compositing_active &&
1293 } else if (is_compositing_active && framebuffer_holder_) { 1264 software_frame_manager_->HasCurrentFrame()) {
1294 cc::TextureMailbox mailbox; 1265 cc::TextureMailbox mailbox;
1295 scoped_ptr<cc::SingleReleaseCallback> callback; 1266 scoped_ptr<cc::SingleReleaseCallback> callback;
1296 framebuffer_holder_->GetMailbox(&mailbox, &callback); 1267 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback);
1297 window_->layer()->SetTextureMailbox(mailbox, 1268 window_->layer()->SetTextureMailbox(mailbox,
1298 callback.Pass(), 1269 callback.Pass(),
1299 last_swapped_surface_scale_factor_); 1270 last_swapped_surface_scale_factor_);
1300 current_frame_size_ = ConvertSizeToDIP(last_swapped_surface_scale_factor_, 1271 current_frame_size_ = ConvertSizeToDIP(last_swapped_surface_scale_factor_,
1301 mailbox.shared_memory_size()); 1272 mailbox.shared_memory_size());
1302 CheckResizeLock(); 1273 CheckResizeLock();
1303 } else { 1274 } else {
1304 window_->layer()->SetShowPaintedContent(); 1275 window_->layer()->SetShowPaintedContent();
1305 resize_lock_.reset(); 1276 resize_lock_.reset();
1306 host_->WasResized(); 1277 host_->WasResized();
1307 framebuffer_holder_ = NULL; 1278 software_frame_manager_->DiscardCurrentFrame();
1308 FrameMemoryManager::GetInstance()->RemoveFrame(this);
1309 } 1279 }
1310 } 1280 }
1311 1281
1312 bool RenderWidgetHostViewAura::SwapBuffersPrepare( 1282 bool RenderWidgetHostViewAura::SwapBuffersPrepare(
1313 const gfx::Rect& surface_rect, 1283 const gfx::Rect& surface_rect,
1314 float surface_scale_factor, 1284 float surface_scale_factor,
1315 const gfx::Rect& damage_rect, 1285 const gfx::Rect& damage_rect,
1316 const std::string& mailbox_name, 1286 const std::string& mailbox_name,
1317 const BufferPresentedCallback& ack_callback) { 1287 const BufferPresentedCallback& ack_callback) {
1318 if (last_swapped_surface_size_ != surface_rect.size()) { 1288 if (last_swapped_surface_size_ != surface_rect.size()) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1433 1403
1434 gfx::Size frame_size = root_pass->output_rect.size(); 1404 gfx::Size frame_size = root_pass->output_rect.size();
1435 gfx::Size frame_size_in_dip = 1405 gfx::Size frame_size_in_dip =
1436 ConvertSizeToDIP(frame_device_scale_factor, frame_size); 1406 ConvertSizeToDIP(frame_device_scale_factor, frame_size);
1437 1407
1438 gfx::Rect damage_rect = gfx::ToEnclosingRect(root_pass->damage_rect); 1408 gfx::Rect damage_rect = gfx::ToEnclosingRect(root_pass->damage_rect);
1439 damage_rect.Intersect(gfx::Rect(frame_size)); 1409 damage_rect.Intersect(gfx::Rect(frame_size));
1440 gfx::Rect damage_rect_in_dip = 1410 gfx::Rect damage_rect_in_dip =
1441 ConvertRectToDIP(frame_device_scale_factor, damage_rect); 1411 ConvertRectToDIP(frame_device_scale_factor, damage_rect);
1442 1412
1443 framebuffer_holder_ = NULL; 1413 software_frame_manager_->DiscardCurrentFrame();
1444 FrameMemoryManager::GetInstance()->RemoveFrame(this);
1445 1414
1446 if (ShouldSkipFrame(frame_size_in_dip)) { 1415 if (ShouldSkipFrame(frame_size_in_dip)) {
1447 cc::CompositorFrameAck ack; 1416 cc::CompositorFrameAck ack;
1448 cc::TransferableResource::ReturnResources(frame_data->resource_list, 1417 cc::TransferableResource::ReturnResources(frame_data->resource_list,
1449 &ack.resources); 1418 &ack.resources);
1450 RenderWidgetHostImpl::SendSwapCompositorFrameAck( 1419 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1451 host_->GetRoutingID(), output_surface_id, 1420 host_->GetRoutingID(), output_surface_id,
1452 host_->GetProcess()->GetID(), ack); 1421 host_->GetProcess()->GetID(), ack);
1453 skipped_frames_ = true; 1422 skipped_frames_ = true;
1454 return; 1423 return;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 const gfx::Size& frame_size = frame_data->size; 1537 const gfx::Size& frame_size = frame_data->size;
1569 const gfx::Rect& damage_rect = frame_data->damage_rect; 1538 const gfx::Rect& damage_rect = frame_data->damage_rect;
1570 gfx::Size frame_size_in_dip = 1539 gfx::Size frame_size_in_dip =
1571 ConvertSizeToDIP(frame_device_scale_factor, frame_size); 1540 ConvertSizeToDIP(frame_device_scale_factor, frame_size);
1572 if (ShouldSkipFrame(frame_size_in_dip)) { 1541 if (ShouldSkipFrame(frame_size_in_dip)) {
1573 ReleaseSoftwareFrame(output_surface_id, frame_data->id); 1542 ReleaseSoftwareFrame(output_surface_id, frame_data->id);
1574 SendSoftwareFrameAck(output_surface_id); 1543 SendSoftwareFrameAck(output_surface_id);
1575 return; 1544 return;
1576 } 1545 }
1577 1546
1578 const size_t size_in_bytes = 4 * frame_size.GetArea(); 1547 if (!software_frame_manager_->SwapToNewFrame(
1579 #ifdef OS_WIN 1548 output_surface_id,
1580 scoped_ptr<base::SharedMemory> shared_memory( 1549 frame_data.get(),
1581 new base::SharedMemory(frame_data->handle, true, 1550 frame_device_scale_factor,
1582 host_->GetProcess()->GetHandle())); 1551 host_->GetProcess()->GetHandle())) {
1583 #else
1584 scoped_ptr<base::SharedMemory> shared_memory(
1585 new base::SharedMemory(frame_data->handle, true));
1586 #endif
1587
1588 #ifdef OS_WIN
1589 if (!shared_memory->Map(0)) {
1590 DLOG(ERROR) << "Unable to map renderer memory.";
1591 RecordAction(UserMetricsAction("BadMessageTerminate_RWHVA1"));
1592 host_->GetProcess()->ReceivedBadMessage(); 1552 host_->GetProcess()->ReceivedBadMessage();
1593 return; 1553 return;
1594 } 1554 }
1595 1555
1596 if (shared_memory->mapped_size() < size_in_bytes) {
1597 DLOG(ERROR) << "Shared memory too small for given rectangle";
1598 RecordAction(UserMetricsAction("BadMessageTerminate_RWHVA2"));
1599 host_->GetProcess()->ReceivedBadMessage();
1600 return;
1601 }
1602 #else
1603 if (!shared_memory->Map(size_in_bytes)) {
1604 DLOG(ERROR) << "Unable to map renderer memory.";
1605 RecordAction(UserMetricsAction("BadMessageTerminate_RWHVA1"));
1606 host_->GetProcess()->ReceivedBadMessage();
1607 return;
1608 }
1609 #endif
1610
1611 if (last_swapped_surface_size_ != frame_size) { 1556 if (last_swapped_surface_size_ != frame_size) {
1612 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size)) 1557 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size))
1613 << "Expected full damage rect"; 1558 << "Expected full damage rect";
1614 } 1559 }
1615 last_swapped_surface_size_ = frame_size; 1560 last_swapped_surface_size_ = frame_size;
1616 last_swapped_surface_scale_factor_ = frame_device_scale_factor; 1561 last_swapped_surface_scale_factor_ = frame_device_scale_factor;
1617 1562
1618 scoped_refptr<MemoryHolder> holder(new MemoryHolder(
1619 shared_memory.Pass(),
1620 frame_size,
1621 base::Bind(&RenderWidgetHostViewAura::ReleaseSoftwareFrame,
1622 AsWeakPtr(),
1623 output_surface_id,
1624 frame_data->id)));
1625 framebuffer_holder_.swap(holder);
1626 cc::TextureMailbox mailbox; 1563 cc::TextureMailbox mailbox;
1627 scoped_ptr<cc::SingleReleaseCallback> callback; 1564 scoped_ptr<cc::SingleReleaseCallback> callback;
1628 framebuffer_holder_->GetMailbox(&mailbox, &callback); 1565 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback);
1629 DCHECK(mailbox.IsSharedMemory()); 1566 DCHECK(mailbox.IsSharedMemory());
1630 current_frame_size_ = frame_size_in_dip; 1567 current_frame_size_ = frame_size_in_dip;
1631 1568
1632 released_front_lock_ = NULL; 1569 released_front_lock_ = NULL;
1633 CheckResizeLock(); 1570 CheckResizeLock();
1634 window_->layer()->SetTextureMailbox(mailbox, 1571 window_->layer()->SetTextureMailbox(mailbox,
1635 callback.Pass(), 1572 callback.Pass(),
1636 frame_device_scale_factor); 1573 frame_device_scale_factor);
1637 window_->SchedulePaintInRect( 1574 window_->SchedulePaintInRect(
1638 ConvertRectToDIP(frame_device_scale_factor, damage_rect)); 1575 ConvertRectToDIP(frame_device_scale_factor, damage_rect));
1639 1576
1640 ui::Compositor* compositor = GetCompositor(); 1577 ui::Compositor* compositor = GetCompositor();
1641 if (compositor) { 1578 if (compositor) {
1642 compositor->SetLatencyInfo(latency_info); 1579 compositor->SetLatencyInfo(latency_info);
1643 AddOnCommitCallbackAndDisableLocks( 1580 AddOnCommitCallbackAndDisableLocks(
1644 base::Bind(&RenderWidgetHostViewAura::SendSoftwareFrameAck, 1581 base::Bind(&RenderWidgetHostViewAura::SendSoftwareFrameAck,
1645 AsWeakPtr(), 1582 AsWeakPtr(),
1646 output_surface_id)); 1583 output_surface_id));
1647 } 1584 }
1648 if (paint_observer_) 1585 if (paint_observer_)
1649 paint_observer_->OnUpdateCompositorContent(); 1586 paint_observer_->OnUpdateCompositorContent();
1650 DidReceiveFrameFromRenderer(); 1587 DidReceiveFrameFromRenderer();
1651 FrameMemoryManager::GetInstance()->AddFrame(this, !host_->is_hidden()); 1588
1589 software_frame_manager_->SwapToNewFrameComplete(!host_->is_hidden());
1652 } 1590 }
1653 1591
1654 void RenderWidgetHostViewAura::SendSoftwareFrameAck(uint32 output_surface_id) { 1592 void RenderWidgetHostViewAura::SendSoftwareFrameAck(uint32 output_surface_id) {
1655 unsigned software_frame_id = 0; 1593 unsigned software_frame_id = 0;
1656 if (released_software_frame_ && 1594 if (released_software_frame_ &&
1657 released_software_frame_->output_surface_id == output_surface_id) { 1595 released_software_frame_->output_surface_id == output_surface_id) {
1658 software_frame_id = released_software_frame_->frame_id; 1596 software_frame_id = released_software_frame_->frame_id;
1659 released_software_frame_.reset(); 1597 released_software_frame_.reset();
1660 } 1598 }
1661 1599
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1749 1687
1750 void RenderWidgetHostViewAura::BuffersSwapped( 1688 void RenderWidgetHostViewAura::BuffersSwapped(
1751 const gfx::Size& surface_size, 1689 const gfx::Size& surface_size,
1752 const gfx::Rect& damage_rect, 1690 const gfx::Rect& damage_rect,
1753 float surface_scale_factor, 1691 float surface_scale_factor,
1754 const std::string& mailbox_name, 1692 const std::string& mailbox_name,
1755 const ui::LatencyInfo& latency_info, 1693 const ui::LatencyInfo& latency_info,
1756 const BufferPresentedCallback& ack_callback) { 1694 const BufferPresentedCallback& ack_callback) {
1757 scoped_refptr<ui::Texture> previous_texture(current_surface_); 1695 scoped_refptr<ui::Texture> previous_texture(current_surface_);
1758 const gfx::Rect surface_rect = gfx::Rect(surface_size); 1696 const gfx::Rect surface_rect = gfx::Rect(surface_size);
1759 framebuffer_holder_ = NULL; 1697 software_frame_manager_->DiscardCurrentFrame();
1760 FrameMemoryManager::GetInstance()->RemoveFrame(this);
1761 1698
1762 if (!SwapBuffersPrepare(surface_rect, 1699 if (!SwapBuffersPrepare(surface_rect,
1763 surface_scale_factor, 1700 surface_scale_factor,
1764 damage_rect, 1701 damage_rect,
1765 mailbox_name, 1702 mailbox_name,
1766 ack_callback)) { 1703 ack_callback)) {
1767 return; 1704 return;
1768 } 1705 }
1769 1706
1770 SkRegion damage(RectToSkIRect(damage_rect)); 1707 SkRegion damage(RectToSkIRect(damage_rect));
(...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after
3063 3000
3064 //////////////////////////////////////////////////////////////////////////////// 3001 ////////////////////////////////////////////////////////////////////////////////
3065 // RenderWidgetHostViewAura, aura::RootWindowObserver implementation: 3002 // RenderWidgetHostViewAura, aura::RootWindowObserver implementation:
3066 3003
3067 void RenderWidgetHostViewAura::OnRootWindowHostMoved( 3004 void RenderWidgetHostViewAura::OnRootWindowHostMoved(
3068 const aura::RootWindow* root, 3005 const aura::RootWindow* root,
3069 const gfx::Point& new_origin) { 3006 const gfx::Point& new_origin) {
3070 UpdateScreenInfo(window_); 3007 UpdateScreenInfo(window_);
3071 } 3008 }
3072 3009
3073 void RenderWidgetHostViewAura::ReleaseCurrentFrame() { 3010 ////////////////////////////////////////////////////////////////////////////////
3074 if (framebuffer_holder_.get() && !current_surface_.get()) { 3011 // RenderWidgetHostViewAura, SoftwareFrameManagerClient implementation:
3075 framebuffer_holder_ = NULL; 3012
3076 ui::Compositor* compositor = GetCompositor(); 3013 void RenderWidgetHostViewAura::SoftwareFrameWasFreed(
3077 if (compositor) { 3014 uint32 output_surface_id, unsigned frame_id) {
3078 AddOnCommitCallbackAndDisableLocks(base::Bind( 3015 ReleaseSoftwareFrame(output_surface_id, frame_id);
3079 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr())); 3016 }
3080 } 3017
3081 UpdateExternalTexture(); 3018 void RenderWidgetHostViewAura::ReleaseReferencesToSoftwareFrame() {
3019 ui::Compositor* compositor = GetCompositor();
3020 if (compositor) {
3021 AddOnCommitCallbackAndDisableLocks(base::Bind(
3022 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr()));
3082 } 3023 }
3024 UpdateExternalTexture();
3083 } 3025 }
3084 3026
3085 //////////////////////////////////////////////////////////////////////////////// 3027 ////////////////////////////////////////////////////////////////////////////////
3086 // RenderWidgetHostViewAura, ui::CompositorObserver implementation: 3028 // RenderWidgetHostViewAura, ui::CompositorObserver implementation:
3087 3029
3088 void RenderWidgetHostViewAura::OnCompositingDidCommit( 3030 void RenderWidgetHostViewAura::OnCompositingDidCommit(
3089 ui::Compositor* compositor) { 3031 ui::Compositor* compositor) {
3090 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 3032 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
3091 can_lock_compositor_ = YES; 3033 can_lock_compositor_ = YES;
3092 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) 3034 if (resize_lock_.get() && resize_lock_->GrabDeferredLock())
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
3246 popup_child_host_view_->popup_parent_host_view_ == this); 3188 popup_child_host_view_->popup_parent_host_view_ == this);
3247 popup_child_host_view_->popup_parent_host_view_ = NULL; 3189 popup_child_host_view_->popup_parent_host_view_ = NULL;
3248 } 3190 }
3249 aura::client::SetTooltipText(window_, NULL); 3191 aura::client::SetTooltipText(window_, NULL);
3250 gfx::Screen::GetScreenFor(window_)->RemoveObserver(this); 3192 gfx::Screen::GetScreenFor(window_)->RemoveObserver(this);
3251 3193
3252 // This call is usually no-op since |this| object is already removed from the 3194 // This call is usually no-op since |this| object is already removed from the
3253 // Aura root window and we don't have a way to get an input method object 3195 // Aura root window and we don't have a way to get an input method object
3254 // associated with the window, but just in case. 3196 // associated with the window, but just in case.
3255 DetachFromInputMethod(); 3197 DetachFromInputMethod();
3256 FrameMemoryManager::GetInstance()->RemoveFrame(this);
3257 // The destruction of the holder may call back into the RWHVA, so do it
3258 // early.
3259 framebuffer_holder_ = NULL;
3260 3198
3261 if (resource_collection_.get()) 3199 if (resource_collection_.get())
3262 resource_collection_->SetClient(NULL); 3200 resource_collection_->SetClient(NULL);
3263 } 3201 }
3264 3202
3265 void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() { 3203 void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
3266 const gfx::Point screen_point = 3204 const gfx::Point screen_point =
3267 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 3205 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
3268 aura::RootWindow* root_window = window_->GetRootWindow(); 3206 aura::RootWindow* root_window = window_->GetRootWindow();
3269 if (!root_window) 3207 if (!root_window)
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
3465 RenderWidgetHost* widget) { 3403 RenderWidgetHost* widget) {
3466 return new RenderWidgetHostViewAura(widget); 3404 return new RenderWidgetHostViewAura(widget);
3467 } 3405 }
3468 3406
3469 // static 3407 // static
3470 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 3408 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
3471 GetScreenInfoForWindow(results, NULL); 3409 GetScreenInfoForWindow(results, NULL);
3472 } 3410 }
3473 3411
3474 } // namespace content 3412 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698