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

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

Issue 43193002: Aura/ÜC: Drop frames on background tabs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add test, properly extract RendererFrameManager 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/software_frame_manager.h" 5 #include "content/browser/renderer_host/software_frame_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/sys_info.h"
10 #include "content/browser/renderer_host/dip_util.h" 9 #include "content/browser/renderer_host/dip_util.h"
11 #include "content/public/browser/user_metrics.h" 10 #include "content/public/browser/user_metrics.h"
12 11
13 namespace { 12 namespace {
14 13
15 void ReleaseMailbox(scoped_refptr<content::SoftwareFrame> frame, 14 void ReleaseMailbox(scoped_refptr<content::SoftwareFrame> frame,
16 unsigned sync_point, 15 unsigned sync_point,
17 bool lost_resource) {} 16 bool lost_resource) {}
18 17
19 } // namespace 18 } // namespace
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 } 132 }
134 133
135 bool SoftwareFrameManager::HasCurrentFrame() const { 134 bool SoftwareFrameManager::HasCurrentFrame() const {
136 return current_frame_.get() ? true : false; 135 return current_frame_.get() ? true : false;
137 } 136 }
138 137
139 void SoftwareFrameManager::DiscardCurrentFrame() { 138 void SoftwareFrameManager::DiscardCurrentFrame() {
140 if (!HasCurrentFrame()) 139 if (!HasCurrentFrame())
141 return; 140 return;
142 current_frame_ = NULL; 141 current_frame_ = NULL;
143 SoftwareFrameMemoryManager::GetInstance()->RemoveFrame(this); 142 RendererFrameManager::GetInstance()->RemoveFrame(this);
144 } 143 }
145 144
146 void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) { 145 void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) {
147 DCHECK(HasCurrentFrame()); 146 DCHECK(HasCurrentFrame());
148 SoftwareFrameMemoryManager::GetInstance()->AddFrame(this, visible); 147 RendererFrameManager::GetInstance()->AddFrame(this, visible);
149 } 148 }
150 149
151 void SoftwareFrameManager::SetVisibility(bool visible) { 150 void SoftwareFrameManager::SetVisibility(bool visible) {
152 if (HasCurrentFrame()) { 151 if (HasCurrentFrame()) {
153 SoftwareFrameMemoryManager::GetInstance()->SetFrameVisibility(this, 152 RendererFrameManager::GetInstance()->SetFrameVisibility(this, visible);
154 visible);
155 } 153 }
156 } 154 }
157 155
158 void SoftwareFrameManager::GetCurrentFrameMailbox( 156 void SoftwareFrameManager::GetCurrentFrameMailbox(
159 cc::TextureMailbox* mailbox, 157 cc::TextureMailbox* mailbox,
160 scoped_ptr<cc::SingleReleaseCallback>* callback) { 158 scoped_ptr<cc::SingleReleaseCallback>* callback) {
161 DCHECK(HasCurrentFrame()); 159 DCHECK(HasCurrentFrame());
162 *mailbox = cc::TextureMailbox( 160 *mailbox = cc::TextureMailbox(
163 current_frame_->shared_memory_.get(), current_frame_->frame_size_pixels_); 161 current_frame_->shared_memory_.get(), current_frame_->frame_size_pixels_);
164 *callback = cc::SingleReleaseCallback::Create( 162 *callback = cc::SingleReleaseCallback::Create(
(...skipping 17 matching lines...) Expand all
182 return current_frame_->frame_size_dip_; 180 return current_frame_->frame_size_dip_;
183 } 181 }
184 182
185 void SoftwareFrameManager::EvictCurrentFrame() { 183 void SoftwareFrameManager::EvictCurrentFrame() {
186 DCHECK(HasCurrentFrame()); 184 DCHECK(HasCurrentFrame());
187 DiscardCurrentFrame(); 185 DiscardCurrentFrame();
188 if (client_) 186 if (client_)
189 client_->ReleaseReferencesToSoftwareFrame(); 187 client_->ReleaseReferencesToSoftwareFrame();
190 } 188 }
191 189
192 ////////////////////////////////////////////////////////////////////////////////
193 // SoftwareFrameMemoryManager
194
195 SoftwareFrameMemoryManager* SoftwareFrameMemoryManager::GetInstance() {
196 return Singleton<SoftwareFrameMemoryManager>::get();
197 }
198
199 void SoftwareFrameMemoryManager::AddFrame(SoftwareFrameManager* frame,
200 bool visible) {
201 RemoveFrame(frame);
202 if (visible)
203 visible_frames_.insert(frame);
204 else
205 hidden_frames_.push_front(frame);
206 CullHiddenFrames();
207 }
208
209 void SoftwareFrameMemoryManager::RemoveFrame(SoftwareFrameManager* frame) {
210 visible_frames_.erase(frame);
211 hidden_frames_.remove(frame);
212 }
213
214 void SoftwareFrameMemoryManager::SetFrameVisibility(SoftwareFrameManager* frame,
215 bool visible) {
216 if (visible) {
217 hidden_frames_.remove(frame);
218 visible_frames_.insert(frame);
219 } else {
220 visible_frames_.erase(frame);
221 hidden_frames_.push_front(frame);
222 CullHiddenFrames();
223 }
224 }
225
226 SoftwareFrameMemoryManager::SoftwareFrameMemoryManager()
227 : max_number_of_saved_frames_(
228 std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256))) {}
229
230 SoftwareFrameMemoryManager::~SoftwareFrameMemoryManager() {}
231
232 void SoftwareFrameMemoryManager::CullHiddenFrames() {
233 while (!hidden_frames_.empty() &&
234 hidden_frames_.size() + visible_frames_.size() >
235 max_number_of_saved_frames()) {
236 size_t old_size = hidden_frames_.size();
237 // Should remove self from list.
238 hidden_frames_.back()->EvictCurrentFrame();
239 DCHECK_EQ(hidden_frames_.size() + 1, old_size);
240 }
241 }
242
243 } // namespace content 190 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698