Chromium Code Reviews| Index: ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc |
| diff --git a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc b/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc |
| index 26d123a2a452209637a928aa78f7b07d1d1dd3a9..0ee47192ccfeb548f733cf08e7bbb6526b373460 100644 |
| --- a/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc |
| +++ b/ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc |
| @@ -5,6 +5,25 @@ |
| #include "ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h" |
| #include <fcntl.h> |
| +#if defined(OS_CHROMEOS) |
| +/* |
| + * TODO(vignatti): replace the local definitions below with #include |
| + * <linux/dma-buf.h> once kernel version 4.6 becomes widely used. |
| + */ |
| +#include <linux/types.h> |
| + |
| +struct local_dma_buf_sync { |
| + __u64 flags; |
| +}; |
| + |
| +#define LOCAL_DMA_BUF_SYNC_READ (1 << 0) |
| +#define LOCAL_DMA_BUF_SYNC_WRITE (2 << 0) |
| +#define LOCAL_DMA_BUF_SYNC_START (0 << 2) |
| +#define LOCAL_DMA_BUF_SYNC_END (1 << 2) |
| + |
| +#define LOCAL_DMA_BUF_BASE 'b' |
| +#define LOCAL_DMA_BUF_IOCTL_SYNC _IOW(LOCAL_DMA_BUF_BASE, 0, struct local_dma_buf_sync) |
| +#endif |
|
spang
2016/03/30 21:03:25
Use a C++ style comment and move it below the #inc
vignatti (out of this project)
2016/03/30 21:13:56
Done.
|
| #include <stddef.h> |
| #include <sys/mman.h> |
| #include <xf86drm.h> |
| @@ -14,6 +33,26 @@ |
| namespace ui { |
| +namespace { |
| + |
| +void PrimeSyncStart(int dmabuf_fd) { |
| + struct local_dma_buf_sync sync_start = {0}; |
| + |
| + sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_READ; |
| + if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start)) |
| + PLOG(ERROR) << "fail to sync start dma buf fd"; |
|
spang
2016/03/30 21:03:25
"Failed to" or better yet "Failed DMA_BUF_IOCTL_SY
vignatti (out of this project)
2016/03/30 21:13:56
Done. But I've used "Failed DMA_BUF_SYNC_START" an
|
| +} |
| + |
| +void PrimeSyncEnd(int dmabuf_fd) { |
| + struct local_dma_buf_sync sync_end = {0}; |
| + |
| + sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_WRITE; |
| + if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end)) |
| + PLOG(ERROR) << "fail to sync end dma buf fd"; |
| +} |
| + |
| +} // namespace |
| + |
| // static |
| scoped_ptr<ClientNativePixmap> ClientNativePixmapDmaBuf::ImportFromDmabuf( |
| int dmabuf_fd, |
| @@ -26,7 +65,7 @@ scoped_ptr<ClientNativePixmap> ClientNativePixmapDmaBuf::ImportFromDmabuf( |
| ClientNativePixmapDmaBuf::ClientNativePixmapDmaBuf(int dmabuf_fd, |
| const gfx::Size& size, |
| int stride) |
| - : size_(size), stride_(stride) { |
| + : dmabuf_fd_(dmabuf_fd), size_(size), stride_(stride) { |
| TRACE_EVENT0("drm", "ClientNativePixmapDmaBuf"); |
| size_t map_size = stride_ * size_.height(); |
| data_ = mmap(nullptr, map_size, (PROT_READ | PROT_WRITE), MAP_SHARED, |
| @@ -42,10 +81,15 @@ ClientNativePixmapDmaBuf::~ClientNativePixmapDmaBuf() { |
| } |
| void* ClientNativePixmapDmaBuf::Map() { |
| + TRACE_EVENT0("drm", "DmaBuf:Map"); |
| + PrimeSyncStart(dmabuf_fd_.get()); |
| return data_; |
| } |
| -void ClientNativePixmapDmaBuf::Unmap() {} |
| +void ClientNativePixmapDmaBuf::Unmap() { |
| + TRACE_EVENT0("drm", "DmaBuf:Unmap"); |
| + PrimeSyncEnd(dmabuf_fd_.get()); |
| +} |
| void ClientNativePixmapDmaBuf::GetStride(int* stride) const { |
| *stride = stride_; |