Index: gpu/ipc/client/gpu_memory_buffer_impl_ozone_native_pixmap.cc |
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_ozone_native_pixmap.cc b/gpu/ipc/client/gpu_memory_buffer_impl_ozone_native_pixmap.cc |
index c676e39d0d5b160c0e7a505da22aafe8d85a8702..c017142f4c6b073bf1dd4991b46c3803c0cad7a4 100644 |
--- a/gpu/ipc/client/gpu_memory_buffer_impl_ozone_native_pixmap.cc |
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_ozone_native_pixmap.cc |
@@ -29,9 +29,13 @@ GpuMemoryBufferImplOzoneNativePixmap::GpuMemoryBufferImplOzoneNativePixmap( |
const gfx::Size& size, |
gfx::BufferFormat format, |
const DestructionCallback& callback, |
- std::unique_ptr<ui::ClientNativePixmap> pixmap) |
+ std::unique_ptr<ui::ClientNativePixmap> pixmap, |
+ const std::vector<std::pair<int, int>>& strides_and_offsets, |
+ base::ScopedFD fd) |
: GpuMemoryBufferImpl(id, size, format, callback), |
pixmap_(std::move(pixmap)), |
+ strides_and_offsets_(strides_and_offsets), |
+ fd_(std::move(fd)), |
data_(nullptr) {} |
GpuMemoryBufferImplOzoneNativePixmap::~GpuMemoryBufferImplOzoneNativePixmap() {} |
@@ -44,12 +48,32 @@ GpuMemoryBufferImplOzoneNativePixmap::CreateFromHandle( |
gfx::BufferFormat format, |
gfx::BufferUsage usage, |
const DestructionCallback& callback) { |
+ DCHECK_EQ(handle.native_pixmap_handle.fds.size(), 1u); |
+ |
+ // GpuMemoryBufferImpl needs the FD to implement GetHandle() but |
+ // ui::ClientNativePixmapFactory::ImportFromHandle is expected to take |
+ // ownership of the FD passed in the handle so we have to dup it here in |
+ // order to pass a valid FD to the GpuMemoryBufferImpl ctor. |
+ base::ScopedFD scoped_fd( |
+ HANDLE_EINTR(dup(handle.native_pixmap_handle.fds[0].fd))); |
+ if (!scoped_fd.is_valid()) { |
+ PLOG(ERROR) << "dup"; |
+ return nullptr; |
+ } |
+ |
+ gfx::NativePixmapHandle native_pixmap_handle; |
+ native_pixmap_handle.fds.emplace_back(handle.native_pixmap_handle.fds[0].fd, |
+ true /* auto_close */); |
+ native_pixmap_handle.strides_and_offsets = |
+ handle.native_pixmap_handle.strides_and_offsets; |
std::unique_ptr<ui::ClientNativePixmap> native_pixmap = |
ui::ClientNativePixmapFactory::GetInstance()->ImportFromHandle( |
- handle.native_pixmap_handle, size, usage); |
+ native_pixmap_handle, size, usage); |
DCHECK(native_pixmap); |
+ |
return base::WrapUnique(new GpuMemoryBufferImplOzoneNativePixmap( |
- handle.id, size, format, callback, std::move(native_pixmap))); |
+ handle.id, size, format, callback, std::move(native_pixmap), |
+ handle.native_pixmap_handle.strides_and_offsets, std::move(scoped_fd))); |
} |
// static |
@@ -112,6 +136,9 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferImplOzoneNativePixmap::GetHandle() |
gfx::GpuMemoryBufferHandle handle; |
handle.type = gfx::OZONE_NATIVE_PIXMAP; |
handle.id = id_; |
+ handle.native_pixmap_handle.fds.emplace_back(fd_.get(), |
+ false /* auto_close */); |
+ handle.native_pixmap_handle.strides_and_offsets = strides_and_offsets_; |
return handle; |
} |