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