diff options
Diffstat (limited to 'chromium/content/browser/renderer_host/software_frame_manager.cc')
-rw-r--r-- | chromium/content/browser/renderer_host/software_frame_manager.cc | 96 |
1 files changed, 37 insertions, 59 deletions
diff --git a/chromium/content/browser/renderer_host/software_frame_manager.cc b/chromium/content/browser/renderer_host/software_frame_manager.cc index 147c21eab65..08ac5000a14 100644 --- a/chromium/content/browser/renderer_host/software_frame_manager.cc +++ b/chromium/content/browser/renderer_host/software_frame_manager.cc @@ -7,13 +7,16 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/debug/alias.h" +#include "base/numerics/safe_math.h" +#include "cc/resources/shared_bitmap.h" #include "content/browser/renderer_host/dip_util.h" +#include "content/common/host_shared_bitmap_manager.h" #include "content/public/browser/user_metrics.h" namespace { void ReleaseMailbox(scoped_refptr<content::SoftwareFrame> frame, - unsigned sync_point, + uint32 sync_point, bool lost_resource) {} } // namespace @@ -28,13 +31,12 @@ class CONTENT_EXPORT SoftwareFrame : public base::RefCounted<SoftwareFrame> { friend class base::RefCounted<SoftwareFrame>; friend class SoftwareFrameManager; - SoftwareFrame( - base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, - uint32 output_surface_id, - unsigned frame_id, - float frame_device_scale_factor, - gfx::Size frame_size_pixels, - scoped_ptr<base::SharedMemory> shared_memory); + SoftwareFrame(base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client, + uint32 output_surface_id, + unsigned frame_id, + float frame_device_scale_factor, + gfx::Size frame_size_pixels, + scoped_ptr<cc::SharedBitmap> shared_bitmap); ~SoftwareFrame(); base::WeakPtr<SoftwareFrameManagerClient> frame_manager_client_; @@ -42,7 +44,7 @@ class CONTENT_EXPORT SoftwareFrame : public base::RefCounted<SoftwareFrame> { const unsigned frame_id_; float frame_device_scale_factor_; const gfx::Size frame_size_pixels_; - scoped_ptr<base::SharedMemory> shared_memory_; + scoped_ptr<cc::SharedBitmap> shared_bitmap_; DISALLOW_COPY_AND_ASSIGN(SoftwareFrame); }; @@ -53,13 +55,13 @@ SoftwareFrame::SoftwareFrame( unsigned frame_id, float frame_device_scale_factor, gfx::Size frame_size_pixels, - scoped_ptr<base::SharedMemory> shared_memory) + scoped_ptr<cc::SharedBitmap> shared_bitmap) : frame_manager_client_(frame_manager_client), output_surface_id_(output_surface_id), frame_id_(frame_id), frame_device_scale_factor_(frame_device_scale_factor), frame_size_pixels_(frame_size_pixels), - shared_memory_(shared_memory.Pass()) {} + shared_bitmap_(shared_bitmap.Pass()) {} SoftwareFrame::~SoftwareFrame() { if (frame_manager_client_) { @@ -84,50 +86,23 @@ bool SoftwareFrameManager::SwapToNewFrame( const cc::SoftwareFrameData* frame_data, float frame_device_scale_factor, base::ProcessHandle process_handle) { - -#ifdef OS_WIN - scoped_ptr<base::SharedMemory> shared_memory( - new base::SharedMemory(frame_data->handle, true, - process_handle)); -#else - scoped_ptr<base::SharedMemory> shared_memory( - new base::SharedMemory(frame_data->handle, true)); -#endif - - // The NULL handle is used in testing. - if (base::SharedMemory::IsHandleValid(shared_memory->handle())) { - const size_t size_in_bytes = 4 * frame_data->size.GetArea(); -#ifdef OS_WIN - if (!shared_memory->Map(0)) { - DLOG(ERROR) << "Unable to map renderer memory."; - RecordAction( - UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); - return false; - } - - if (shared_memory->mapped_size() < size_in_bytes) { - DLOG(ERROR) << "Shared memory too small for given rectangle"; - RecordAction( - UserMetricsAction("BadMessageTerminate_SharedMemoryManager2")); - return false; - } -#else - if (!shared_memory->Map(size_in_bytes)) { - DLOG(ERROR) << "Unable to map renderer memory."; - RecordAction( - UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); - return false; - } -#endif + scoped_ptr<cc::SharedBitmap> shared_bitmap = + HostSharedBitmapManager::current()->GetSharedBitmapFromId( + frame_data->size, frame_data->bitmap_id); + + if (!shared_bitmap) { + RecordAction( + base::UserMetricsAction("BadMessageTerminate_SharedMemoryManager1")); + return false; } - scoped_refptr<SoftwareFrame> next_frame(new SoftwareFrame( - client_, - output_surface_id, - frame_data->id, - frame_device_scale_factor, - frame_data->size, - shared_memory.Pass())); + scoped_refptr<SoftwareFrame> next_frame( + new SoftwareFrame(client_, + output_surface_id, + frame_data->id, + frame_device_scale_factor, + frame_data->size, + shared_bitmap.Pass())); current_frame_.swap(next_frame); return true; } @@ -150,7 +125,11 @@ void SoftwareFrameManager::SwapToNewFrameComplete(bool visible) { void SoftwareFrameManager::SetVisibility(bool visible) { if (HasCurrentFrame()) { - RendererFrameManager::GetInstance()->SetFrameVisibility(this, visible); + if (visible) { + RendererFrameManager::GetInstance()->LockFrame(this); + } else { + RendererFrameManager::GetInstance()->UnlockFrame(this); + } } } @@ -163,17 +142,16 @@ void SoftwareFrameManager::GetCurrentFrameMailbox( cc::TextureMailbox* mailbox, scoped_ptr<cc::SingleReleaseCallback>* callback) { DCHECK(HasCurrentFrame()); - *mailbox = cc::TextureMailbox( - current_frame_->shared_memory_.get(), current_frame_->frame_size_pixels_); + *mailbox = cc::TextureMailbox(current_frame_->shared_bitmap_->memory(), + current_frame_->frame_size_pixels_); *callback = cc::SingleReleaseCallback::Create( base::Bind(ReleaseMailbox, current_frame_)); } void* SoftwareFrameManager::GetCurrentFramePixels() const { DCHECK(HasCurrentFrame()); - DCHECK(base::SharedMemory::IsHandleValid( - current_frame_->shared_memory_->handle())); - return current_frame_->shared_memory_->memory(); + DCHECK(current_frame_->shared_bitmap_); + return current_frame_->shared_bitmap_->pixels(); } float SoftwareFrameManager::GetCurrentFrameDeviceScaleFactor() const { |