diff options
author | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 04:29:56 +0000 |
---|---|---|
committer | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 04:29:56 +0000 |
commit | f1970084eb384bcc34e34a363d48582aa4151ed8 (patch) | |
tree | 19721446a0b878a1a94be8917c32b26c8e19f45e /content/renderer | |
parent | 713f38789baaa60f453b2bf56782a5077744101b (diff) | |
download | chromium_src-f1970084eb384bcc34e34a363d48582aa4151ed8.zip chromium_src-f1970084eb384bcc34e34a363d48582aa4151ed8.tar.gz chromium_src-f1970084eb384bcc34e34a363d48582aa4151ed8.tar.bz2 |
Use SharedBitmapManager to allocate software frames.
This reduces the number of ways to allocate cross-process bitmaps.
BUG=
Review URL: https://codereview.chromium.org/227703009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262620 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
6 files changed, 32 insertions, 29 deletions
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 587412b..3f9d3af 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc @@ -454,7 +454,8 @@ void BrowserPlugin::OnCompositorFrameSwapped(const IPC::Message& message) { compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), param.b.producing_route_id, param.b.output_surface_id, - param.b.producing_host_id); + param.b.producing_host_id, + param.b.shared_memory_handle); } void BrowserPlugin::OnCopyFromCompositingSurface(int guest_instance_id, diff --git a/content/renderer/child_frame_compositing_helper.cc b/content/renderer/child_frame_compositing_helper.cc index 20779de..10da97d 100644 --- a/content/renderer/child_frame_compositing_helper.cc +++ b/content/renderer/child_frame_compositing_helper.cc @@ -394,7 +394,8 @@ void ChildFrameCompositingHelper::OnCompositorFrameSwapped( scoped_ptr<cc::CompositorFrame> frame, int route_id, uint32 output_surface_id, - int host_id) { + int host_id, + base::SharedMemoryHandle handle) { if (frame->gl_frame_data) { SwapBuffersInfo swap_info; @@ -422,7 +423,7 @@ void ChildFrameCompositingHelper::OnCompositorFrameSwapped( swap_info.software_frame_id = frame_data->id; scoped_ptr<base::SharedMemory> shared_memory( - new base::SharedMemory(frame_data->handle, true)); + new base::SharedMemory(handle, true)); const size_t size_in_bytes = 4 * frame_data->size.GetArea(); if (!shared_memory->Map(size_in_bytes)) { LOG(ERROR) << "Failed to map shared memory of size " << size_in_bytes; diff --git a/content/renderer/child_frame_compositing_helper.h b/content/renderer/child_frame_compositing_helper.h index b440e39..c33083e 100644 --- a/content/renderer/child_frame_compositing_helper.h +++ b/content/renderer/child_frame_compositing_helper.h @@ -10,6 +10,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/shared_memory.h" #include "cc/layers/delegated_frame_resource_collection.h" #include "content/common/content_export.h" #include "gpu/command_buffer/common/mailbox.h" @@ -76,7 +77,8 @@ class CONTENT_EXPORT ChildFrameCompositingHelper void OnCompositorFrameSwapped(scoped_ptr<cc::CompositorFrame> frame, int route_id, uint32 output_surface_id, - int host_id); + int host_id, + base::SharedMemoryHandle handle); void UpdateVisibility(bool); void ChildFrameGone(); diff --git a/content/renderer/gpu/compositor_software_output_device.cc b/content/renderer/gpu/compositor_software_output_device.cc index d1e0293..a8c893b 100644 --- a/content/renderer/gpu/compositor_software_output_device.cc +++ b/content/renderer/gpu/compositor_software_output_device.cc @@ -6,7 +6,9 @@ #include "base/logging.h" #include "cc/output/software_frame_data.h" +#include "content/child/child_shared_bitmap_manager.h" #include "content/renderer/render_process.h" +#include "content/renderer/render_thread_impl.h" #include "third_party/skia/include/core/SkBitmapDevice.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPixelRef.h" @@ -16,12 +18,9 @@ namespace content { CompositorSoftwareOutputDevice::Buffer::Buffer( - unsigned id, scoped_ptr<base::SharedMemory> mem) - : id_(id), - mem_(mem.Pass()), - free_(true), - parent_(NULL) { -} + unsigned id, + scoped_ptr<cc::SharedBitmap> bitmap) + : id_(id), shared_bitmap_(bitmap.Pass()), free_(true), parent_(NULL) {} CompositorSoftwareOutputDevice::Buffer::~Buffer() { } @@ -59,7 +58,8 @@ bool CompositorSoftwareOutputDevice::Buffer::FindDamageDifferenceFrom( CompositorSoftwareOutputDevice::CompositorSoftwareOutputDevice() : current_index_(-1), next_buffer_id_(1), - render_thread_(RenderThread::Get()) { + shared_bitmap_manager_( + RenderThreadImpl::current()->shared_bitmap_manager()) { DetachFromThread(); } @@ -77,13 +77,10 @@ unsigned CompositorSoftwareOutputDevice::GetNextId() { CompositorSoftwareOutputDevice::Buffer* CompositorSoftwareOutputDevice::CreateBuffer() { - const size_t size = 4 * viewport_size_.GetArea(); - scoped_ptr<base::SharedMemory> mem = - render_thread_->HostAllocateSharedMemoryBuffer(size).Pass(); - CHECK(mem); - bool success = mem->Map(size); - CHECK(success); - return new Buffer(GetNextId(), mem.Pass()); + scoped_ptr<cc::SharedBitmap> shared_bitmap = + shared_bitmap_manager_->AllocateSharedBitmap(viewport_size_); + CHECK(shared_bitmap); + return new Buffer(GetNextId(), shared_bitmap.Pass()); } size_t CompositorSoftwareOutputDevice::FindFreeBuffer(size_t hint) { @@ -200,10 +197,7 @@ void CompositorSoftwareOutputDevice::EndPaint( frame_data->id = buffer->id(); frame_data->size = viewport_size_; frame_data->damage_rect = damage_rect_; - frame_data->handle = buffer->handle(); - - CHECK_LE(static_cast<size_t>(frame_data->size.GetArea()) * 4, - buffer->shared_memory()->mapped_size()); + frame_data->bitmap_id = buffer->shared_bitmap_id(); } void CompositorSoftwareOutputDevice::ReclaimSoftwareFrame(unsigned id) { diff --git a/content/renderer/gpu/compositor_software_output_device.h b/content/renderer/gpu/compositor_software_output_device.h index 815cd96..646349a 100644 --- a/content/renderer/gpu/compositor_software_output_device.h +++ b/content/renderer/gpu/compositor_software_output_device.h @@ -10,11 +10,16 @@ #include "base/memory/shared_memory.h" #include "base/threading/non_thread_safe.h" #include "cc/output/software_output_device.h" +#include "cc/resources/shared_bitmap.h" #include "content/public/renderer/render_thread.h" #include "third_party/skia/include/core/SkBitmap.h" class SkRegion; +namespace cc { +class SharedBitmapManager; +} + namespace content { // This class can be created only on the main thread, but then becomes pinned @@ -42,14 +47,13 @@ private: // FindDamageDifferenceFrom). class Buffer { public: - explicit Buffer(unsigned id, scoped_ptr<base::SharedMemory> mem); + explicit Buffer(unsigned id, scoped_ptr<cc::SharedBitmap> bitmap); ~Buffer(); unsigned id() const { return id_; } - void* memory() const { return mem_->memory(); } - base::SharedMemoryHandle handle() const { return mem_->handle(); } - base::SharedMemory* shared_memory() const { return mem_.get(); } + void* memory() const { return shared_bitmap_->pixels(); } + cc::SharedBitmapId shared_bitmap_id() const { return shared_bitmap_->id(); } bool free() const { return free_; } void SetFree(bool free) { free_ = free; } @@ -61,7 +65,7 @@ private: private: const unsigned id_; - scoped_ptr<base::SharedMemory> mem_; + scoped_ptr<cc::SharedBitmap> shared_bitmap_; bool free_; Buffer* parent_; gfx::Rect damage_; @@ -89,7 +93,7 @@ private: unsigned next_buffer_id_; ScopedVector<Buffer> buffers_; ScopedVector<Buffer> awaiting_ack_; - RenderThread* render_thread_; + cc::SharedBitmapManager* shared_bitmap_manager_; }; } // namespace content diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index a0ddeef..2d63fbc 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -897,7 +897,8 @@ void RenderFrameImpl::OnCompositorFrameSwapped(const IPC::Message& message) { compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), param.a.producing_route_id, param.a.output_surface_id, - param.a.producing_host_id); + param.a.producing_host_id, + param.a.shared_memory_handle); } void RenderFrameImpl::OnContextMenuClosed( |