Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 4f719e393a5ed53f7afca5c9b2dd57c1d4c53628..aa5b56543f8c061e4a315f02247eb85f1b25f8fa 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -44,6 +44,7 @@ |
#include "content/common/dom_storage/dom_storage_messages.h" |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
#include "content/common/gpu/client/gpu_channel_host.h" |
+#include "content/common/gpu/client/gpu_memory_buffer_impl.h" |
#include "content/common/gpu/gpu_messages.h" |
#include "content/common/resource_messages.h" |
#include "content/common/view_messages.h" |
@@ -1052,6 +1053,47 @@ void RenderThreadImpl::DeleteImage(int32 image_id, int32 sync_point) { |
NOTREACHED(); |
} |
+scoped_ptr<gfx::GpuMemoryBuffer> RenderThreadImpl::AllocateGpuMemoryBuffer( |
+ size_t width, |
+ size_t height, |
+ unsigned internalformat) { |
+ if (!GpuMemoryBufferImpl::IsFormatValid(internalformat)) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ size_t size = width * height * |
+ GpuMemoryBufferImpl::BytesPerPixel(internalformat); |
+ if (size > static_cast<size_t>(std::numeric_limits<int>::max())) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ gfx::GpuMemoryBufferHandle handle; |
+ bool success; |
+ IPC::Message* message = |
+ new ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer(size, &handle); |
+ |
+ // Allow calling this from the compositor thread. |
+ if (base::MessageLoop::current() == message_loop()) |
+ success = ChildThread::Send(message); |
+ else |
+ success = sync_message_filter()->Send(message); |
+ |
+ if (!success) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ // Currently, shared memory is the only supported buffer type. |
+ if (handle.type != gfx::SHARED_MEMORY_BUFFER) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ if (!base::SharedMemory::IsHandleValid(handle.handle)) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
+ new GpuMemoryBufferImpl( |
+ make_scoped_ptr(new base::SharedMemory(handle.handle, false)), |
+ width, |
+ height, |
+ internalformat)); |
+} |
+ |
void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() { |
suspend_webkit_shared_timer_ = false; |
} |