1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/native_pixmap_handle.h"
#include <utility>
#include "base/logging.h"
#include "build/build_config.h"
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
#if !defined(TOOLKIT_QT)
#include <drm_fourcc.h>
#endif
#include "base/posix/eintr_wrapper.h"
#endif
#if defined(OS_FUCHSIA)
#include <lib/zx/vmo.h>
#include "base/fuchsia/fuchsia_logging.h"
#endif
namespace gfx {
#if (defined(OS_LINUX) || defined(OS_CHROMEOS)) && !defined(TOOLKIT_QT)
static_assert(NativePixmapHandle::kNoModifier == DRM_FORMAT_MOD_INVALID,
"gfx::NativePixmapHandle::kNoModifier should be an alias for"
"DRM_FORMAT_MOD_INVALID");
#endif
NativePixmapPlane::NativePixmapPlane() : stride(0), offset(0), size(0) {}
NativePixmapPlane::NativePixmapPlane(int stride,
int offset,
uint64_t size
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
,
base::ScopedFD fd
#elif defined(OS_FUCHSIA)
,
zx::vmo vmo
#endif
)
: stride(stride),
offset(offset),
size(size)
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
,
fd(std::move(fd))
#elif defined(OS_FUCHSIA)
,
vmo(std::move(vmo))
#endif
{
}
NativePixmapPlane::NativePixmapPlane(NativePixmapPlane&& other) = default;
NativePixmapPlane::~NativePixmapPlane() = default;
NativePixmapPlane& NativePixmapPlane::operator=(NativePixmapPlane&& other) =
default;
NativePixmapHandle::NativePixmapHandle() = default;
NativePixmapHandle::NativePixmapHandle(NativePixmapHandle&& other) = default;
NativePixmapHandle::~NativePixmapHandle() = default;
NativePixmapHandle& NativePixmapHandle::operator=(NativePixmapHandle&& other) =
default;
NativePixmapHandle CloneHandleForIPC(const NativePixmapHandle& handle) {
NativePixmapHandle clone;
for (auto& plane : handle.planes) {
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
DCHECK(plane.fd.is_valid());
base::ScopedFD fd_dup(HANDLE_EINTR(dup(plane.fd.get())));
if (!fd_dup.is_valid()) {
PLOG(ERROR) << "dup";
return NativePixmapHandle();
}
clone.planes.emplace_back(plane.stride, plane.offset, plane.size,
std::move(fd_dup));
#elif defined(OS_FUCHSIA)
zx::vmo vmo_dup;
// VMO may be set to NULL for pixmaps that cannot be mapped.
if (plane.vmo) {
zx_status_t status = plane.vmo.duplicate(ZX_RIGHT_SAME_RIGHTS, &vmo_dup);
if (status != ZX_OK) {
ZX_DLOG(ERROR, status) << "zx_handle_duplicate";
return NativePixmapHandle();
}
}
clone.planes.emplace_back(plane.stride, plane.offset, plane.size,
std::move(vmo_dup));
#else
#error Unsupported OS
#endif
}
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
clone.modifier = handle.modifier;
#endif
#if defined(OS_FUCHSIA)
clone.buffer_collection_id = handle.buffer_collection_id;
clone.buffer_index = handle.buffer_index;
clone.ram_coherency = handle.ram_coherency;
#endif
return clone;
}
} // namespace gfx
|