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

Side by Side Diff: ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.cc

Issue 2711933002: Rename ClientNativePixmapFactoryGbm to ClientNativePixmapFactoryDmabuf amd move to ui/gfx (Closed)
Patch Set: Rebase Created 3 years, 10 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/ozone/platform/drm/common/client_native_pixmap_dmabuf.h"
6
7 #include <fcntl.h>
8 #include <linux/version.h>
9 #include <stddef.h>
10 #include <sys/mman.h>
11 #include <xf86drm.h>
12
13 #include "base/memory/ptr_util.h"
14 #include "base/process/memory.h"
15 #include "base/trace_event/trace_event.h"
16
17 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
18 #include <linux/types.h>
19
20 struct local_dma_buf_sync {
21 __u64 flags;
22 };
23
24 #define LOCAL_DMA_BUF_SYNC_READ (1 << 0)
25 #define LOCAL_DMA_BUF_SYNC_WRITE (2 << 0)
26 #define LOCAL_DMA_BUF_SYNC_RW \
27 (LOCAL_DMA_BUF_SYNC_READ | LOCAL_DMA_BUF_SYNC_WRITE)
28 #define LOCAL_DMA_BUF_SYNC_START (0 << 2)
29 #define LOCAL_DMA_BUF_SYNC_END (1 << 2)
30
31 #define LOCAL_DMA_BUF_BASE 'b'
32 #define LOCAL_DMA_BUF_IOCTL_SYNC \
33 _IOW(LOCAL_DMA_BUF_BASE, 0, struct local_dma_buf_sync)
34
35 #else
36 #include <linux/dma-buf.h>
37 #endif
38
39 namespace ui {
40
41 namespace {
42
43 void PrimeSyncStart(int dmabuf_fd) {
44 struct local_dma_buf_sync sync_start = {0};
45
46 sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_RW;
47 if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start))
48 PLOG(ERROR) << "Failed DMA_BUF_SYNC_START";
49 }
50
51 void PrimeSyncEnd(int dmabuf_fd) {
52 struct local_dma_buf_sync sync_end = {0};
53
54 sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_RW;
55 if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end))
56 PLOG(ERROR) << "Failed DMA_BUF_SYNC_END";
57 }
58
59 } // namespace
60
61 // static
62 std::unique_ptr<ClientNativePixmap> ClientNativePixmapDmaBuf::ImportFromDmabuf(
63 const gfx::NativePixmapHandle& handle,
64 const gfx::Size& size) {
65 return base::WrapUnique(new ClientNativePixmapDmaBuf(handle, size));
66 }
67
68 ClientNativePixmapDmaBuf::ClientNativePixmapDmaBuf(
69 const gfx::NativePixmapHandle& handle,
70 const gfx::Size& size)
71 : pixmap_handle_(handle), size_(size), data_{0} {
72 TRACE_EVENT0("drm", "ClientNativePixmapDmaBuf");
73 // TODO(dcastagna): support multiple fds.
74 DCHECK_EQ(1u, handle.fds.size());
75 DCHECK_GE(handle.fds.front().fd, 0);
76 dmabuf_fd_.reset(handle.fds.front().fd);
77
78 DCHECK_GE(handle.planes.back().size, 0u);
79 size_t map_size = handle.planes.back().offset + handle.planes.back().size;
80 data_ = mmap(nullptr, map_size, (PROT_READ | PROT_WRITE), MAP_SHARED,
81 dmabuf_fd_.get(), 0);
82 if (data_ == MAP_FAILED) {
83 PLOG(ERROR) << "Failed mmap().";
84 base::TerminateBecauseOutOfMemory(map_size);
85 }
86 }
87
88 ClientNativePixmapDmaBuf::~ClientNativePixmapDmaBuf() {
89 TRACE_EVENT0("drm", "~ClientNativePixmapDmaBuf");
90 size_t map_size =
91 pixmap_handle_.planes.back().offset + pixmap_handle_.planes.back().size;
92 int ret = munmap(data_, map_size);
93 DCHECK(!ret);
94 }
95
96 bool ClientNativePixmapDmaBuf::Map() {
97 TRACE_EVENT0("drm", "DmaBuf:Map");
98 if (data_ != nullptr) {
99 PrimeSyncStart(dmabuf_fd_.get());
100 return true;
101 }
102 return false;
103 }
104
105 void ClientNativePixmapDmaBuf::Unmap() {
106 TRACE_EVENT0("drm", "DmaBuf:Unmap");
107 PrimeSyncEnd(dmabuf_fd_.get());
108 }
109
110 void* ClientNativePixmapDmaBuf::GetMemoryAddress(size_t plane) const {
111 DCHECK_LT(plane, pixmap_handle_.planes.size());
112 uint8_t* address = reinterpret_cast<uint8_t*>(data_);
113 return address + pixmap_handle_.planes[plane].offset;
114 }
115
116 int ClientNativePixmapDmaBuf::GetStride(size_t plane) const {
117 DCHECK_LT(plane, pixmap_handle_.planes.size());
118 return pixmap_handle_.planes[plane].stride;
119 }
120
121 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698