Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 333dc014f9172310cf11a5808f8f01a2a27c515f..491b61e5475d9855b32fa79e98cfcb42d9d2b612 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" |
@@ -1053,6 +1054,44 @@ void RenderThreadImpl::DeleteImage(int32 image_id, int32 sync_point) { |
NOTREACHED(); |
} |
+scoped_ptr<gfx::GpuMemoryBuffer> RenderThreadImpl::AllocateGpuMemoryBuffer( |
+ size_t width, |
+ size_t height, |
+ unsigned internalformat) { |
+ DCHECK(GpuMemoryBufferImpl::IsFormatValid(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>(); |
+ |
+ base::SharedMemoryHandle 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>(); |
+ |
+ if (!base::SharedMemory::IsHandleValid(handle)) |
+ return scoped_ptr<gfx::GpuMemoryBuffer>(); |
+ |
+ return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
+ new GpuMemoryBufferImpl( |
+ make_scoped_ptr(new base::SharedMemory(handle, false)), |
+ width, |
+ height, |
+ internalformat)); |
+} |
+ |
void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() { |
suspend_webkit_shared_timer_ = false; |
} |