software_frame_manager.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/renderer_host/software_frame_manager.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/bind.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/callback_helpers.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/debug/alias.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/numerics/safe_math.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace { 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ReleaseMailbox(scoped_refptr<content::SoftwareFrame> frame, 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 sync_point, 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool lost_resource) {} 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content { 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// SoftwareFrame 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class CONTENT_EXPORT SoftwareFrame : public base::RefCounted<SoftwareFrame> { 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) friend class base::RefCounted<SoftwareFrame>; 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) friend class SoftwareFrameManager; 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SoftwareFrame( 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 output_surface_id, 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsigned frame_id, 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float frame_device_scale_factor, 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size frame_size_pixels, 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ~SoftwareFrame(); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client_; 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const uint32 output_surface_id_; 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const unsigned frame_id_; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float frame_device_scale_factor_; 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gfx::Size frame_size_pixels_; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory_; 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SoftwareFrame); 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrame::SoftwareFrame( 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 output_surface_id, 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsigned frame_id, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float frame_device_scale_factor, 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size frame_size_pixels, 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory) 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : frame_manager_client_(frame_manager_client), 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_surface_id_(output_surface_id), 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_id_(frame_id), 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_device_scale_factor_(frame_device_scale_factor), 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_size_pixels_(frame_size_pixels), 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) shared_memory_(shared_memory.Pass()) {} 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrame::~SoftwareFrame() { 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (frame_manager_client_) { 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_manager_client_->SoftwareFrameWasFreed( 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_surface_id_, frame_id_); 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// SoftwareFrameManager 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrameManager::SoftwareFrameManager( 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> client) 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : client_(client) {} 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrameManager::~SoftwareFrameManager() { 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DiscardCurrentFrame(); 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SoftwareFrameManager::SwapToNewFrame( 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 output_surface_id, 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const cc::SoftwareFrameData* frame_data, 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) float frame_device_scale_factor, 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::ProcessHandle process_handle) { 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifdef OS_WIN 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory( 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new base::SharedMemory(frame_data->handle, true, 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) process_handle)); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_memory( 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new base::SharedMemory(frame_data->handle, true)); 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The NULL handle is used in testing. 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (base::SharedMemory::IsHandleValid(shared_memory->handle())) { 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CheckedNumeric<size_t> size_in_bytes_checked = 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CheckedNumeric<size_t>(4) * 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CheckedNumeric<size_t>(frame_data->size.width()) * 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CheckedNumeric<size_t>(frame_data->size.height()); 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!size_in_bytes_checked.IsValid()) { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG(ERROR) << "Integer overflow when computing bytes to map."; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t size_in_bytes = size_in_bytes_checked.ValueOrDie(); 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifdef OS_WIN 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!shared_memory->Map(0)) { 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Unable to map renderer memory."; 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RecordAction( 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (shared_memory->mapped_size() < size_in_bytes) { 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Shared memory too small for given rectangle"; 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RecordAction( 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("BadMessageTerminate_SharedMemoryManager2")); 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!shared_memory->Map(size_in_bytes)) { 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Unable to map renderer memory."; 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RecordAction( 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<SoftwareFrame> next_frame(new SoftwareFrame( 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) client_, 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_surface_id, 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_data->id, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_device_scale_factor, 1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_data->size, 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shared_memory.Pass())); 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_.swap(next_frame); 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return true; 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SoftwareFrameManager::HasCurrentFrame() const { 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return current_frame_.get() ? true : false; 1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::DiscardCurrentFrame() { 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!HasCurrentFrame()) 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_ = NULL; 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RendererFrameManager::GetInstance()->RemoveFrame(this); 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) { 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RendererFrameManager::GetInstance()->AddFrame(this, visible); 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::SetVisibility(bool visible) { 1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (HasCurrentFrame()) { 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (visible) { 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RendererFrameManager::GetInstance()->LockFrame(this); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RendererFrameManager::GetInstance()->UnlockFrame(this); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)uint32 SoftwareFrameManager::GetCurrentFrameOutputSurfaceId() const { 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_frame_->output_surface_id_; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::GetCurrentFrameMailbox( 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cc::TextureMailbox* mailbox, 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<cc::SingleReleaseCallback>* callback) { 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *mailbox = cc::TextureMailbox( 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_->shared_memory_.get(), current_frame_->frame_size_pixels_); 1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *callback = cc::SingleReleaseCallback::Create( 1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(ReleaseMailbox, current_frame_)); 1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void* SoftwareFrameManager::GetCurrentFramePixels() const { 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(base::SharedMemory::IsHandleValid( 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_->shared_memory_->handle())); 1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return current_frame_->shared_memory_->memory(); 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float SoftwareFrameManager::GetCurrentFrameDeviceScaleFactor() const { 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_frame_->frame_device_scale_factor_; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Size SoftwareFrameManager::GetCurrentFrameSizeInPixels() const { 1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return current_frame_->frame_size_pixels_; 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Size SoftwareFrameManager::GetCurrentFrameSizeInDIP() const { 2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ConvertSizeToDIP(current_frame_->frame_device_scale_factor_, 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_frame_->frame_size_pixels_); 2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::EvictCurrentFrame() { 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DiscardCurrentFrame(); 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (client_) 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) client_->ReleaseReferencesToSoftwareFrame(); 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace content 216