summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/delegated_frame_evictor.cc34
-rw-r--r--content/browser/renderer_host/delegated_frame_evictor.h41
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.cc21
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.h8
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura_unittest.cc110
-rw-r--r--content/browser/renderer_host/renderer_frame_manager.cc60
-rw-r--r--content/browser/renderer_host/renderer_frame_manager.h50
-rw-r--r--content/browser/renderer_host/software_frame_manager.cc59
-rw-r--r--content/browser/renderer_host/software_frame_manager.h36
-rw-r--r--content/browser/renderer_host/software_frame_manager_unittest.cc4
-rw-r--r--content/content_browser.gypi8
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',