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" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "cc/resources/shared_bitmap.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/host_shared_bitmap_manager.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace { 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ReleaseMailbox(scoped_refptr<content::SoftwareFrame> frame, 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 sync_point, 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool lost_resource) {} 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content { 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// SoftwareFrame 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class CONTENT_EXPORT SoftwareFrame : public base::RefCounted<SoftwareFrame> { 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) friend class base::RefCounted<SoftwareFrame>; 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) friend class SoftwareFrameManager; 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SoftwareFrame(base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint32 output_surface_id, 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned frame_id, 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch float frame_device_scale_factor, 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Size frame_size_pixels, 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<cc::SharedBitmap> shared_bitmap); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ~SoftwareFrame(); 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client_; 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const uint32 output_surface_id_; 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const unsigned frame_id_; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float frame_device_scale_factor_; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gfx::Size frame_size_pixels_; 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<cc::SharedBitmap> shared_bitmap_; 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SoftwareFrame); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrame::SoftwareFrame( 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 output_surface_id, 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsigned frame_id, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float frame_device_scale_factor, 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size frame_size_pixels, 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<cc::SharedBitmap> shared_bitmap) 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : frame_manager_client_(frame_manager_client), 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_surface_id_(output_surface_id), 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_id_(frame_id), 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_device_scale_factor_(frame_device_scale_factor), 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_size_pixels_(frame_size_pixels), 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch shared_bitmap_(shared_bitmap.Pass()) {} 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrame::~SoftwareFrame() { 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (frame_manager_client_) { 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame_manager_client_->SoftwareFrameWasFreed( 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_surface_id_, frame_id_); 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// SoftwareFrameManager 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrameManager::SoftwareFrameManager( 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<SoftwareFrameManagerClient> client) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : client_(client) {} 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SoftwareFrameManager::~SoftwareFrameManager() { 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DiscardCurrentFrame(); 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SoftwareFrameManager::SwapToNewFrame( 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 output_surface_id, 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const cc::SoftwareFrameData* frame_data, 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) float frame_device_scale_factor, 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::ProcessHandle process_handle) { 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<cc::SharedBitmap> shared_bitmap = 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HostSharedBitmapManager::current()->GetSharedBitmapFromId( 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_data->size, frame_data->bitmap_id); 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!shared_bitmap) { 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction( 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<SoftwareFrame> next_frame( 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new SoftwareFrame(client_, 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch output_surface_id, 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_data->id, 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_device_scale_factor, 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_data->size, 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch shared_bitmap.Pass())); 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_.swap(next_frame); 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return true; 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SoftwareFrameManager::HasCurrentFrame() const { 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return current_frame_.get() ? true : false; 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::DiscardCurrentFrame() { 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!HasCurrentFrame()) 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) current_frame_ = NULL; 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RendererFrameManager::GetInstance()->RemoveFrame(this); 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) { 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RendererFrameManager::GetInstance()->AddFrame(this, visible); 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::SetVisibility(bool visible) { 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (HasCurrentFrame()) { 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (visible) { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RendererFrameManager::GetInstance()->LockFrame(this); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RendererFrameManager::GetInstance()->UnlockFrame(this); 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)uint32 SoftwareFrameManager::GetCurrentFrameOutputSurfaceId() const { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_frame_->output_surface_id_; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::GetCurrentFrameMailbox( 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cc::TextureMailbox* mailbox, 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<cc::SingleReleaseCallback>* callback) { 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *mailbox = cc::TextureMailbox(current_frame_->shared_bitmap_->memory(), 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch current_frame_->frame_size_pixels_); 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *callback = cc::SingleReleaseCallback::Create( 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(ReleaseMailbox, current_frame_)); 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void* SoftwareFrameManager::GetCurrentFramePixels() const { 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(current_frame_->shared_bitmap_); 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return current_frame_->shared_bitmap_->pixels(); 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float SoftwareFrameManager::GetCurrentFrameDeviceScaleFactor() const { 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_frame_->frame_device_scale_factor_; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Size SoftwareFrameManager::GetCurrentFrameSizeInPixels() const { 1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return current_frame_->frame_size_pixels_; 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Size SoftwareFrameManager::GetCurrentFrameSizeInDIP() const { 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ConvertSizeToDIP(current_frame_->frame_device_scale_factor_, 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_frame_->frame_size_pixels_); 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SoftwareFrameManager::EvictCurrentFrame() { 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(HasCurrentFrame()); 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DiscardCurrentFrame(); 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (client_) 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) client_->ReleaseReferencesToSoftwareFrame(); 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace content 181