diff options
11 files changed, 328 insertions, 103 deletions
diff --git a/content/browser/renderer_host/delegated_frame_evictor.cc b/content/browser/renderer_host/delegated_frame_evictor.cc new file mode 100644 index 0000000..8993d11 --- /dev/null +++ b/content/browser/renderer_host/delegated_frame_evictor.cc @@ -0,0 +1,34 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/renderer_host/delegated_frame_evictor.h" + +namespace content { + +DelegatedFrameEvictor::DelegatedFrameEvictor( + DelegatedFrameEvictorClient* client) + : client_(client), has_frame_(false) {} + +DelegatedFrameEvictor::~DelegatedFrameEvictor() { DiscardedFrame(); } + +void DelegatedFrameEvictor::SwappedFrame(bool visible) { + has_frame_ = true; + RendererFrameManager::GetInstance()->AddFrame(this, visible); +} + +void DelegatedFrameEvictor::DiscardedFrame() { + RendererFrameManager::GetInstance()->RemoveFrame(this); + has_frame_ = false; +} + +void DelegatedFrameEvictor::SetVisible(bool visible) { + if (has_frame_) + RendererFrameManager::GetInstance()->SetFrameVisibility(this, visible); +} + +void DelegatedFrameEvictor::EvictCurrentFrame() { + client_->EvictDelegatedFrame(); +} + +} // namespace content diff --git a/content/browser/renderer_host/delegated_frame_evictor.h b/content/browser/renderer_host/delegated_frame_evictor.h new file mode 100644 index 0000000..c54f2c4 --- /dev/null +++ b/content/browser/renderer_host/delegated_frame_evictor.h @@ -0,0 +1,41 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_RENDERER_HOST_DELEGATED_FRAME_EVICTOR_H_ +#define CONTENT_BROWSER_RENDERER_HOST_DELEGATED_FRAME_EVICTOR_H_ + +#include "content/browser/renderer_host/renderer_frame_manager.h" +#include "content/common/content_export.h" + +namespace content { + +class CONTENT_EXPORT DelegatedFrameEvictorClient { + public: + virtual ~DelegatedFrameEvictorClient() {} + virtual void EvictDelegatedFrame() = 0; +}; + +class CONTENT_EXPORT DelegatedFrameEvictor : public RendererFrameManagerClient { + public: + // |client| must outlive |this|. + explicit DelegatedFrameEvictor(DelegatedFrameEvictorClient* client); + virtual ~DelegatedFrameEvictor(); + + void SwappedFrame(bool visible); + void DiscardedFrame(); + void SetVisible(bool visible); + + private: + // RendererFrameManagerClient implementation. + virtual void EvictCurrentFrame() OVERRIDE; + + DelegatedFrameEvictorClient* client_; + bool has_frame_; + + DISALLOW_COPY_AND_ASSIGN(DelegatedFrameEvictor); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_DELEGATED_FRAME_EVICTOR_H_ diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index a59c986..2d56a3f 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -575,6 +575,7 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) cursor_visibility_state_in_renderer_(UNKNOWN), paint_observer_(NULL), touch_editing_client_(NULL), + delegated_frame_evictor_(new DelegatedFrameEvictor(this)), weak_ptr_factory_(this) { host_->SetView(this); window_observer_.reset(new WindowObserver(this)); @@ -663,6 +664,7 @@ void RenderWidgetHostViewAura::WasShown() { return; host_->WasShown(); software_frame_manager_->SetVisibility(true); + delegated_frame_evictor_->SetVisible(true); aura::Window* root = window_->GetRootWindow(); if (root) { @@ -691,6 +693,7 @@ void RenderWidgetHostViewAura::WasHidden() { return; host_->WasHidden(); software_frame_manager_->SetVisibility(false); + delegated_frame_evictor_->SetVisible(false); released_front_lock_ = NULL; #if defined(OS_WIN) @@ -1452,8 +1455,7 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( // resources from the old one with resources from the new one which would // have the same id. Changing the layer to showing painted content destroys // the DelegatedRendererLayer. - window_->layer()->SetShowPaintedContent(); - frame_provider_ = NULL; + EvictDelegatedFrame(); // Drop the cc::DelegatedFrameResourceCollection so that we will not return // any resources from the old output surface with the new output surface id. @@ -1469,8 +1471,7 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( } if (frame_size.IsEmpty()) { DCHECK_EQ(0u, frame_data->resource_list.size()); - window_->layer()->SetShowPaintedContent(); - frame_provider_ = NULL; + EvictDelegatedFrame(); } else { if (!resource_collection_) { resource_collection_ = new cc::DelegatedFrameResourceCollection; @@ -1506,6 +1507,9 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( output_surface_id)); } DidReceiveFrameFromRenderer(); + if (frame_provider_.get()) + delegated_frame_evictor_->SwappedFrame(!host_->is_hidden()); + // Note: the frame may have been evicted immediately. } void RenderWidgetHostViewAura::SendDelegatedFrameAck(uint32 output_surface_id) { @@ -1540,6 +1544,12 @@ void RenderWidgetHostViewAura::SendReturnedDelegatedResources( ack); } +void RenderWidgetHostViewAura::EvictDelegatedFrame() { + window_->layer()->SetShowPaintedContent(); + frame_provider_ = NULL; + delegated_frame_evictor_->DiscardedFrame(); +} + void RenderWidgetHostViewAura::SwapSoftwareFrame( uint32 output_surface_id, scoped_ptr<cc::SoftwareFrameData> frame_data, @@ -1799,8 +1809,7 @@ void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { // We need to wait for a commit to clear to guarantee that all we // will not issue any more GL referencing the previous surface. AddOnCommitCallbackAndDisableLocks( - base::Bind(&RenderWidgetHostViewAura:: - SetSurfaceNotInUseByCompositor, + base::Bind(&RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor, AsWeakPtr(), current_surface_)); // Hold a ref so the texture will not // get deleted until after commit. diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 7e47db6..2a5c4f2 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -20,6 +20,7 @@ #include "cc/resources/texture_mailbox.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/aura/image_transport_factory.h" +#include "content/browser/renderer_host/delegated_frame_evictor.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/renderer_host/software_frame_manager.h" #include "content/common/content_export.h" @@ -78,6 +79,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura public ImageTransportFactoryObserver, public BrowserAccessibilityDelegate, public SoftwareFrameManagerClient, + public DelegatedFrameEvictorClient, public base::SupportsWeakPtr<RenderWidgetHostViewAura>, public cc::DelegatedFrameResourceCollectionClient { public: @@ -388,6 +390,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAura FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames); FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange); + FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, + DiscardDelegatedFrames); class WindowObserver; friend class WindowObserver; @@ -532,6 +536,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAura void SendDelegatedFrameAck(uint32 output_surface_id); void SendReturnedDelegatedResources(uint32 output_surface_id); + // DelegatedFrameEvictorClient implementation. + virtual void EvictDelegatedFrame() OVERRIDE; + // cc::DelegatedFrameProviderClient implementation. virtual void UnusedResourcesAreAvailable() OVERRIDE; @@ -759,6 +766,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura unsigned frame_id; }; scoped_ptr<ReleasedFrameInfo> released_software_frame_; + scoped_ptr<DelegatedFrameEvictor> delegated_frame_evictor_; base::WeakPtrFactory<RenderWidgetHostViewAura> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAura); diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index aa925e9..3dcdc35 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -158,13 +158,12 @@ class RenderWidgetHostViewAuraTest : public testing::Test { aura_test_helper_->SetUp(); browser_context_.reset(new TestBrowserContext); - MockRenderProcessHost* process_host = - new MockRenderProcessHost(browser_context_.get()); + process_host_ = new MockRenderProcessHost(browser_context_.get()); - sink_ = &process_host->sink(); + sink_ = &process_host_->sink(); parent_host_ = new RenderWidgetHostImpl( - &delegate_, process_host, MSG_ROUTING_NONE, false); + &delegate_, process_host_, MSG_ROUTING_NONE, false); parent_view_ = static_cast<RenderWidgetHostViewAura*>( RenderWidgetHostView::CreateViewForWidget(parent_host_)); parent_view_->InitAsChild(NULL); @@ -173,7 +172,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test { gfx::Rect()); widget_host_ = new RenderWidgetHostImpl( - &delegate_, process_host, MSG_ROUTING_NONE, false); + &delegate_, process_host_, MSG_ROUTING_NONE, false); widget_host_->Init(); widget_host_->OnMessageReceived( ViewHostMsg_DidActivateAcceleratedCompositing(0, true)); @@ -182,6 +181,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test { virtual void TearDown() { sink_ = NULL; + process_host_ = NULL; if (view_) view_->Destroy(); delete widget_host_; @@ -203,6 +203,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test { scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_; scoped_ptr<BrowserContext> browser_context_; MockRenderWidgetHostDelegate delegate_; + MockRenderProcessHost* process_host_; // Tests should set these to NULL if they've already triggered their // destruction. @@ -976,4 +977,103 @@ TEST_F(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange) { view_->window_->RemoveObserver(&observer); } +TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { + size_t max_renderer_frames = + RendererFrameManager::GetInstance()->max_number_of_saved_frames(); + ASSERT_LE(2u, max_renderer_frames); + size_t renderer_count = max_renderer_frames + 1; + gfx::Rect view_rect(100, 100); + gfx::Size frame_size = view_rect.size(); + + scoped_ptr<RenderWidgetHostImpl * []> hosts( + new RenderWidgetHostImpl* [renderer_count]); + scoped_ptr<FakeRenderWidgetHostViewAura * []> views( + new FakeRenderWidgetHostViewAura* [renderer_count]); + + // Create a bunch of renderers. + for (size_t i = 0; i < renderer_count; ++i) { + hosts[i] = new RenderWidgetHostImpl( + &delegate_, process_host_, MSG_ROUTING_NONE, false); + hosts[i]->Init(); + hosts[i]->OnMessageReceived( + ViewHostMsg_DidActivateAcceleratedCompositing(0, true)); + views[i] = new FakeRenderWidgetHostViewAura(hosts[i]); + views[i]->InitAsChild(NULL); + aura::client::ParentWindowWithContext( + views[i]->GetNativeView(), + parent_view_->GetNativeView()->GetRootWindow(), + gfx::Rect()); + views[i]->SetSize(view_rect.size()); + } + + // Make each renderer visible, and swap a frame on it, then make it invisible. + for (size_t i = 0; i < renderer_count; ++i) { + views[i]->WasShown(); + views[i]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + EXPECT_TRUE(views[i]->frame_provider_); + views[i]->WasHidden(); + } + + // There should be max_renderer_frames with a frame in it, and one without it. + // Since the logic is LRU eviction, the first one should be without. + EXPECT_FALSE(views[0]->frame_provider_); + for (size_t i = 1; i < renderer_count; ++i) + EXPECT_TRUE(views[i]->frame_provider_); + + // LRU renderer is [0], make it visible, it shouldn't evict anything yet. + views[0]->WasShown(); + EXPECT_FALSE(views[0]->frame_provider_); + EXPECT_TRUE(views[1]->frame_provider_); + + // Swap a frame on it, it should evict the next LRU [1]. + views[0]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + EXPECT_TRUE(views[0]->frame_provider_); + EXPECT_FALSE(views[1]->frame_provider_); + views[0]->WasHidden(); + + // LRU renderer is [1], still hidden. Swap a frame on it, it should evict + // the next LRU [2]. + views[1]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + EXPECT_TRUE(views[0]->frame_provider_); + EXPECT_TRUE(views[1]->frame_provider_); + EXPECT_FALSE(views[2]->frame_provider_); + for (size_t i = 3; i < renderer_count; ++i) + EXPECT_TRUE(views[i]->frame_provider_); + + // Make all renderers but [0] visible and swap a frame on them, keep [0] + // hidden, it becomes the LRU. + for (size_t i = 1; i < renderer_count; ++i) { + views[i]->WasShown(); + views[i]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + EXPECT_TRUE(views[i]->frame_provider_); + } + EXPECT_FALSE(views[0]->frame_provider_); + + // Swap a frame on [0], it should be evicted immediately. + views[0]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + EXPECT_FALSE(views[0]->frame_provider_); + + // Make [0] visible, and swap a frame on it. Nothing should be evicted + // although we're above the limit. + views[0]->WasShown(); + views[0]->OnSwapCompositorFrame( + 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); + for (size_t i = 0; i < renderer_count; ++i) + EXPECT_TRUE(views[i]->frame_provider_); + + // Make [0] hidden, it should evict its frame. + views[0]->WasHidden(); + EXPECT_FALSE(views[0]->frame_provider_); + + for (size_t i = 0; i < renderer_count; ++i) { + views[i]->Destroy(); + delete hosts[i]; + } +} + } // namespace content diff --git a/content/browser/renderer_host/renderer_frame_manager.cc b/content/browser/renderer_host/renderer_frame_manager.cc new file mode 100644 index 0000000..3d16361 --- /dev/null +++ b/content/browser/renderer_host/renderer_frame_manager.cc @@ -0,0 +1,60 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/renderer_host/renderer_frame_manager.h" + +#include "base/logging.h" +#include "base/sys_info.h" + +namespace content { + +RendererFrameManager* RendererFrameManager::GetInstance() { + return Singleton<RendererFrameManager>::get(); +} + +void RendererFrameManager::AddFrame(RendererFrameManagerClient* frame, + bool visible) { + RemoveFrame(frame); + if (visible) + visible_frames_.insert(frame); + else + hidden_frames_.push_front(frame); + CullHiddenFrames(); +} + +void RendererFrameManager::RemoveFrame(RendererFrameManagerClient* frame) { + visible_frames_.erase(frame); + hidden_frames_.remove(frame); +} + +void RendererFrameManager::SetFrameVisibility(RendererFrameManagerClient* frame, + bool visible) { + if (visible) { + hidden_frames_.remove(frame); + visible_frames_.insert(frame); + } else { + visible_frames_.erase(frame); + hidden_frames_.push_front(frame); + CullHiddenFrames(); + } +} + +RendererFrameManager::RendererFrameManager() + : max_number_of_saved_frames_( + std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256))) {} + +RendererFrameManager::~RendererFrameManager() {} + +void RendererFrameManager::CullHiddenFrames() { + while (!hidden_frames_.empty() && + hidden_frames_.size() + visible_frames_.size() > + max_number_of_saved_frames()) { + size_t old_size = hidden_frames_.size(); + // Should remove self from list. + hidden_frames_.back()->EvictCurrentFrame(); + DCHECK_EQ(hidden_frames_.size() + 1, old_size); + } +} + +} // namespace content diff --git a/content/browser/renderer_host/renderer_frame_manager.h b/content/browser/renderer_host/renderer_frame_manager.h new file mode 100644 index 0000000..134e1ef --- /dev/null +++ b/content/browser/renderer_host/renderer_frame_manager.h @@ -0,0 +1,50 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDERER_FRAME_MANAGER_H_ +#define CONTENT_BROWSER_RENDERER_HOST_RENDERER_FRAME_MANAGER_H_ + +#include <list> +#include <set> + +#include "base/basictypes.h" +#include "base/memory/singleton.h" +#include "content/common/content_export.h" + +namespace content { + +class CONTENT_EXPORT RendererFrameManagerClient { + public: + virtual ~RendererFrameManagerClient() {} + virtual void EvictCurrentFrame() = 0; +}; + +class CONTENT_EXPORT RendererFrameManager { + public: + static RendererFrameManager* GetInstance(); + + void AddFrame(RendererFrameManagerClient*, bool visible); + void RemoveFrame(RendererFrameManagerClient*); + void SetFrameVisibility(RendererFrameManagerClient*, bool visible); + + size_t max_number_of_saved_frames() const { + return max_number_of_saved_frames_; + } + + private: + RendererFrameManager(); + ~RendererFrameManager(); + void CullHiddenFrames(); + friend struct DefaultSingletonTraits<RendererFrameManager>; + + std::set<RendererFrameManagerClient*> visible_frames_; + std::list<RendererFrameManagerClient*> hidden_frames_; + size_t max_number_of_saved_frames_; + + DISALLOW_COPY_AND_ASSIGN(RendererFrameManager); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_RENDERER_FRAME_MANAGER_H_ diff --git a/content/browser/renderer_host/software_frame_manager.cc b/content/browser/renderer_host/software_frame_manager.cc index e5baafa..0650a18 100644 --- a/content/browser/renderer_host/software_frame_manager.cc +++ b/content/browser/renderer_host/software_frame_manager.cc @@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/debug/alias.h" -#include "base/sys_info.h" #include "content/browser/renderer_host/dip_util.h" #include "content/public/browser/user_metrics.h" @@ -171,18 +170,17 @@ void SoftwareFrameManager::DiscardCurrentFrame() { if (!HasCurrentFrame()) return; current_frame_ = NULL; - SoftwareFrameMemoryManager::GetInstance()->RemoveFrame(this); + RendererFrameManager::GetInstance()->RemoveFrame(this); } void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) { DCHECK(HasCurrentFrame()); - SoftwareFrameMemoryManager::GetInstance()->AddFrame(this, visible); + RendererFrameManager::GetInstance()->AddFrame(this, visible); } void SoftwareFrameManager::SetVisibility(bool visible) { if (HasCurrentFrame()) { - SoftwareFrameMemoryManager::GetInstance()->SetFrameVisibility(this, - visible); + RendererFrameManager::GetInstance()->SetFrameVisibility(this, visible); } } @@ -220,55 +218,4 @@ void SoftwareFrameManager::EvictCurrentFrame() { client_->ReleaseReferencesToSoftwareFrame(); } -//////////////////////////////////////////////////////////////////////////////// -// SoftwareFrameMemoryManager - -SoftwareFrameMemoryManager* SoftwareFrameMemoryManager::GetInstance() { - return Singleton<SoftwareFrameMemoryManager>::get(); -} - -void SoftwareFrameMemoryManager::AddFrame(SoftwareFrameManager* frame, - bool visible) { - RemoveFrame(frame); - if (visible) - visible_frames_.insert(frame); - else - hidden_frames_.push_front(frame); - CullHiddenFrames(); -} - -void SoftwareFrameMemoryManager::RemoveFrame(SoftwareFrameManager* frame) { - visible_frames_.erase(frame); - hidden_frames_.remove(frame); -} - -void SoftwareFrameMemoryManager::SetFrameVisibility(SoftwareFrameManager* frame, - bool visible) { - if (visible) { - hidden_frames_.remove(frame); - visible_frames_.insert(frame); - } else { - visible_frames_.erase(frame); - hidden_frames_.push_front(frame); - CullHiddenFrames(); - } -} - -SoftwareFrameMemoryManager::SoftwareFrameMemoryManager() - : max_number_of_saved_frames_( - std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256))) {} - -SoftwareFrameMemoryManager::~SoftwareFrameMemoryManager() {} - -void SoftwareFrameMemoryManager::CullHiddenFrames() { - while (!hidden_frames_.empty() && - hidden_frames_.size() + visible_frames_.size() > - max_number_of_saved_frames()) { - size_t old_size = hidden_frames_.size(); - // Should remove self from list. - hidden_frames_.back()->EvictCurrentFrame(); - DCHECK_EQ(hidden_frames_.size() + 1, old_size); - } -} - } // namespace content diff --git a/content/browser/renderer_host/software_frame_manager.h b/content/browser/renderer_host/software_frame_manager.h index d7f186f..503a40d 100644 --- a/content/browser/renderer_host/software_frame_manager.h +++ b/content/browser/renderer_host/software_frame_manager.h @@ -11,17 +11,16 @@ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory.h" -#include "base/memory/singleton.h" #include "base/memory/weak_ptr.h" #include "cc/output/software_frame_data.h" #include "cc/resources/single_release_callback.h" #include "cc/resources/texture_mailbox.h" +#include "content/browser/renderer_host/renderer_frame_manager.h" #include "content/common/content_export.h" #include "ui/gfx/size.h" namespace content { class SoftwareFrame; -class SoftwareFrameMemoryManager; class CONTENT_EXPORT SoftwareFrameManagerClient { public: @@ -36,11 +35,11 @@ class CONTENT_EXPORT SoftwareFrameManagerClient { virtual void ReleaseReferencesToSoftwareFrame() = 0; }; -class CONTENT_EXPORT SoftwareFrameManager { +class CONTENT_EXPORT SoftwareFrameManager : public RendererFrameManagerClient { public: explicit SoftwareFrameManager( base::WeakPtr<SoftwareFrameManagerClient> client); - ~SoftwareFrameManager(); + virtual ~SoftwareFrameManager(); // Swaps to a new frame from shared memory. This frame is guaranteed to // not be evicted until SwapToNewFrameComplete is called. @@ -61,11 +60,9 @@ class CONTENT_EXPORT SoftwareFrameManager { gfx::Size GetCurrentFrameSizeInDIP() const; private: - friend class SoftwareFrameMemoryManager; - // Called by SoftwareFrameMemoryManager to demand that the current frame // be evicted. - void EvictCurrentFrame(); + virtual void EvictCurrentFrame() OVERRIDE; base::WeakPtr<SoftwareFrameManagerClient> client_; @@ -75,31 +72,6 @@ class CONTENT_EXPORT SoftwareFrameManager { DISALLOW_COPY_AND_ASSIGN(SoftwareFrameManager); }; -class CONTENT_EXPORT SoftwareFrameMemoryManager { - public: - static SoftwareFrameMemoryManager* GetInstance(); - - void AddFrame(SoftwareFrameManager*, bool visible); - void RemoveFrame(SoftwareFrameManager*); - void SetFrameVisibility(SoftwareFrameManager*, bool visible); - - size_t max_number_of_saved_frames() const { - return max_number_of_saved_frames_; - } - - private: - SoftwareFrameMemoryManager(); - ~SoftwareFrameMemoryManager(); - void CullHiddenFrames(); - friend struct DefaultSingletonTraits<SoftwareFrameMemoryManager>; - - std::set<SoftwareFrameManager*> visible_frames_; - std::list<SoftwareFrameManager*> hidden_frames_; - size_t max_number_of_saved_frames_; - - DISALLOW_COPY_AND_ASSIGN(SoftwareFrameMemoryManager); -}; - } // namespace content #endif // CONTENT_BROWSER_RENDERER_HOST_SOFTWARE_FRAME_MANAGER_H_ diff --git a/content/browser/renderer_host/software_frame_manager_unittest.cc b/content/browser/renderer_host/software_frame_manager_unittest.cc index eadbfb6..e234f57 100644 --- a/content/browser/renderer_host/software_frame_manager_unittest.cc +++ b/content/browser/renderer_host/software_frame_manager_unittest.cc @@ -67,8 +67,8 @@ class SoftwareFrameManagerTest : public testing::Test { clients_.clear(); } size_t MaxNumberOfSavedFrames() const { - size_t result = SoftwareFrameMemoryManager::GetInstance()-> - max_number_of_saved_frames(); + size_t result = + RendererFrameManager::GetInstance()->max_number_of_saved_frames(); return result; } diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 33341b9..98abad3 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -783,12 +783,12 @@ 'browser/renderer_host/compositor_impl_android.h', 'browser/renderer_host/database_message_filter.cc', 'browser/renderer_host/database_message_filter.h', + 'browser/renderer_host/delegated_frame_evictor.cc', + 'browser/renderer_host/delegated_frame_evictor.h', 'browser/renderer_host/dip_util.cc', 'browser/renderer_host/dip_util.h', 'browser/renderer_host/file_utilities_message_filter.cc', 'browser/renderer_host/file_utilities_message_filter.h', - 'browser/renderer_host/software_frame_manager.cc', - 'browser/renderer_host/software_frame_manager.h', 'browser/renderer_host/frame_tree.cc', 'browser/renderer_host/frame_tree.h', 'browser/renderer_host/frame_tree_node.cc', @@ -1014,6 +1014,10 @@ 'browser/renderer_host/render_widget_host_view_mac.mm', 'browser/renderer_host/render_widget_host_view_win.cc', 'browser/renderer_host/render_widget_host_view_win.h', + 'browser/renderer_host/renderer_frame_manager.cc', + 'browser/renderer_host/renderer_frame_manager.h', + 'browser/renderer_host/software_frame_manager.cc', + 'browser/renderer_host/software_frame_manager.h', 'browser/renderer_host/synthetic_gesture_calculator.cc', 'browser/renderer_host/synthetic_gesture_calculator.h', 'browser/renderer_host/synthetic_gesture_controller.cc', |