Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(542)

Unified Diff: ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc

Issue 1841683003: ui/ozone: Flush CPU caches when mapping/unmapping prime pixmap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix spang comments and use local definition for ioctl Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;

Powered by Google App Engine
This is Rietveld 408576698