summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Stransky <stransky@redhat.com>2022-05-30 21:40:33 +0200
committerMartin Stransky <stransky@redhat.com>2022-05-30 21:40:33 +0200
commit888df264aa7c71281d5c95b521a91a3639bc3ab2 (patch)
treef905eb776af1e2a1d5c62bb70bd2999d05c84019
parentAdded fix for mzbz#1771104 (diff)
downloadlibrewolf-fedora-ff-888df264aa7c71281d5c95b521a91a3639bc3ab2.tar.gz
librewolf-fedora-ff-888df264aa7c71281d5c95b521a91a3639bc3ab2.tar.bz2
librewolf-fedora-ff-888df264aa7c71281d5c95b521a91a3639bc3ab2.zip
Update to 101.0
-rw-r--r--.gitignore2
-rw-r--r--D142373.diff86
-rw-r--r--D145094.diff61
-rw-r--r--D145541.diff21
-rw-r--r--firefox.spec19
-rw-r--r--libwebrtc-screen-cast-sync.patch2957
-rw-r--r--mozilla-1663844.patch33
-rw-r--r--sources4
8 files changed, 1390 insertions, 1793 deletions
diff --git a/.gitignore b/.gitignore
index 9dbb896..9cb84f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -511,3 +511,5 @@ firefox-3.6.4.source.tar.bz2
/firefox-langpacks-100.0.1-20220518.tar.xz
/firefox-100.0.2.source.tar.xz
/firefox-langpacks-100.0.2-20220520.tar.xz
+/firefox-101.0.source.tar.xz
+/firefox-langpacks-101.0-20220530.tar.xz
diff --git a/D142373.diff b/D142373.diff
deleted file mode 100644
index 932cf7a..0000000
--- a/D142373.diff
+++ /dev/null
@@ -1,86 +0,0 @@
-diff --git a/python/mozbuild/mozbuild/build_commands.py b/python/mozbuild/mozbuild/build_commands.py
---- a/python/mozbuild/mozbuild/build_commands.py
-+++ b/python/mozbuild/mozbuild/build_commands.py
-@@ -183,10 +183,11 @@
- directory=directory,
- verbose=verbose,
- keep_going=keep_going,
- mach_context=command_context._mach_context,
- append_env=append_env,
-+ virtualenv_topobjdir=orig_topobjdir,
- )
- if status != 0:
- return status
-
- # Packaging the instrumented build is required to get the jarlog
-@@ -206,11 +207,11 @@
- pgo_env["LLVM_PROFDATA"] = instr.config_environment.substs.get(
- "LLVM_PROFDATA"
- )
- pgo_env["JARLOG_FILE"] = mozpath.join(orig_topobjdir, "jarlog/en-US.log")
- pgo_cmd = [
-- instr.virtualenv_manager.python_path,
-+ command_context.virtualenv_manager.python_path,
- mozpath.join(command_context.topsrcdir, "build/pgo/profileserver.py"),
- ]
- subprocess.check_call(pgo_cmd, cwd=instr.topobjdir, env=pgo_env)
-
- # Set the default build to MOZ_PROFILE_USE
-diff --git a/python/mozbuild/mozbuild/controller/building.py b/python/mozbuild/mozbuild/controller/building.py
---- a/python/mozbuild/mozbuild/controller/building.py
-+++ b/python/mozbuild/mozbuild/controller/building.py
-@@ -1220,10 +1220,11 @@
- directory=None,
- verbose=False,
- keep_going=False,
- mach_context=None,
- append_env=None,
-+ virtualenv_topobjdir=None,
- ):
- """Invoke the build backend.
-
- ``what`` defines the thing to build. If not defined, the default
- target is used.
-@@ -1297,10 +1298,11 @@
- config_rc = self.configure(
- metrics,
- buildstatus_messages=True,
- line_handler=output.on_line,
- append_env=append_env,
-+ virtualenv_topobjdir=virtualenv_topobjdir,
- )
-
- if config_rc != 0:
- return config_rc
-
-@@ -1635,10 +1637,11 @@
- metrics,
- options=None,
- buildstatus_messages=False,
- line_handler=None,
- append_env=None,
-+ virtualenv_topobjdir=None,
- ):
- # Disable indexing in objdir because it is not necessary and can slow
- # down builds.
- self.metrics = metrics
- mkdir(self.topobjdir, not_indexed=True)
-@@ -1658,15 +1661,16 @@
- if line.startswith("export "):
- k, eq, v = line[len("export ") :].partition("=")
- if eq == "=":
- append_env[k] = v
-
-+ virtualenv_topobjdir = virtualenv_topobjdir or self.topobjdir
- build_site = CommandSiteManager.from_environment(
- self.topsrcdir,
- lambda: get_state_dir(specific_to_topsrcdir=True, topsrcdir=self.topsrcdir),
- "build",
-- os.path.join(self.topobjdir, "_virtualenvs"),
-+ os.path.join(virtualenv_topobjdir, "_virtualenvs"),
- )
- build_site.ensure()
-
- command = [build_site.python_path, os.path.join(self.topsrcdir, "configure.py")]
- if options:
-
diff --git a/D145094.diff b/D145094.diff
deleted file mode 100644
index 711acc9..0000000
--- a/D145094.diff
+++ /dev/null
@@ -1,61 +0,0 @@
-diff -up firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp.D145094 firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp
---- firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp.D145094 2022-04-29 01:01:46.000000000 +0200
-+++ firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp 2022-05-03 09:51:48.570471687 +0200
-@@ -23,7 +23,7 @@ RefPtr<layers::Image> VideoFrameSurface<
- VideoFrameSurface<LIBAV_VER>::VideoFrameSurface(DMABufSurface* aSurface)
- : mSurface(aSurface),
- mLib(nullptr),
-- mAVHWDeviceContext(nullptr),
-+ mAVHWFrameContext(nullptr),
- mHWAVBuffer(nullptr) {
- // Create global refcount object to track mSurface usage over
- // gects rendering engine. We can't release it until it's used
-@@ -38,16 +38,22 @@ VideoFrameSurface<LIBAV_VER>::VideoFrame
- void VideoFrameSurface<LIBAV_VER>::LockVAAPIData(
- AVCodecContext* aAVCodecContext, AVFrame* aAVFrame,
- FFmpegLibWrapper* aLib) {
-- FFMPEG_LOG("VideoFrameSurface: VAAPI locking dmabuf surface UID = %d",
-- mSurface->GetUID());
-+ MOZ_DIAGNOSTIC_ASSERT(aAVCodecContext->hw_frames_ctx);
- mLib = aLib;
-- mAVHWDeviceContext = aLib->av_buffer_ref(aAVCodecContext->hw_device_ctx);
-+ mAVHWFrameContext = aLib->av_buffer_ref(aAVCodecContext->hw_frames_ctx);
- mHWAVBuffer = aLib->av_buffer_ref(aAVFrame->buf[0]);
-+ FFMPEG_LOG(
-+ "VideoFrameSurface: VAAPI locking dmabuf surface UID = %d "
-+ "mAVHWFrameContext %p mHWAVBuffer %p",
-+ mSurface->GetUID(), mAVHWFrameContext, mHWAVBuffer);
- }
-
- void VideoFrameSurface<LIBAV_VER>::ReleaseVAAPIData(bool aForFrameRecycle) {
-- FFMPEG_LOG("VideoFrameSurface: VAAPI releasing dmabuf surface UID = %d",
-- mSurface->GetUID());
-+ FFMPEG_LOG(
-+ "VideoFrameSurface: VAAPI releasing dmabuf surface UID = %d "
-+ "aForFrameRecycle %d mLib %p mAVHWFrameContext %p mHWAVBuffer %p",
-+ mSurface->GetUID(), aForFrameRecycle, mLib, mAVHWFrameContext,
-+ mHWAVBuffer);
-
- // It's possible to unref GPU data while IsUsed() is still set.
- // It can happens when VideoFramePool is deleted while decoder shutdown
-@@ -57,7 +63,7 @@ void VideoFrameSurface<LIBAV_VER>::Relea
- // is closed.
- if (mLib) {
- mLib->av_buffer_unref(&mHWAVBuffer);
-- mLib->av_buffer_unref(&mAVHWDeviceContext);
-+ mLib->av_buffer_unref(&mAVHWFrameContext);
- }
-
- // If we want to recycle the frame, make sure it's not used
-diff -up firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h.D145094 firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h
---- firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h.D145094 2022-04-29 00:02:40.000000000 +0200
-+++ firefox-100.0/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h 2022-05-03 09:33:27.110885715 +0200
-@@ -102,7 +102,7 @@ class VideoFrameSurface<LIBAV_VER> {
-
- const RefPtr<DMABufSurface> mSurface;
- const FFmpegLibWrapper* mLib;
-- AVBufferRef* mAVHWDeviceContext;
-+ AVBufferRef* mAVHWFrameContext;
- AVBufferRef* mHWAVBuffer;
- };
-
diff --git a/D145541.diff b/D145541.diff
deleted file mode 100644
index 7ca3a2e..0000000
--- a/D145541.diff
+++ /dev/null
@@ -1,21 +0,0 @@
-diff --git a/widget/gtk/MozContainerWayland.cpp b/widget/gtk/MozContainerWayland.cpp
---- a/widget/gtk/MozContainerWayland.cpp
-+++ b/widget/gtk/MozContainerWayland.cpp
-@@ -527,10 +527,16 @@
- return;
- }
-
- LOGWAYLAND("%s [%p] scale %d\n", __FUNCTION__,
- (void*)moz_container_get_nsWindow(container), scale);
-+ // There is a chance that the attached wl_buffer has not yet been doubled
-+ // on the main thread when scale factor changed to 2. This leads to
-+ // crash with the following message:
-+ // Buffer size (AxB) must be an integer multiple of the buffer_scale (2)
-+ // Removing the possibly wrong wl_buffer to prevent that crash:
-+ wl_surface_attach(wl_container->surface, nullptr, 0, 0);
- wl_surface_set_buffer_scale(wl_container->surface, scale);
- wl_container->buffer_scale = scale;
- }
- }
-
-
diff --git a/firefox.spec b/firefox.spec
index 40f6e66..3206448 100644
--- a/firefox.spec
+++ b/firefox.spec
@@ -124,9 +124,9 @@ ExcludeArch: aarch64
%endif
%if %{?system_nss}
-%global nspr_version 4.26
+%global nspr_version 4.32
%global nspr_build_version %{nspr_version}
-%global nss_version 3.76
+%global nss_version 3.78
%global nss_build_version %{nss_version}
%endif
@@ -162,13 +162,13 @@ ExcludeArch: aarch64
Summary: Mozilla Firefox Web browser
Name: firefox
-Version: 100.0.2
-Release: 2%{?pre_tag}%{?dist}
+Version: 101.0
+Release: 1%{?pre_tag}%{?dist}
URL: https://www.mozilla.org/firefox/
License: MPLv1.1 or GPLv2+ or LGPLv2+
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
%if %{with langpacks}
-Source1: firefox-langpacks-%{version}%{?pre_version}-20220520.tar.xz
+Source1: firefox-langpacks-%{version}%{?pre_version}-20220530.tar.xz
%endif
Source2: cbindgen-vendor.tar.xz
Source10: firefox-mozconfig
@@ -217,7 +217,6 @@ Patch55: firefox-testing.patch
Patch61: firefox-glibc-dynstack.patch
Patch62: build-python.patch
Patch71: 0001-GLIBCXX-fix-for-GCC-12.patch
-Patch72: D142373.diff
Patch73: D147266.diff
Patch74: D147267.diff
@@ -243,8 +242,6 @@ Patch402: mozilla-1196777.patch
Patch407: mozilla-1667096.patch
Patch408: mozilla-1663844.patch
Patch415: mozilla-1670333.patch
-Patch416: D145094.diff
-Patch417: D145541.diff
Patch418: mozilla-1767946-profilemanagersize.patch
# PGO/LTO patches
@@ -463,7 +460,6 @@ This package contains results of tests executed during build.
%patch53 -p1 -b .firefox-gcc-build
%patch54 -p1 -b .1669639
%patch71 -p1 -b .0001-GLIBCXX-fix-for-GCC-12
-%patch72 -p1 -b .D142373
%patch73 -p1 -b .D147266
%patch74 -p1 -b .D147267
@@ -487,8 +483,6 @@ This package contains results of tests executed during build.
%patch407 -p1 -b .1667096
%patch408 -p1 -b .1663844
%patch415 -p1 -b .1670333
-%patch416 -p1 -b .D145094
-%patch417 -p1 -b .D145541
%patch418 -p1 -b .mozilla-1767946-profilemanagersize
# PGO patches
@@ -1063,6 +1057,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
#---------------------------------------------------------------------
%changelog
+* Mon May 30 2022 Martin Stransky <stransky@redhat.com>- 101.0-1
+- Updated to 101.0
+
* Wed May 25 2022 Martin Stransky <stransky@redhat.com>- 100.0.2-2
- Added fix for mzbz#1771104
diff --git a/libwebrtc-screen-cast-sync.patch b/libwebrtc-screen-cast-sync.patch
index 09bfd0f..fab5b5c 100644
--- a/libwebrtc-screen-cast-sync.patch
+++ b/libwebrtc-screen-cast-sync.patch
@@ -1,13 +1,6 @@
-From e0e925da71abb97a60d02716b18faa19a29fada6 Mon Sep 17 00:00:00 2001
-From: Jan Grulich <jgrulich@redhat.com>
-Date: Mon, 21 Feb 2022 15:34:52 +0100
-Subject: WebRTC - screen cast sync
-
-
-diff --git a/dom/media/webrtc/third_party_build/moz.build b/dom/media/webrtc/third_party_build/moz.build
-index e4c7ba7..a42f913 100644
---- a/dom/media/webrtc/third_party_build/moz.build
-+++ b/dom/media/webrtc/third_party_build/moz.build
+diff -up firefox-101.0/dom/media/webrtc/third_party_build/moz.build.libwebrtc-screen-cast-sync firefox-101.0/dom/media/webrtc/third_party_build/moz.build
+--- firefox-101.0/dom/media/webrtc/third_party_build/moz.build.libwebrtc-screen-cast-sync 2022-05-27 01:16:54.000000000 +0200
++++ firefox-101.0/dom/media/webrtc/third_party_build/moz.build 2022-05-30 21:33:19.740522043 +0200
@@ -63,6 +63,8 @@ webrtc_non_unified_sources = [
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
@@ -17,1220 +10,9 @@ index e4c7ba7..a42f913 100644
GN_DIRS += ["../../../../third_party/libwebrtc"]
-diff --git a/third_party/drm/README b/third_party/drm/README
-new file mode 100644
-index 0000000..f68ed10
---- /dev/null
-+++ b/third_party/drm/README
-@@ -0,0 +1,4 @@
-+Libdrm is a drm library wrapper needed to build and run Firefox with
-+Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/drm).
-+
-+libdrm directory stores headers of libdrm needed for build only.
-diff --git a/third_party/drm/drm/drm.h b/third_party/drm/drm/drm.h
-new file mode 100644
-index 0000000..5e54c3a
---- /dev/null
-+++ b/third_party/drm/drm/drm.h
-@@ -0,0 +1,1193 @@
-+/*
-+ * Header for the Direct Rendering Manager
-+ *
-+ * Author: Rickard E. (Rik) Faith <faith@valinux.com>
-+ *
-+ * Acknowledgments:
-+ * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
-+ */
-+
-+/*
-+ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
-+ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
-+ * All rights reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the next
-+ * paragraph) shall be included in all copies or substantial portions of the
-+ * Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef _DRM_H_
-+#define _DRM_H_
-+
-+#if defined(__linux__)
-+
-+#include <linux/types.h>
-+#include <asm/ioctl.h>
-+typedef unsigned int drm_handle_t;
-+
-+#else /* One of the BSDs */
-+
-+#include <stdint.h>
-+#include <sys/ioccom.h>
-+#include <sys/types.h>
-+typedef int8_t __s8;
-+typedef uint8_t __u8;
-+typedef int16_t __s16;
-+typedef uint16_t __u16;
-+typedef int32_t __s32;
-+typedef uint32_t __u32;
-+typedef int64_t __s64;
-+typedef uint64_t __u64;
-+typedef size_t __kernel_size_t;
-+typedef unsigned long drm_handle_t;
-+
-+#endif
-+
-+#if defined(__cplusplus)
-+extern "C" {
-+#endif
-+
-+#define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */
-+#define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */
-+#define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */
-+#define DRM_RAM_PERCENT 10 /**< How much system ram can we lock? */
-+
-+#define _DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */
-+#define _DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */
-+#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD)
-+#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
-+#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
-+
-+typedef unsigned int drm_context_t;
-+typedef unsigned int drm_drawable_t;
-+typedef unsigned int drm_magic_t;
-+
-+/*
-+ * Cliprect.
-+ *
-+ * \warning: If you change this structure, make sure you change
-+ * XF86DRIClipRectRec in the server as well
-+ *
-+ * \note KW: Actually it's illegal to change either for
-+ * backwards-compatibility reasons.
-+ */
-+struct drm_clip_rect {
-+ unsigned short x1;
-+ unsigned short y1;
-+ unsigned short x2;
-+ unsigned short y2;
-+};
-+
-+/*
-+ * Drawable information.
-+ */
-+struct drm_drawable_info {
-+ unsigned int num_rects;
-+ struct drm_clip_rect *rects;
-+};
-+
-+/*
-+ * Texture region,
-+ */
-+struct drm_tex_region {
-+ unsigned char next;
-+ unsigned char prev;
-+ unsigned char in_use;
-+ unsigned char padding;
-+ unsigned int age;
-+};
-+
-+/*
-+ * Hardware lock.
-+ *
-+ * The lock structure is a simple cache-line aligned integer. To avoid
-+ * processor bus contention on a multiprocessor system, there should not be any
-+ * other data stored in the same cache line.
-+ */
-+struct drm_hw_lock {
-+ __volatile__ unsigned int lock; /**< lock variable */
-+ char padding[60]; /**< Pad to cache line */
-+};
-+
-+/*
-+ * DRM_IOCTL_VERSION ioctl argument type.
-+ *
-+ * \sa drmGetVersion().
-+ */
-+struct drm_version {
-+ int version_major; /**< Major version */
-+ int version_minor; /**< Minor version */
-+ int version_patchlevel; /**< Patch level */
-+ __kernel_size_t name_len; /**< Length of name buffer */
-+ char *name; /**< Name of driver */
-+ __kernel_size_t date_len; /**< Length of date buffer */
-+ char *date; /**< User-space buffer to hold date */
-+ __kernel_size_t desc_len; /**< Length of desc buffer */
-+ char *desc; /**< User-space buffer to hold desc */
-+};
-+
-+/*
-+ * DRM_IOCTL_GET_UNIQUE ioctl argument type.
-+ *
-+ * \sa drmGetBusid() and drmSetBusId().
-+ */
-+struct drm_unique {
-+ __kernel_size_t unique_len; /**< Length of unique */
-+ char *unique; /**< Unique name for driver instantiation */
-+};
-+
-+struct drm_list {
-+ int count; /**< Length of user-space structures */
-+ struct drm_version *version;
-+};
-+
-+struct drm_block {
-+ int unused;
-+};
-+
-+/*
-+ * DRM_IOCTL_CONTROL ioctl argument type.
-+ *
-+ * \sa drmCtlInstHandler() and drmCtlUninstHandler().
-+ */
-+struct drm_control {
-+ enum {
-+ DRM_ADD_COMMAND,
-+ DRM_RM_COMMAND,
-+ DRM_INST_HANDLER,
-+ DRM_UNINST_HANDLER
-+ } func;
-+ int irq;
-+};
-+
-+/*
-+ * Type of memory to map.
-+ */
-+enum drm_map_type {
-+ _DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */
-+ _DRM_REGISTERS = 1, /**< no caching, no core dump */
-+ _DRM_SHM = 2, /**< shared, cached */
-+ _DRM_AGP = 3, /**< AGP/GART */
-+ _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
-+ _DRM_CONSISTENT = 5 /**< Consistent memory for PCI DMA */
-+};
-+
-+/*
-+ * Memory mapping flags.
-+ */
-+enum drm_map_flags {
-+ _DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */
-+ _DRM_READ_ONLY = 0x02,
-+ _DRM_LOCKED = 0x04, /**< shared, cached, locked */
-+ _DRM_KERNEL = 0x08, /**< kernel requires access */
-+ _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
-+ _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */
-+ _DRM_REMOVABLE = 0x40, /**< Removable mapping */
-+ _DRM_DRIVER = 0x80 /**< Managed by driver */
-+};
-+
-+struct drm_ctx_priv_map {
-+ unsigned int ctx_id; /**< Context requesting private mapping */
-+ void *handle; /**< Handle of map */
-+};
-+
-+/*
-+ * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
-+ * argument type.
-+ *
-+ * \sa drmAddMap().
-+ */
-+struct drm_map {
-+ unsigned long offset; /**< Requested physical address (0 for SAREA)*/
-+ unsigned long size; /**< Requested physical size (bytes) */
-+ enum drm_map_type type; /**< Type of memory to map */
-+ enum drm_map_flags flags; /**< Flags */
-+ void *handle; /**< User-space: "Handle" to pass to mmap() */
-+ /**< Kernel-space: kernel-virtual address */
-+ int mtrr; /**< MTRR slot used */
-+ /* Private data */
-+};
-+
-+/*
-+ * DRM_IOCTL_GET_CLIENT ioctl argument type.
-+ */
-+struct drm_client {
-+ int idx; /**< Which client desired? */
-+ int auth; /**< Is client authenticated? */
-+ unsigned long pid; /**< Process ID */
-+ unsigned long uid; /**< User ID */
-+ unsigned long magic; /**< Magic */
-+ unsigned long iocs; /**< Ioctl count */
-+};
-+
-+enum drm_stat_type {
-+ _DRM_STAT_LOCK,
-+ _DRM_STAT_OPENS,
-+ _DRM_STAT_CLOSES,
-+ _DRM_STAT_IOCTLS,
-+ _DRM_STAT_LOCKS,
-+ _DRM_STAT_UNLOCKS,
-+ _DRM_STAT_VALUE, /**< Generic value */
-+ _DRM_STAT_BYTE, /**< Generic byte counter (1024bytes/K) */
-+ _DRM_STAT_COUNT, /**< Generic non-byte counter (1000/k) */
-+
-+ _DRM_STAT_IRQ, /**< IRQ */
-+ _DRM_STAT_PRIMARY, /**< Primary DMA bytes */
-+ _DRM_STAT_SECONDARY, /**< Secondary DMA bytes */
-+ _DRM_STAT_DMA, /**< DMA */
-+ _DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */
-+ _DRM_STAT_MISSED /**< Missed DMA opportunity */
-+ /* Add to the *END* of the list */
-+};
-+
-+/*
-+ * DRM_IOCTL_GET_STATS ioctl argument type.
-+ */
-+struct drm_stats {
-+ unsigned long count;
-+ struct {
-+ unsigned long value;
-+ enum drm_stat_type type;
-+ } data[15];
-+};
-+
-+/*
-+ * Hardware locking flags.
-+ */
-+enum drm_lock_flags {
-+ _DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
-+ _DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
-+ _DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
-+ _DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
-+ /* These *HALT* flags aren't supported yet
-+ -- they will be used to support the
-+ full-screen DGA-like mode. */
-+ _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
-+ _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
-+};
-+
-+/*
-+ * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
-+ *
-+ * \sa drmGetLock() and drmUnlock().
-+ */
-+struct drm_lock {
-+ int context;
-+ enum drm_lock_flags flags;
-+};
-+
-+/*
-+ * DMA flags
-+ *
-+ * \warning
-+ * These values \e must match xf86drm.h.
-+ *
-+ * \sa drm_dma.
-+ */
-+enum drm_dma_flags {
-+ /* Flags for DMA buffer dispatch */
-+ _DRM_DMA_BLOCK = 0x01, /**<
-+ * Block until buffer dispatched.
-+ *
-+ * \note The buffer may not yet have
-+ * been processed by the hardware --
-+ * getting a hardware lock with the
-+ * hardware quiescent will ensure
-+ * that the buffer has been
-+ * processed.
-+ */
-+ _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
-+ _DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
-+
-+ /* Flags for DMA buffer request */
-+ _DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
-+ _DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
-+ _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
-+};
-+
-+/*
-+ * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
-+ *
-+ * \sa drmAddBufs().
-+ */
-+struct drm_buf_desc {
-+ int count; /**< Number of buffers of this size */
-+ int size; /**< Size in bytes */
-+ int low_mark; /**< Low water mark */
-+ int high_mark; /**< High water mark */
-+ enum {
-+ _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */
-+ _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */
-+ _DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */
-+ _DRM_FB_BUFFER = 0x08, /**< Buffer is in frame buffer */
-+ _DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */
-+ } flags;
-+ unsigned long agp_start; /**<
-+ * Start address of where the AGP buffers are
-+ * in the AGP aperture
-+ */
-+};
-+
-+/*
-+ * DRM_IOCTL_INFO_BUFS ioctl argument type.
-+ */
-+struct drm_buf_info {
-+ int count; /**< Entries in list */
-+ struct drm_buf_desc *list;
-+};
-+
-+/*
-+ * DRM_IOCTL_FREE_BUFS ioctl argument type.
-+ */
-+struct drm_buf_free {
-+ int count;
-+ int *list;
-+};
-+
-+/*
-+ * Buffer information
-+ *
-+ * \sa drm_buf_map.
-+ */
-+struct drm_buf_pub {
-+ int idx; /**< Index into the master buffer list */
-+ int total; /**< Buffer size */
-+ int used; /**< Amount of buffer in use (for DMA) */
-+ void *address; /**< Address of buffer */
-+};
-+
-+/*
-+ * DRM_IOCTL_MAP_BUFS ioctl argument type.
-+ */
-+struct drm_buf_map {
-+ int count; /**< Length of the buffer list */
-+#ifdef __cplusplus
-+ void *virt;
-+#else
-+ void *virtual; /**< Mmap'd area in user-virtual */
-+#endif
-+ struct drm_buf_pub *list; /**< Buffer information */
-+};
-+
-+/*
-+ * DRM_IOCTL_DMA ioctl argument type.
-+ *
-+ * Indices here refer to the offset into the buffer list in drm_buf_get.
-+ *
-+ * \sa drmDMA().
-+ */
-+struct drm_dma {
-+ int context; /**< Context handle */
-+ int send_count; /**< Number of buffers to send */
-+ int *send_indices; /**< List of handles to buffers */
-+ int *send_sizes; /**< Lengths of data to send */
-+ enum drm_dma_flags flags; /**< Flags */
-+ int request_count; /**< Number of buffers requested */
-+ int request_size; /**< Desired size for buffers */
-+ int *request_indices; /**< Buffer information */
-+ int *request_sizes;
-+ int granted_count; /**< Number of buffers granted */
-+};
-+
-+enum drm_ctx_flags {
-+ _DRM_CONTEXT_PRESERVED = 0x01,
-+ _DRM_CONTEXT_2DONLY = 0x02
-+};
-+
-+/*
-+ * DRM_IOCTL_ADD_CTX ioctl argument type.
-+ *
-+ * \sa drmCreateContext() and drmDestroyContext().
-+ */
-+struct drm_ctx {
-+ drm_context_t handle;
-+ enum drm_ctx_flags flags;
-+};
-+
-+/*
-+ * DRM_IOCTL_RES_CTX ioctl argument type.
-+ */
-+struct drm_ctx_res {
-+ int count;
-+ struct drm_ctx *contexts;
-+};
-+
-+/*
-+ * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
-+ */
-+struct drm_draw {
-+ drm_drawable_t handle;
-+};
-+
-+/*
-+ * DRM_IOCTL_UPDATE_DRAW ioctl argument type.
-+ */
-+typedef enum {
-+ DRM_DRAWABLE_CLIPRECTS
-+} drm_drawable_info_type_t;
-+
-+struct drm_update_draw {
-+ drm_drawable_t handle;
-+ unsigned int type;
-+ unsigned int num;
-+ unsigned long long data;
-+};
-+
-+/*
-+ * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
-+ */
-+struct drm_auth {
-+ drm_magic_t magic;
-+};
-+
-+/*
-+ * DRM_IOCTL_IRQ_BUSID ioctl argument type.
-+ *
-+ * \sa drmGetInterruptFromBusID().
-+ */
-+struct drm_irq_busid {
-+ int irq; /**< IRQ number */
-+ int busnum; /**< bus number */
-+ int devnum; /**< device number */
-+ int funcnum; /**< function number */
-+};
-+
-+enum drm_vblank_seq_type {
-+ _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
-+ _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
-+ /* bits 1-6 are reserved for high crtcs */
-+ _DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
-+ _DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */
-+ _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
-+ _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
-+ _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
-+ _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking, unsupported */
-+};
-+#define _DRM_VBLANK_HIGH_CRTC_SHIFT 1
-+
-+#define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE)
-+#define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \
-+ _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)
-+
-+struct drm_wait_vblank_request {
-+ enum drm_vblank_seq_type type;
-+ unsigned int sequence;
-+ unsigned long signal;
-+};
-+
-+struct drm_wait_vblank_reply {
-+ enum drm_vblank_seq_type type;
-+ unsigned int sequence;
-+ long tval_sec;
-+ long tval_usec;
-+};
-+
-+/*
-+ * DRM_IOCTL_WAIT_VBLANK ioctl argument type.
-+ *
-+ * \sa drmWaitVBlank().
-+ */
-+union drm_wait_vblank {
-+ struct drm_wait_vblank_request request;
-+ struct drm_wait_vblank_reply reply;
-+};
-+
-+#define _DRM_PRE_MODESET 1
-+#define _DRM_POST_MODESET 2
-+
-+/*
-+ * DRM_IOCTL_MODESET_CTL ioctl argument type
-+ *
-+ * \sa drmModesetCtl().
-+ */
-+struct drm_modeset_ctl {
-+ __u32 crtc;
-+ __u32 cmd;
-+};
-+
-+/*
-+ * DRM_IOCTL_AGP_ENABLE ioctl argument type.
-+ *
-+ * \sa drmAgpEnable().
-+ */
-+struct drm_agp_mode {
-+ unsigned long mode; /**< AGP mode */
-+};
-+
-+/*
-+ * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
-+ *
-+ * \sa drmAgpAlloc() and drmAgpFree().
-+ */
-+struct drm_agp_buffer {
-+ unsigned long size; /**< In bytes -- will round to page boundary */
-+ unsigned long handle; /**< Used for binding / unbinding */
-+ unsigned long type; /**< Type of memory to allocate */
-+ unsigned long physical; /**< Physical used by i810 */
-+};
-+
-+/*
-+ * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
-+ *
-+ * \sa drmAgpBind() and drmAgpUnbind().
-+ */
-+struct drm_agp_binding {
-+ unsigned long handle; /**< From drm_agp_buffer */
-+ unsigned long offset; /**< In bytes -- will round to page boundary */
-+};
-+
-+/*
-+ * DRM_IOCTL_AGP_INFO ioctl argument type.
-+ *
-+ * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(),
-+ * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(),
-+ * drmAgpVendorId() and drmAgpDeviceId().
-+ */
-+struct drm_agp_info {
-+ int agp_version_major;
-+ int agp_version_minor;
-+ unsigned long mode;
-+ unsigned long aperture_base; /* physical address */
-+ unsigned long aperture_size; /* bytes */
-+ unsigned long memory_allowed; /* bytes */
-+ unsigned long memory_used;
-+
-+ /* PCI information */
-+ unsigned short id_vendor;
-+ unsigned short id_device;
-+};
-+
-+/*
-+ * DRM_IOCTL_SG_ALLOC ioctl argument type.
-+ */
-+struct drm_scatter_gather {
-+ unsigned long size; /**< In bytes -- will round to page boundary */
-+ unsigned long handle; /**< Used for mapping / unmapping */
-+};
-+
-+/*
-+ * DRM_IOCTL_SET_VERSION ioctl argument type.
-+ */
-+struct drm_set_version {
-+ int drm_di_major;
-+ int drm_di_minor;
-+ int drm_dd_major;
-+ int drm_dd_minor;
-+};
-+
-+/* DRM_IOCTL_GEM_CLOSE ioctl argument type */
-+struct drm_gem_close {
-+ /** Handle of the object to be closed. */
-+ __u32 handle;
-+ __u32 pad;
-+};
-+
-+/* DRM_IOCTL_GEM_FLINK ioctl argument type */
-+struct drm_gem_flink {
-+ /** Handle for the object being named */
-+ __u32 handle;
-+
-+ /** Returned global name */
-+ __u32 name;
-+};
-+
-+/* DRM_IOCTL_GEM_OPEN ioctl argument type */
-+struct drm_gem_open {
-+ /** Name of object being opened */
-+ __u32 name;
-+
-+ /** Returned handle for the object */
-+ __u32 handle;
-+
-+ /** Returned size of the object */
-+ __u64 size;
-+};
-+
-+/**
-+ * DRM_CAP_DUMB_BUFFER
-+ *
-+ * If set to 1, the driver supports creating dumb buffers via the
-+ * &DRM_IOCTL_MODE_CREATE_DUMB ioctl.
-+ */
-+#define DRM_CAP_DUMB_BUFFER 0x1
-+/**
-+ * DRM_CAP_VBLANK_HIGH_CRTC
-+ *
-+ * If set to 1, the kernel supports specifying a :ref:`CRTC index<crtc_index>`
-+ * in the high bits of &drm_wait_vblank_request.type.
-+ *
-+ * Starting kernel version 2.6.39, this capability is always set to 1.
-+ */
-+#define DRM_CAP_VBLANK_HIGH_CRTC 0x2
-+/**
-+ * DRM_CAP_DUMB_PREFERRED_DEPTH
-+ *
-+ * The preferred bit depth for dumb buffers.
-+ *
-+ * The bit depth is the number of bits used to indicate the color of a single
-+ * pixel excluding any padding. This is different from the number of bits per
-+ * pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per
-+ * pixel.
-+ *
-+ * Note that this preference only applies to dumb buffers, it's irrelevant for
-+ * other types of buffers.
-+ */
-+#define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3
-+/**
-+ * DRM_CAP_DUMB_PREFER_SHADOW
-+ *
-+ * If set to 1, the driver prefers userspace to render to a shadow buffer
-+ * instead of directly rendering to a dumb buffer. For best speed, userspace
-+ * should do streaming ordered memory copies into the dumb buffer and never
-+ * read from it.
-+ *
-+ * Note that this preference only applies to dumb buffers, it's irrelevant for
-+ * other types of buffers.
-+ */
-+#define DRM_CAP_DUMB_PREFER_SHADOW 0x4
-+/**
-+ * DRM_CAP_PRIME
-+ *
-+ * Bitfield of supported PRIME sharing capabilities. See &DRM_PRIME_CAP_IMPORT
-+ * and &DRM_PRIME_CAP_EXPORT.
-+ *
-+ * PRIME buffers are exposed as dma-buf file descriptors. See
-+ * Documentation/gpu/drm-mm.rst, section "PRIME Buffer Sharing".
-+ */
-+#define DRM_CAP_PRIME 0x5
-+/**
-+ * DRM_PRIME_CAP_IMPORT
-+ *
-+ * If this bit is set in &DRM_CAP_PRIME, the driver supports importing PRIME
-+ * buffers via the &DRM_IOCTL_PRIME_FD_TO_HANDLE ioctl.
-+ */
-+#define DRM_PRIME_CAP_IMPORT 0x1
-+/**
-+ * DRM_PRIME_CAP_EXPORT
-+ *
-+ * If this bit is set in &DRM_CAP_PRIME, the driver supports exporting PRIME
-+ * buffers via the &DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl.
-+ */
-+#define DRM_PRIME_CAP_EXPORT 0x2
-+/**
-+ * DRM_CAP_TIMESTAMP_MONOTONIC
-+ *
-+ * If set to 0, the kernel will report timestamps with ``CLOCK_REALTIME`` in
-+ * struct drm_event_vblank. If set to 1, the kernel will report timestamps with
-+ * ``CLOCK_MONOTONIC``. See ``clock_gettime(2)`` for the definition of these
-+ * clocks.
-+ *
-+ * Starting from kernel version 2.6.39, the default value for this capability
-+ * is 1. Starting kernel version 4.15, this capability is always set to 1.
-+ */
-+#define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
-+/**
-+ * DRM_CAP_ASYNC_PAGE_FLIP
-+ *
-+ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC.
-+ */
-+#define DRM_CAP_ASYNC_PAGE_FLIP 0x7
-+/**
-+ * DRM_CAP_CURSOR_WIDTH
-+ *
-+ * The ``CURSOR_WIDTH`` and ``CURSOR_HEIGHT`` capabilities return a valid
-+ * width x height combination for the hardware cursor. The intention is that a
-+ * hardware agnostic userspace can query a cursor plane size to use.
-+ *
-+ * Note that the cross-driver contract is to merely return a valid size;
-+ * drivers are free to attach another meaning on top, eg. i915 returns the
-+ * maximum plane size.
-+ */
-+#define DRM_CAP_CURSOR_WIDTH 0x8
-+/**
-+ * DRM_CAP_CURSOR_HEIGHT
-+ *
-+ * See &DRM_CAP_CURSOR_WIDTH.
-+ */
-+#define DRM_CAP_CURSOR_HEIGHT 0x9
-+/**
-+ * DRM_CAP_ADDFB2_MODIFIERS
-+ *
-+ * If set to 1, the driver supports supplying modifiers in the
-+ * &DRM_IOCTL_MODE_ADDFB2 ioctl.
-+ */
-+#define DRM_CAP_ADDFB2_MODIFIERS 0x10
-+/**
-+ * DRM_CAP_PAGE_FLIP_TARGET
-+ *
-+ * If set to 1, the driver supports the &DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE and
-+ * &DRM_MODE_PAGE_FLIP_TARGET_RELATIVE flags in
-+ * &drm_mode_crtc_page_flip_target.flags for the &DRM_IOCTL_MODE_PAGE_FLIP
-+ * ioctl.
-+ */
-+#define DRM_CAP_PAGE_FLIP_TARGET 0x11
-+/**
-+ * DRM_CAP_CRTC_IN_VBLANK_EVENT
-+ *
-+ * If set to 1, the kernel supports reporting the CRTC ID in
-+ * &drm_event_vblank.crtc_id for the &DRM_EVENT_VBLANK and
-+ * &DRM_EVENT_FLIP_COMPLETE events.
-+ *
-+ * Starting kernel version 4.12, this capability is always set to 1.
-+ */
-+#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
-+/**
-+ * DRM_CAP_SYNCOBJ
-+ *
-+ * If set to 1, the driver supports sync objects. See
-+ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
-+ */
-+#define DRM_CAP_SYNCOBJ 0x13
-+/**
-+ * DRM_CAP_SYNCOBJ_TIMELINE
-+ *
-+ * If set to 1, the driver supports timeline operations on sync objects. See
-+ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
-+ */
-+#define DRM_CAP_SYNCOBJ_TIMELINE 0x14
-+
-+/* DRM_IOCTL_GET_CAP ioctl argument type */
-+struct drm_get_cap {
-+ __u64 capability;
-+ __u64 value;
-+};
-+
-+/**
-+ * DRM_CLIENT_CAP_STEREO_3D
-+ *
-+ * If set to 1, the DRM core will expose the stereo 3D capabilities of the
-+ * monitor by advertising the supported 3D layouts in the flags of struct
-+ * drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``.
-+ *
-+ * This capability is always supported for all drivers starting from kernel
-+ * version 3.13.
-+ */
-+#define DRM_CLIENT_CAP_STEREO_3D 1
-+
-+/**
-+ * DRM_CLIENT_CAP_UNIVERSAL_PLANES
-+ *
-+ * If set to 1, the DRM core will expose all planes (overlay, primary, and
-+ * cursor) to userspace.
-+ *
-+ * This capability has been introduced in kernel version 3.15. Starting from
-+ * kernel version 3.17, this capability is always supported for all drivers.
-+ */
-+#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
-+
-+/**
-+ * DRM_CLIENT_CAP_ATOMIC
-+ *
-+ * If set to 1, the DRM core will expose atomic properties to userspace. This
-+ * implicitly enables &DRM_CLIENT_CAP_UNIVERSAL_PLANES and
-+ * &DRM_CLIENT_CAP_ASPECT_RATIO.
-+ *
-+ * If the driver doesn't support atomic mode-setting, enabling this capability
-+ * will fail with -EOPNOTSUPP.
-+ *
-+ * This capability has been introduced in kernel version 4.0. Starting from
-+ * kernel version 4.2, this capability is always supported for atomic-capable
-+ * drivers.
-+ */
-+#define DRM_CLIENT_CAP_ATOMIC 3
-+
-+/**
-+ * DRM_CLIENT_CAP_ASPECT_RATIO
-+ *
-+ * If set to 1, the DRM core will provide aspect ratio information in modes.
-+ * See ``DRM_MODE_FLAG_PIC_AR_*``.
-+ *
-+ * This capability is always supported for all drivers starting from kernel
-+ * version 4.18.
-+ */
-+#define DRM_CLIENT_CAP_ASPECT_RATIO 4
-+
-+/**
-+ * DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
-+ *
-+ * If set to 1, the DRM core will expose special connectors to be used for
-+ * writing back to memory the scene setup in the commit. The client must enable
-+ * &DRM_CLIENT_CAP_ATOMIC first.
-+ *
-+ * This capability is always supported for atomic-capable drivers starting from
-+ * kernel version 4.19.
-+ */
-+#define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
-+
-+/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
-+struct drm_set_client_cap {
-+ __u64 capability;
-+ __u64 value;
-+};
-+
-+#define DRM_RDWR O_RDWR
-+#define DRM_CLOEXEC O_CLOEXEC
-+struct drm_prime_handle {
-+ __u32 handle;
-+
-+ /** Flags.. only applicable for handle->fd */
-+ __u32 flags;
-+
-+ /** Returned dmabuf file descriptor */
-+ __s32 fd;
-+};
-+
-+struct drm_syncobj_create {
-+ __u32 handle;
-+#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
-+ __u32 flags;
-+};
-+
-+struct drm_syncobj_destroy {
-+ __u32 handle;
-+ __u32 pad;
-+};
-+
-+#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
-+#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
-+struct drm_syncobj_handle {
-+ __u32 handle;
-+ __u32 flags;
-+
-+ __s32 fd;
-+ __u32 pad;
-+};
-+
-+struct drm_syncobj_transfer {
-+ __u32 src_handle;
-+ __u32 dst_handle;
-+ __u64 src_point;
-+ __u64 dst_point;
-+ __u32 flags;
-+ __u32 pad;
-+};
-+
-+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
-+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
-+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
-+struct drm_syncobj_wait {
-+ __u64 handles;
-+ /* absolute timeout */
-+ __s64 timeout_nsec;
-+ __u32 count_handles;
-+ __u32 flags;
-+ __u32 first_signaled; /* only valid when not waiting all */
-+ __u32 pad;
-+};
-+
-+struct drm_syncobj_timeline_wait {
-+ __u64 handles;
-+ /* wait on specific timeline point for every handles*/
-+ __u64 points;
-+ /* absolute timeout */
-+ __s64 timeout_nsec;
-+ __u32 count_handles;
-+ __u32 flags;
-+ __u32 first_signaled; /* only valid when not waiting all */
-+ __u32 pad;
-+};
-+
-+
-+struct drm_syncobj_array {
-+ __u64 handles;
-+ __u32 count_handles;
-+ __u32 pad;
-+};
-+
-+#define DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED (1 << 0) /* last available point on timeline syncobj */
-+struct drm_syncobj_timeline_array {
-+ __u64 handles;
-+ __u64 points;
-+ __u32 count_handles;
-+ __u32 flags;
-+};
-+
-+
-+/* Query current scanout sequence number */
-+struct drm_crtc_get_sequence {
-+ __u32 crtc_id; /* requested crtc_id */
-+ __u32 active; /* return: crtc output is active */
-+ __u64 sequence; /* return: most recent vblank sequence */
-+ __s64 sequence_ns; /* return: most recent time of first pixel out */
-+};
-+
-+/* Queue event to be delivered at specified sequence. Time stamp marks
-+ * when the first pixel of the refresh cycle leaves the display engine
-+ * for the display
-+ */
-+#define DRM_CRTC_SEQUENCE_RELATIVE 0x00000001 /* sequence is relative to current */
-+#define DRM_CRTC_SEQUENCE_NEXT_ON_MISS 0x00000002 /* Use next sequence if we've missed */
-+
-+struct drm_crtc_queue_sequence {
-+ __u32 crtc_id;
-+ __u32 flags;
-+ __u64 sequence; /* on input, target sequence. on output, actual sequence */
-+ __u64 user_data; /* user data passed to event */
-+};
-+
-+#if defined(__cplusplus)
-+}
-+#endif
-+
-+#include "drm_mode.h"
-+
-+#if defined(__cplusplus)
-+extern "C" {
-+#endif
-+
-+#define DRM_IOCTL_BASE 'd'
-+#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
-+#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
-+#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
-+
-+#define DRM_IOCTL_VERSION DRM_IOWR(0x00, struct drm_version)
-+#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, struct drm_unique)
-+#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, struct drm_auth)
-+#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, struct drm_irq_busid)
-+#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, struct drm_map)
-+#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client)
-+#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, struct drm_stats)
-+#define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version)
-+#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl)
-+#define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close)
-+#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
-+#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
-+#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap)
-+#define DRM_IOCTL_SET_CLIENT_CAP DRM_IOW( 0x0d, struct drm_set_client_cap)
-+
-+#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
-+#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
-+#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block)
-+#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, struct drm_block)
-+#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, struct drm_control)
-+#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, struct drm_map)
-+#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, struct drm_buf_desc)
-+#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, struct drm_buf_desc)
-+#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, struct drm_buf_info)
-+#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, struct drm_buf_map)
-+#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, struct drm_buf_free)
-+
-+#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, struct drm_map)
-+
-+#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map)
-+#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
-+
-+#define DRM_IOCTL_SET_MASTER DRM_IO(0x1e)
-+#define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f)
-+
-+#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx)
-+#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx)
-+#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx)
-+#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, struct drm_ctx)
-+#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, struct drm_ctx)
-+#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, struct drm_ctx)
-+#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, struct drm_ctx_res)
-+#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, struct drm_draw)
-+#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, struct drm_draw)
-+#define DRM_IOCTL_DMA DRM_IOWR(0x29, struct drm_dma)
-+#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, struct drm_lock)
-+#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
-+#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)
-+
-+#define DRM_IOCTL_PRIME_HANDLE_TO_FD DRM_IOWR(0x2d, struct drm_prime_handle)
-+#define DRM_IOCTL_PRIME_FD_TO_HANDLE DRM_IOWR(0x2e, struct drm_prime_handle)
-+
-+#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
-+#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
-+#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, struct drm_agp_mode)
-+#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, struct drm_agp_info)
-+#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, struct drm_agp_buffer)
-+#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, struct drm_agp_buffer)
-+#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, struct drm_agp_binding)
-+#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, struct drm_agp_binding)
-+
-+#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather)
-+#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, struct drm_scatter_gather)
-+
-+#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
-+
-+#define DRM_IOCTL_CRTC_GET_SEQUENCE DRM_IOWR(0x3b, struct drm_crtc_get_sequence)
-+#define DRM_IOCTL_CRTC_QUEUE_SEQUENCE DRM_IOWR(0x3c, struct drm_crtc_queue_sequence)
-+
-+#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
-+
-+#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
-+#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
-+#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc)
-+#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor)
-+#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
-+#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
-+#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
-+#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
-+#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) /* deprecated (never worked) */
-+#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) /* deprecated (never worked) */
-+
-+#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
-+#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
-+#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob)
-+#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
-+#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
-+/**
-+ * DRM_IOCTL_MODE_RMFB - Remove a framebuffer.
-+ *
-+ * This removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL
-+ * argument is a framebuffer object ID.
-+ *
-+ * Warning: removing a framebuffer currently in-use on an enabled plane will
-+ * disable that plane. The CRTC the plane is linked to may also be disabled
-+ * (depending on driver capabilities).
-+ */
-+#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
-+#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
-+#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
-+
-+#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
-+#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb)
-+#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
-+#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
-+#define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane)
-+#define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane)
-+#define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
-+#define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
-+#define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
-+#define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
-+#define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic)
-+#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)
-+#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
-+
-+#define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create)
-+#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
-+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
-+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
-+#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait)
-+#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
-+#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
-+
-+#define DRM_IOCTL_MODE_CREATE_LEASE DRM_IOWR(0xC6, struct drm_mode_create_lease)
-+#define DRM_IOCTL_MODE_LIST_LESSEES DRM_IOWR(0xC7, struct drm_mode_list_lessees)
-+#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
-+#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
-+
-+#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
-+#define DRM_IOCTL_SYNCOBJ_QUERY DRM_IOWR(0xCB, struct drm_syncobj_timeline_array)
-+#define DRM_IOCTL_SYNCOBJ_TRANSFER DRM_IOWR(0xCC, struct drm_syncobj_transfer)
-+#define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL DRM_IOWR(0xCD, struct drm_syncobj_timeline_array)
-+
-+#define DRM_IOCTL_MODE_GETFB2 DRM_IOWR(0xCE, struct drm_mode_fb_cmd2)
-+
-+/*
-+ * Device specific ioctls should only be in their respective headers
-+ * The device specific ioctl range is from 0x40 to 0x9f.
-+ * Generic IOCTLS restart at 0xA0.
-+ *
-+ * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
-+ * drmCommandReadWrite().
-+ */
-+#define DRM_COMMAND_BASE 0x40
-+#define DRM_COMMAND_END 0xA0
-+
-+/*
-+ * Header for events written back to userspace on the drm fd. The
-+ * type defines the type of event, the length specifies the total
-+ * length of the event (including the header), and user_data is
-+ * typically a 64 bit value passed with the ioctl that triggered the
-+ * event. A read on the drm fd will always only return complete
-+ * events, that is, if for example the read buffer is 100 bytes, and
-+ * there are two 64 byte events pending, only one will be returned.
-+ *
-+ * Event types 0 - 0x7fffffff are generic drm events, 0x80000000 and
-+ * up are chipset specific.
-+ */
-+struct drm_event {
-+ __u32 type;
-+ __u32 length;
-+};
-+
-+#define DRM_EVENT_VBLANK 0x01
-+#define DRM_EVENT_FLIP_COMPLETE 0x02
-+#define DRM_EVENT_CRTC_SEQUENCE 0x03
-+
-+struct drm_event_vblank {
-+ struct drm_event base;
-+ __u64 user_data;
-+ __u32 tv_sec;
-+ __u32 tv_usec;
-+ __u32 sequence;
-+ __u32 crtc_id; /* 0 on older kernels that do not support this */
-+};
-+
-+/* Event delivered at sequence. Time stamp marks when the first pixel
-+ * of the refresh cycle leaves the display engine for the display
-+ */
-+struct drm_event_crtc_sequence {
-+ struct drm_event base;
-+ __u64 user_data;
-+ __s64 time_ns;
-+ __u64 sequence;
-+};
-+
-+/* typedef area */
-+typedef struct drm_clip_rect drm_clip_rect_t;
-+typedef struct drm_drawable_info drm_drawable_info_t;
-+typedef struct drm_tex_region drm_tex_region_t;
-+typedef struct drm_hw_lock drm_hw_lock_t;
-+typedef struct drm_version drm_version_t;
-+typedef struct drm_unique drm_unique_t;
-+typedef struct drm_list drm_list_t;
-+typedef struct drm_block drm_block_t;
-+typedef struct drm_control drm_control_t;
-+typedef enum drm_map_type drm_map_type_t;
-+typedef enum drm_map_flags drm_map_flags_t;
-+typedef struct drm_ctx_priv_map drm_ctx_priv_map_t;
-+typedef struct drm_map drm_map_t;
-+typedef struct drm_client drm_client_t;
-+typedef enum drm_stat_type drm_stat_type_t;
-+typedef struct drm_stats drm_stats_t;
-+typedef enum drm_lock_flags drm_lock_flags_t;
-+typedef struct drm_lock drm_lock_t;
-+typedef enum drm_dma_flags drm_dma_flags_t;
-+typedef struct drm_buf_desc drm_buf_desc_t;
-+typedef struct drm_buf_info drm_buf_info_t;
-+typedef struct drm_buf_free drm_buf_free_t;
-+typedef struct drm_buf_pub drm_buf_pub_t;
-+typedef struct drm_buf_map drm_buf_map_t;
-+typedef struct drm_dma drm_dma_t;
-+typedef union drm_wait_vblank drm_wait_vblank_t;
-+typedef struct drm_agp_mode drm_agp_mode_t;
-+typedef enum drm_ctx_flags drm_ctx_flags_t;
-+typedef struct drm_ctx drm_ctx_t;
-+typedef struct drm_ctx_res drm_ctx_res_t;
-+typedef struct drm_draw drm_draw_t;
-+typedef struct drm_update_draw drm_update_draw_t;
-+typedef struct drm_auth drm_auth_t;
-+typedef struct drm_irq_busid drm_irq_busid_t;
-+typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
-+
-+typedef struct drm_agp_buffer drm_agp_buffer_t;
-+typedef struct drm_agp_binding drm_agp_binding_t;
-+typedef struct drm_agp_info drm_agp_info_t;
-+typedef struct drm_scatter_gather drm_scatter_gather_t;
-+typedef struct drm_set_version drm_set_version_t;
-+
-+#if defined(__cplusplus)
-+}
-+#endif
-+
-+#endif
-diff --git a/third_party/drm/drm/drm_fourcc.h b/third_party/drm/drm/drm_fourcc.h
-new file mode 100644
-index 0000000..4ececa8
---- /dev/null
-+++ b/third_party/drm/drm/drm_fourcc.h
+diff -up firefox-101.0/third_party/drm/drm/drm_fourcc.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/drm/drm_fourcc.h
+--- firefox-101.0/third_party/drm/drm/drm_fourcc.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.741522076 +0200
++++ firefox-101.0/third_party/drm/drm/drm_fourcc.h 2022-05-30 21:33:19.741522076 +0200
@@ -0,0 +1,1377 @@
+/*
+ * Copyright 2011 Intel Corporation
@@ -2609,11 +1391,1206 @@ index 0000000..4ececa8
+#endif
+
+#endif /* DRM_FOURCC_H */
-diff --git a/third_party/drm/drm/drm_mode.h b/third_party/drm/drm/drm_mode.h
-new file mode 100644
-index 0000000..e1e3516
---- /dev/null
-+++ b/third_party/drm/drm/drm_mode.h
+diff -up firefox-101.0/third_party/drm/drm/drm.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/drm/drm.h
+--- firefox-101.0/third_party/drm/drm/drm.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.741522076 +0200
++++ firefox-101.0/third_party/drm/drm/drm.h 2022-05-30 21:33:19.741522076 +0200
+@@ -0,0 +1,1193 @@
++/*
++ * Header for the Direct Rendering Manager
++ *
++ * Author: Rickard E. (Rik) Faith <faith@valinux.com>
++ *
++ * Acknowledgments:
++ * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
++ */
++
++/*
++ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
++ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
++ * All rights reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifndef _DRM_H_
++#define _DRM_H_
++
++#if defined(__linux__)
++
++#include <linux/types.h>
++#include <asm/ioctl.h>
++typedef unsigned int drm_handle_t;
++
++#else /* One of the BSDs */
++
++#include <stdint.h>
++#include <sys/ioccom.h>
++#include <sys/types.h>
++typedef int8_t __s8;
++typedef uint8_t __u8;
++typedef int16_t __s16;
++typedef uint16_t __u16;
++typedef int32_t __s32;
++typedef uint32_t __u32;
++typedef int64_t __s64;
++typedef uint64_t __u64;
++typedef size_t __kernel_size_t;
++typedef unsigned long drm_handle_t;
++
++#endif
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++#define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */
++#define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */
++#define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */
++#define DRM_RAM_PERCENT 10 /**< How much system ram can we lock? */
++
++#define _DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */
++#define _DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */
++#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD)
++#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
++#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
++
++typedef unsigned int drm_context_t;
++typedef unsigned int drm_drawable_t;
++typedef unsigned int drm_magic_t;
++
++/*
++ * Cliprect.
++ *
++ * \warning: If you change this structure, make sure you change
++ * XF86DRIClipRectRec in the server as well
++ *
++ * \note KW: Actually it's illegal to change either for
++ * backwards-compatibility reasons.
++ */
++struct drm_clip_rect {
++ unsigned short x1;
++ unsigned short y1;
++ unsigned short x2;
++ unsigned short y2;
++};
++
++/*
++ * Drawable information.
++ */
++struct drm_drawable_info {
++ unsigned int num_rects;
++ struct drm_clip_rect *rects;
++};
++
++/*
++ * Texture region,
++ */
++struct drm_tex_region {
++ unsigned char next;
++ unsigned char prev;
++ unsigned char in_use;
++ unsigned char padding;
++ unsigned int age;
++};
++
++/*
++ * Hardware lock.
++ *
++ * The lock structure is a simple cache-line aligned integer. To avoid
++ * processor bus contention on a multiprocessor system, there should not be any
++ * other data stored in the same cache line.
++ */
++struct drm_hw_lock {
++ __volatile__ unsigned int lock; /**< lock variable */
++ char padding[60]; /**< Pad to cache line */
++};
++
++/*
++ * DRM_IOCTL_VERSION ioctl argument type.
++ *
++ * \sa drmGetVersion().
++ */
++struct drm_version {
++ int version_major; /**< Major version */
++ int version_minor; /**< Minor version */
++ int version_patchlevel; /**< Patch level */
++ __kernel_size_t name_len; /**< Length of name buffer */
++ char *name; /**< Name of driver */
++ __kernel_size_t date_len; /**< Length of date buffer */
++ char *date; /**< User-space buffer to hold date */
++ __kernel_size_t desc_len; /**< Length of desc buffer */
++ char *desc; /**< User-space buffer to hold desc */
++};
++
++/*
++ * DRM_IOCTL_GET_UNIQUE ioctl argument type.
++ *
++ * \sa drmGetBusid() and drmSetBusId().
++ */
++struct drm_unique {
++ __kernel_size_t unique_len; /**< Length of unique */
++ char *unique; /**< Unique name for driver instantiation */
++};
++
++struct drm_list {
++ int count; /**< Length of user-space structures */
++ struct drm_version *version;
++};
++
++struct drm_block {
++ int unused;
++};
++
++/*
++ * DRM_IOCTL_CONTROL ioctl argument type.
++ *
++ * \sa drmCtlInstHandler() and drmCtlUninstHandler().
++ */
++struct drm_control {
++ enum {
++ DRM_ADD_COMMAND,
++ DRM_RM_COMMAND,
++ DRM_INST_HANDLER,
++ DRM_UNINST_HANDLER
++ } func;
++ int irq;
++};
++
++/*
++ * Type of memory to map.
++ */
++enum drm_map_type {
++ _DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */
++ _DRM_REGISTERS = 1, /**< no caching, no core dump */
++ _DRM_SHM = 2, /**< shared, cached */
++ _DRM_AGP = 3, /**< AGP/GART */
++ _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
++ _DRM_CONSISTENT = 5 /**< Consistent memory for PCI DMA */
++};
++
++/*
++ * Memory mapping flags.
++ */
++enum drm_map_flags {
++ _DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */
++ _DRM_READ_ONLY = 0x02,
++ _DRM_LOCKED = 0x04, /**< shared, cached, locked */
++ _DRM_KERNEL = 0x08, /**< kernel requires access */
++ _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
++ _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */
++ _DRM_REMOVABLE = 0x40, /**< Removable mapping */
++ _DRM_DRIVER = 0x80 /**< Managed by driver */
++};
++
++struct drm_ctx_priv_map {
++ unsigned int ctx_id; /**< Context requesting private mapping */
++ void *handle; /**< Handle of map */
++};
++
++/*
++ * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
++ * argument type.
++ *
++ * \sa drmAddMap().
++ */
++struct drm_map {
++ unsigned long offset; /**< Requested physical address (0 for SAREA)*/
++ unsigned long size; /**< Requested physical size (bytes) */
++ enum drm_map_type type; /**< Type of memory to map */
++ enum drm_map_flags flags; /**< Flags */
++ void *handle; /**< User-space: "Handle" to pass to mmap() */
++ /**< Kernel-space: kernel-virtual address */
++ int mtrr; /**< MTRR slot used */
++ /* Private data */
++};
++
++/*
++ * DRM_IOCTL_GET_CLIENT ioctl argument type.
++ */
++struct drm_client {
++ int idx; /**< Which client desired? */
++ int auth; /**< Is client authenticated? */
++ unsigned long pid; /**< Process ID */
++ unsigned long uid; /**< User ID */
++ unsigned long magic; /**< Magic */
++ unsigned long iocs; /**< Ioctl count */
++};
++
++enum drm_stat_type {
++ _DRM_STAT_LOCK,
++ _DRM_STAT_OPENS,
++ _DRM_STAT_CLOSES,
++ _DRM_STAT_IOCTLS,
++ _DRM_STAT_LOCKS,
++ _DRM_STAT_UNLOCKS,
++ _DRM_STAT_VALUE, /**< Generic value */
++ _DRM_STAT_BYTE, /**< Generic byte counter (1024bytes/K) */
++ _DRM_STAT_COUNT, /**< Generic non-byte counter (1000/k) */
++
++ _DRM_STAT_IRQ, /**< IRQ */
++ _DRM_STAT_PRIMARY, /**< Primary DMA bytes */
++ _DRM_STAT_SECONDARY, /**< Secondary DMA bytes */
++ _DRM_STAT_DMA, /**< DMA */
++ _DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */
++ _DRM_STAT_MISSED /**< Missed DMA opportunity */
++ /* Add to the *END* of the list */
++};
++
++/*
++ * DRM_IOCTL_GET_STATS ioctl argument type.
++ */
++struct drm_stats {
++ unsigned long count;
++ struct {
++ unsigned long value;
++ enum drm_stat_type type;
++ } data[15];
++};
++
++/*
++ * Hardware locking flags.
++ */
++enum drm_lock_flags {
++ _DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
++ _DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
++ _DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
++ _DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
++ /* These *HALT* flags aren't supported yet
++ -- they will be used to support the
++ full-screen DGA-like mode. */
++ _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
++ _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
++};
++
++/*
++ * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
++ *
++ * \sa drmGetLock() and drmUnlock().
++ */
++struct drm_lock {
++ int context;
++ enum drm_lock_flags flags;
++};
++
++/*
++ * DMA flags
++ *
++ * \warning
++ * These values \e must match xf86drm.h.
++ *
++ * \sa drm_dma.
++ */
++enum drm_dma_flags {
++ /* Flags for DMA buffer dispatch */
++ _DRM_DMA_BLOCK = 0x01, /**<
++ * Block until buffer dispatched.
++ *
++ * \note The buffer may not yet have
++ * been processed by the hardware --
++ * getting a hardware lock with the
++ * hardware quiescent will ensure
++ * that the buffer has been
++ * processed.
++ */
++ _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
++ _DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
++
++ /* Flags for DMA buffer request */
++ _DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
++ _DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
++ _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
++};
++
++/*
++ * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
++ *
++ * \sa drmAddBufs().
++ */
++struct drm_buf_desc {
++ int count; /**< Number of buffers of this size */
++ int size; /**< Size in bytes */
++ int low_mark; /**< Low water mark */
++ int high_mark; /**< High water mark */
++ enum {
++ _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */
++ _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */
++ _DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */
++ _DRM_FB_BUFFER = 0x08, /**< Buffer is in frame buffer */
++ _DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */
++ } flags;
++ unsigned long agp_start; /**<
++ * Start address of where the AGP buffers are
++ * in the AGP aperture
++ */
++};
++
++/*
++ * DRM_IOCTL_INFO_BUFS ioctl argument type.
++ */
++struct drm_buf_info {
++ int count; /**< Entries in list */
++ struct drm_buf_desc *list;
++};
++
++/*
++ * DRM_IOCTL_FREE_BUFS ioctl argument type.
++ */
++struct drm_buf_free {
++ int count;
++ int *list;
++};
++
++/*
++ * Buffer information
++ *
++ * \sa drm_buf_map.
++ */
++struct drm_buf_pub {
++ int idx; /**< Index into the master buffer list */
++ int total; /**< Buffer size */
++ int used; /**< Amount of buffer in use (for DMA) */
++ void *address; /**< Address of buffer */
++};
++
++/*
++ * DRM_IOCTL_MAP_BUFS ioctl argument type.
++ */
++struct drm_buf_map {
++ int count; /**< Length of the buffer list */
++#ifdef __cplusplus
++ void *virt;
++#else
++ void *virtual; /**< Mmap'd area in user-virtual */
++#endif
++ struct drm_buf_pub *list; /**< Buffer information */
++};
++
++/*
++ * DRM_IOCTL_DMA ioctl argument type.
++ *
++ * Indices here refer to the offset into the buffer list in drm_buf_get.
++ *
++ * \sa drmDMA().
++ */
++struct drm_dma {
++ int context; /**< Context handle */
++ int send_count; /**< Number of buffers to send */
++ int *send_indices; /**< List of handles to buffers */
++ int *send_sizes; /**< Lengths of data to send */
++ enum drm_dma_flags flags; /**< Flags */
++ int request_count; /**< Number of buffers requested */
++ int request_size; /**< Desired size for buffers */
++ int *request_indices; /**< Buffer information */
++ int *request_sizes;
++ int granted_count; /**< Number of buffers granted */
++};
++
++enum drm_ctx_flags {
++ _DRM_CONTEXT_PRESERVED = 0x01,
++ _DRM_CONTEXT_2DONLY = 0x02
++};
++
++/*
++ * DRM_IOCTL_ADD_CTX ioctl argument type.
++ *
++ * \sa drmCreateContext() and drmDestroyContext().
++ */
++struct drm_ctx {
++ drm_context_t handle;
++ enum drm_ctx_flags flags;
++};
++
++/*
++ * DRM_IOCTL_RES_CTX ioctl argument type.
++ */
++struct drm_ctx_res {
++ int count;
++ struct drm_ctx *contexts;
++};
++
++/*
++ * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
++ */
++struct drm_draw {
++ drm_drawable_t handle;
++};
++
++/*
++ * DRM_IOCTL_UPDATE_DRAW ioctl argument type.
++ */
++typedef enum {
++ DRM_DRAWABLE_CLIPRECTS
++} drm_drawable_info_type_t;
++
++struct drm_update_draw {
++ drm_drawable_t handle;
++ unsigned int type;
++ unsigned int num;
++ unsigned long long data;
++};
++
++/*
++ * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
++ */
++struct drm_auth {
++ drm_magic_t magic;
++};
++
++/*
++ * DRM_IOCTL_IRQ_BUSID ioctl argument type.
++ *
++ * \sa drmGetInterruptFromBusID().
++ */
++struct drm_irq_busid {
++ int irq; /**< IRQ number */
++ int busnum; /**< bus number */
++ int devnum; /**< device number */
++ int funcnum; /**< function number */
++};
++
++enum drm_vblank_seq_type {
++ _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
++ _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
++ /* bits 1-6 are reserved for high crtcs */
++ _DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
++ _DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */
++ _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
++ _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
++ _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
++ _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking, unsupported */
++};
++#define _DRM_VBLANK_HIGH_CRTC_SHIFT 1
++
++#define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE)
++#define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \
++ _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)
++
++struct drm_wait_vblank_request {
++ enum drm_vblank_seq_type type;
++ unsigned int sequence;
++ unsigned long signal;
++};
++
++struct drm_wait_vblank_reply {
++ enum drm_vblank_seq_type type;
++ unsigned int sequence;
++ long tval_sec;
++ long tval_usec;
++};
++
++/*
++ * DRM_IOCTL_WAIT_VBLANK ioctl argument type.
++ *
++ * \sa drmWaitVBlank().
++ */
++union drm_wait_vblank {
++ struct drm_wait_vblank_request request;
++ struct drm_wait_vblank_reply reply;
++};
++
++#define _DRM_PRE_MODESET 1
++#define _DRM_POST_MODESET 2
++
++/*
++ * DRM_IOCTL_MODESET_CTL ioctl argument type
++ *
++ * \sa drmModesetCtl().
++ */
++struct drm_modeset_ctl {
++ __u32 crtc;
++ __u32 cmd;
++};
++
++/*
++ * DRM_IOCTL_AGP_ENABLE ioctl argument type.
++ *
++ * \sa drmAgpEnable().
++ */
++struct drm_agp_mode {
++ unsigned long mode; /**< AGP mode */
++};
++
++/*
++ * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
++ *
++ * \sa drmAgpAlloc() and drmAgpFree().
++ */
++struct drm_agp_buffer {
++ unsigned long size; /**< In bytes -- will round to page boundary */
++ unsigned long handle; /**< Used for binding / unbinding */
++ unsigned long type; /**< Type of memory to allocate */
++ unsigned long physical; /**< Physical used by i810 */
++};
++
++/*
++ * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
++ *
++ * \sa drmAgpBind() and drmAgpUnbind().
++ */
++struct drm_agp_binding {
++ unsigned long handle; /**< From drm_agp_buffer */
++ unsigned long offset; /**< In bytes -- will round to page boundary */
++};
++
++/*
++ * DRM_IOCTL_AGP_INFO ioctl argument type.
++ *
++ * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(),
++ * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(),
++ * drmAgpVendorId() and drmAgpDeviceId().
++ */
++struct drm_agp_info {
++ int agp_version_major;
++ int agp_version_minor;
++ unsigned long mode;
++ unsigned long aperture_base; /* physical address */
++ unsigned long aperture_size; /* bytes */
++ unsigned long memory_allowed; /* bytes */
++ unsigned long memory_used;
++
++ /* PCI information */
++ unsigned short id_vendor;
++ unsigned short id_device;
++};
++
++/*
++ * DRM_IOCTL_SG_ALLOC ioctl argument type.
++ */
++struct drm_scatter_gather {
++ unsigned long size; /**< In bytes -- will round to page boundary */
++ unsigned long handle; /**< Used for mapping / unmapping */
++};
++
++/*
++ * DRM_IOCTL_SET_VERSION ioctl argument type.
++ */
++struct drm_set_version {
++ int drm_di_major;
++ int drm_di_minor;
++ int drm_dd_major;
++ int drm_dd_minor;
++};
++
++/* DRM_IOCTL_GEM_CLOSE ioctl argument type */
++struct drm_gem_close {
++ /** Handle of the object to be closed. */
++ __u32 handle;
++ __u32 pad;
++};
++
++/* DRM_IOCTL_GEM_FLINK ioctl argument type */
++struct drm_gem_flink {
++ /** Handle for the object being named */
++ __u32 handle;
++
++ /** Returned global name */
++ __u32 name;
++};
++
++/* DRM_IOCTL_GEM_OPEN ioctl argument type */
++struct drm_gem_open {
++ /** Name of object being opened */
++ __u32 name;
++
++ /** Returned handle for the object */
++ __u32 handle;
++
++ /** Returned size of the object */
++ __u64 size;
++};
++
++/**
++ * DRM_CAP_DUMB_BUFFER
++ *
++ * If set to 1, the driver supports creating dumb buffers via the
++ * &DRM_IOCTL_MODE_CREATE_DUMB ioctl.
++ */
++#define DRM_CAP_DUMB_BUFFER 0x1
++/**
++ * DRM_CAP_VBLANK_HIGH_CRTC
++ *
++ * If set to 1, the kernel supports specifying a :ref:`CRTC index<crtc_index>`
++ * in the high bits of &drm_wait_vblank_request.type.
++ *
++ * Starting kernel version 2.6.39, this capability is always set to 1.
++ */
++#define DRM_CAP_VBLANK_HIGH_CRTC 0x2
++/**
++ * DRM_CAP_DUMB_PREFERRED_DEPTH
++ *
++ * The preferred bit depth for dumb buffers.
++ *
++ * The bit depth is the number of bits used to indicate the color of a single
++ * pixel excluding any padding. This is different from the number of bits per
++ * pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per
++ * pixel.
++ *
++ * Note that this preference only applies to dumb buffers, it's irrelevant for
++ * other types of buffers.
++ */
++#define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3
++/**
++ * DRM_CAP_DUMB_PREFER_SHADOW
++ *
++ * If set to 1, the driver prefers userspace to render to a shadow buffer
++ * instead of directly rendering to a dumb buffer. For best speed, userspace
++ * should do streaming ordered memory copies into the dumb buffer and never
++ * read from it.
++ *
++ * Note that this preference only applies to dumb buffers, it's irrelevant for
++ * other types of buffers.
++ */
++#define DRM_CAP_DUMB_PREFER_SHADOW 0x4
++/**
++ * DRM_CAP_PRIME
++ *
++ * Bitfield of supported PRIME sharing capabilities. See &DRM_PRIME_CAP_IMPORT
++ * and &DRM_PRIME_CAP_EXPORT.
++ *
++ * PRIME buffers are exposed as dma-buf file descriptors. See
++ * Documentation/gpu/drm-mm.rst, section "PRIME Buffer Sharing".
++ */
++#define DRM_CAP_PRIME 0x5
++/**
++ * DRM_PRIME_CAP_IMPORT
++ *
++ * If this bit is set in &DRM_CAP_PRIME, the driver supports importing PRIME
++ * buffers via the &DRM_IOCTL_PRIME_FD_TO_HANDLE ioctl.
++ */
++#define DRM_PRIME_CAP_IMPORT 0x1
++/**
++ * DRM_PRIME_CAP_EXPORT
++ *
++ * If this bit is set in &DRM_CAP_PRIME, the driver supports exporting PRIME
++ * buffers via the &DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl.
++ */
++#define DRM_PRIME_CAP_EXPORT 0x2
++/**
++ * DRM_CAP_TIMESTAMP_MONOTONIC
++ *
++ * If set to 0, the kernel will report timestamps with ``CLOCK_REALTIME`` in
++ * struct drm_event_vblank. If set to 1, the kernel will report timestamps with
++ * ``CLOCK_MONOTONIC``. See ``clock_gettime(2)`` for the definition of these
++ * clocks.
++ *
++ * Starting from kernel version 2.6.39, the default value for this capability
++ * is 1. Starting kernel version 4.15, this capability is always set to 1.
++ */
++#define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
++/**
++ * DRM_CAP_ASYNC_PAGE_FLIP
++ *
++ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC.
++ */
++#define DRM_CAP_ASYNC_PAGE_FLIP 0x7
++/**
++ * DRM_CAP_CURSOR_WIDTH
++ *
++ * The ``CURSOR_WIDTH`` and ``CURSOR_HEIGHT`` capabilities return a valid
++ * width x height combination for the hardware cursor. The intention is that a
++ * hardware agnostic userspace can query a cursor plane size to use.
++ *
++ * Note that the cross-driver contract is to merely return a valid size;
++ * drivers are free to attach another meaning on top, eg. i915 returns the
++ * maximum plane size.
++ */
++#define DRM_CAP_CURSOR_WIDTH 0x8
++/**
++ * DRM_CAP_CURSOR_HEIGHT
++ *
++ * See &DRM_CAP_CURSOR_WIDTH.
++ */
++#define DRM_CAP_CURSOR_HEIGHT 0x9
++/**
++ * DRM_CAP_ADDFB2_MODIFIERS
++ *
++ * If set to 1, the driver supports supplying modifiers in the
++ * &DRM_IOCTL_MODE_ADDFB2 ioctl.
++ */
++#define DRM_CAP_ADDFB2_MODIFIERS 0x10
++/**
++ * DRM_CAP_PAGE_FLIP_TARGET
++ *
++ * If set to 1, the driver supports the &DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE and
++ * &DRM_MODE_PAGE_FLIP_TARGET_RELATIVE flags in
++ * &drm_mode_crtc_page_flip_target.flags for the &DRM_IOCTL_MODE_PAGE_FLIP
++ * ioctl.
++ */
++#define DRM_CAP_PAGE_FLIP_TARGET 0x11
++/**
++ * DRM_CAP_CRTC_IN_VBLANK_EVENT
++ *
++ * If set to 1, the kernel supports reporting the CRTC ID in
++ * &drm_event_vblank.crtc_id for the &DRM_EVENT_VBLANK and
++ * &DRM_EVENT_FLIP_COMPLETE events.
++ *
++ * Starting kernel version 4.12, this capability is always set to 1.
++ */
++#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
++/**
++ * DRM_CAP_SYNCOBJ
++ *
++ * If set to 1, the driver supports sync objects. See
++ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
++ */
++#define DRM_CAP_SYNCOBJ 0x13
++/**
++ * DRM_CAP_SYNCOBJ_TIMELINE
++ *
++ * If set to 1, the driver supports timeline operations on sync objects. See
++ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
++ */
++#define DRM_CAP_SYNCOBJ_TIMELINE 0x14
++
++/* DRM_IOCTL_GET_CAP ioctl argument type */
++struct drm_get_cap {
++ __u64 capability;
++ __u64 value;
++};
++
++/**
++ * DRM_CLIENT_CAP_STEREO_3D
++ *
++ * If set to 1, the DRM core will expose the stereo 3D capabilities of the
++ * monitor by advertising the supported 3D layouts in the flags of struct
++ * drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``.
++ *
++ * This capability is always supported for all drivers starting from kernel
++ * version 3.13.
++ */
++#define DRM_CLIENT_CAP_STEREO_3D 1
++
++/**
++ * DRM_CLIENT_CAP_UNIVERSAL_PLANES
++ *
++ * If set to 1, the DRM core will expose all planes (overlay, primary, and
++ * cursor) to userspace.
++ *
++ * This capability has been introduced in kernel version 3.15. Starting from
++ * kernel version 3.17, this capability is always supported for all drivers.
++ */
++#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
++
++/**
++ * DRM_CLIENT_CAP_ATOMIC
++ *
++ * If set to 1, the DRM core will expose atomic properties to userspace. This
++ * implicitly enables &DRM_CLIENT_CAP_UNIVERSAL_PLANES and
++ * &DRM_CLIENT_CAP_ASPECT_RATIO.
++ *
++ * If the driver doesn't support atomic mode-setting, enabling this capability
++ * will fail with -EOPNOTSUPP.
++ *
++ * This capability has been introduced in kernel version 4.0. Starting from
++ * kernel version 4.2, this capability is always supported for atomic-capable
++ * drivers.
++ */
++#define DRM_CLIENT_CAP_ATOMIC 3
++
++/**
++ * DRM_CLIENT_CAP_ASPECT_RATIO
++ *
++ * If set to 1, the DRM core will provide aspect ratio information in modes.
++ * See ``DRM_MODE_FLAG_PIC_AR_*``.
++ *
++ * This capability is always supported for all drivers starting from kernel
++ * version 4.18.
++ */
++#define DRM_CLIENT_CAP_ASPECT_RATIO 4
++
++/**
++ * DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
++ *
++ * If set to 1, the DRM core will expose special connectors to be used for
++ * writing back to memory the scene setup in the commit. The client must enable
++ * &DRM_CLIENT_CAP_ATOMIC first.
++ *
++ * This capability is always supported for atomic-capable drivers starting from
++ * kernel version 4.19.
++ */
++#define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
++
++/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
++struct drm_set_client_cap {
++ __u64 capability;
++ __u64 value;
++};
++
++#define DRM_RDWR O_RDWR
++#define DRM_CLOEXEC O_CLOEXEC
++struct drm_prime_handle {
++ __u32 handle;
++
++ /** Flags.. only applicable for handle->fd */
++ __u32 flags;
++
++ /** Returned dmabuf file descriptor */
++ __s32 fd;
++};
++
++struct drm_syncobj_create {
++ __u32 handle;
++#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
++ __u32 flags;
++};
++
++struct drm_syncobj_destroy {
++ __u32 handle;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
++#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
++struct drm_syncobj_handle {
++ __u32 handle;
++ __u32 flags;
++
++ __s32 fd;
++ __u32 pad;
++};
++
++struct drm_syncobj_transfer {
++ __u32 src_handle;
++ __u32 dst_handle;
++ __u64 src_point;
++ __u64 dst_point;
++ __u32 flags;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
++struct drm_syncobj_wait {
++ __u64 handles;
++ /* absolute timeout */
++ __s64 timeout_nsec;
++ __u32 count_handles;
++ __u32 flags;
++ __u32 first_signaled; /* only valid when not waiting all */
++ __u32 pad;
++};
++
++struct drm_syncobj_timeline_wait {
++ __u64 handles;
++ /* wait on specific timeline point for every handles*/
++ __u64 points;
++ /* absolute timeout */
++ __s64 timeout_nsec;
++ __u32 count_handles;
++ __u32 flags;
++ __u32 first_signaled; /* only valid when not waiting all */
++ __u32 pad;
++};
++
++
++struct drm_syncobj_array {
++ __u64 handles;
++ __u32 count_handles;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED (1 << 0) /* last available point on timeline syncobj */
++struct drm_syncobj_timeline_array {
++ __u64 handles;
++ __u64 points;
++ __u32 count_handles;
++ __u32 flags;
++};
++
++
++/* Query current scanout sequence number */
++struct drm_crtc_get_sequence {
++ __u32 crtc_id; /* requested crtc_id */
++ __u32 active; /* return: crtc output is active */
++ __u64 sequence; /* return: most recent vblank sequence */
++ __s64 sequence_ns; /* return: most recent time of first pixel out */
++};
++
++/* Queue event to be delivered at specified sequence. Time stamp marks
++ * when the first pixel of the refresh cycle leaves the display engine
++ * for the display
++ */
++#define DRM_CRTC_SEQUENCE_RELATIVE 0x00000001 /* sequence is relative to current */
++#define DRM_CRTC_SEQUENCE_NEXT_ON_MISS 0x00000002 /* Use next sequence if we've missed */
++
++struct drm_crtc_queue_sequence {
++ __u32 crtc_id;
++ __u32 flags;
++ __u64 sequence; /* on input, target sequence. on output, actual sequence */
++ __u64 user_data; /* user data passed to event */
++};
++
++#if defined(__cplusplus)
++}
++#endif
++
++#include "drm_mode.h"
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++#define DRM_IOCTL_BASE 'd'
++#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
++#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
++#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
++#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
++
++#define DRM_IOCTL_VERSION DRM_IOWR(0x00, struct drm_version)
++#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, struct drm_unique)
++#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, struct drm_auth)
++#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, struct drm_irq_busid)
++#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, struct drm_map)
++#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client)
++#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, struct drm_stats)
++#define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version)
++#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl)
++#define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close)
++#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
++#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
++#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap)
++#define DRM_IOCTL_SET_CLIENT_CAP DRM_IOW( 0x0d, struct drm_set_client_cap)
++
++#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
++#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
++#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block)
++#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, struct drm_block)
++#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, struct drm_control)
++#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, struct drm_map)
++#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, struct drm_buf_desc)
++#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, struct drm_buf_desc)
++#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, struct drm_buf_info)
++#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, struct drm_buf_map)
++#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, struct drm_buf_free)
++
++#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, struct drm_map)
++
++#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map)
++#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
++
++#define DRM_IOCTL_SET_MASTER DRM_IO(0x1e)
++#define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f)
++
++#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx)
++#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx)
++#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx)
++#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, struct drm_ctx)
++#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, struct drm_ctx)
++#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, struct drm_ctx)
++#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, struct drm_ctx_res)
++#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, struct drm_draw)
++#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, struct drm_draw)
++#define DRM_IOCTL_DMA DRM_IOWR(0x29, struct drm_dma)
++#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, struct drm_lock)
++#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
++#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)
++
++#define DRM_IOCTL_PRIME_HANDLE_TO_FD DRM_IOWR(0x2d, struct drm_prime_handle)
++#define DRM_IOCTL_PRIME_FD_TO_HANDLE DRM_IOWR(0x2e, struct drm_prime_handle)
++
++#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
++#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
++#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, struct drm_agp_mode)
++#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, struct drm_agp_info)
++#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, struct drm_agp_buffer)
++#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, struct drm_agp_buffer)
++#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, struct drm_agp_binding)
++#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, struct drm_agp_binding)
++
++#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather)
++#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, struct drm_scatter_gather)
++
++#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
++
++#define DRM_IOCTL_CRTC_GET_SEQUENCE DRM_IOWR(0x3b, struct drm_crtc_get_sequence)
++#define DRM_IOCTL_CRTC_QUEUE_SEQUENCE DRM_IOWR(0x3c, struct drm_crtc_queue_sequence)
++
++#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
++
++#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
++#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
++#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc)
++#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor)
++#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
++#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
++#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
++#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
++#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) /* deprecated (never worked) */
++#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) /* deprecated (never worked) */
++
++#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
++#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
++#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob)
++#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
++#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
++/**
++ * DRM_IOCTL_MODE_RMFB - Remove a framebuffer.
++ *
++ * This removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL
++ * argument is a framebuffer object ID.
++ *
++ * Warning: removing a framebuffer currently in-use on an enabled plane will
++ * disable that plane. The CRTC the plane is linked to may also be disabled
++ * (depending on driver capabilities).
++ */
++#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
++#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
++#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
++
++#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
++#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb)
++#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
++#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
++#define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane)
++#define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane)
++#define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
++#define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
++#define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
++#define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
++#define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic)
++#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)
++#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
++
++#define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create)
++#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
++#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
++#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
++#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait)
++#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
++#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
++
++#define DRM_IOCTL_MODE_CREATE_LEASE DRM_IOWR(0xC6, struct drm_mode_create_lease)
++#define DRM_IOCTL_MODE_LIST_LESSEES DRM_IOWR(0xC7, struct drm_mode_list_lessees)
++#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
++#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
++
++#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
++#define DRM_IOCTL_SYNCOBJ_QUERY DRM_IOWR(0xCB, struct drm_syncobj_timeline_array)
++#define DRM_IOCTL_SYNCOBJ_TRANSFER DRM_IOWR(0xCC, struct drm_syncobj_transfer)
++#define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL DRM_IOWR(0xCD, struct drm_syncobj_timeline_array)
++
++#define DRM_IOCTL_MODE_GETFB2 DRM_IOWR(0xCE, struct drm_mode_fb_cmd2)
++
++/*
++ * Device specific ioctls should only be in their respective headers
++ * The device specific ioctl range is from 0x40 to 0x9f.
++ * Generic IOCTLS restart at 0xA0.
++ *
++ * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
++ * drmCommandReadWrite().
++ */
++#define DRM_COMMAND_BASE 0x40
++#define DRM_COMMAND_END 0xA0
++
++/*
++ * Header for events written back to userspace on the drm fd. The
++ * type defines the type of event, the length specifies the total
++ * length of the event (including the header), and user_data is
++ * typically a 64 bit value passed with the ioctl that triggered the
++ * event. A read on the drm fd will always only return complete
++ * events, that is, if for example the read buffer is 100 bytes, and
++ * there are two 64 byte events pending, only one will be returned.
++ *
++ * Event types 0 - 0x7fffffff are generic drm events, 0x80000000 and
++ * up are chipset specific.
++ */
++struct drm_event {
++ __u32 type;
++ __u32 length;
++};
++
++#define DRM_EVENT_VBLANK 0x01
++#define DRM_EVENT_FLIP_COMPLETE 0x02
++#define DRM_EVENT_CRTC_SEQUENCE 0x03
++
++struct drm_event_vblank {
++ struct drm_event base;
++ __u64 user_data;
++ __u32 tv_sec;
++ __u32 tv_usec;
++ __u32 sequence;
++ __u32 crtc_id; /* 0 on older kernels that do not support this */
++};
++
++/* Event delivered at sequence. Time stamp marks when the first pixel
++ * of the refresh cycle leaves the display engine for the display
++ */
++struct drm_event_crtc_sequence {
++ struct drm_event base;
++ __u64 user_data;
++ __s64 time_ns;
++ __u64 sequence;
++};
++
++/* typedef area */
++typedef struct drm_clip_rect drm_clip_rect_t;
++typedef struct drm_drawable_info drm_drawable_info_t;
++typedef struct drm_tex_region drm_tex_region_t;
++typedef struct drm_hw_lock drm_hw_lock_t;
++typedef struct drm_version drm_version_t;
++typedef struct drm_unique drm_unique_t;
++typedef struct drm_list drm_list_t;
++typedef struct drm_block drm_block_t;
++typedef struct drm_control drm_control_t;
++typedef enum drm_map_type drm_map_type_t;
++typedef enum drm_map_flags drm_map_flags_t;
++typedef struct drm_ctx_priv_map drm_ctx_priv_map_t;
++typedef struct drm_map drm_map_t;
++typedef struct drm_client drm_client_t;
++typedef enum drm_stat_type drm_stat_type_t;
++typedef struct drm_stats drm_stats_t;
++typedef enum drm_lock_flags drm_lock_flags_t;
++typedef struct drm_lock drm_lock_t;
++typedef enum drm_dma_flags drm_dma_flags_t;
++typedef struct drm_buf_desc drm_buf_desc_t;
++typedef struct drm_buf_info drm_buf_info_t;
++typedef struct drm_buf_free drm_buf_free_t;
++typedef struct drm_buf_pub drm_buf_pub_t;
++typedef struct drm_buf_map drm_buf_map_t;
++typedef struct drm_dma drm_dma_t;
++typedef union drm_wait_vblank drm_wait_vblank_t;
++typedef struct drm_agp_mode drm_agp_mode_t;
++typedef enum drm_ctx_flags drm_ctx_flags_t;
++typedef struct drm_ctx drm_ctx_t;
++typedef struct drm_ctx_res drm_ctx_res_t;
++typedef struct drm_draw drm_draw_t;
++typedef struct drm_update_draw drm_update_draw_t;
++typedef struct drm_auth drm_auth_t;
++typedef struct drm_irq_busid drm_irq_busid_t;
++typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
++
++typedef struct drm_agp_buffer drm_agp_buffer_t;
++typedef struct drm_agp_binding drm_agp_binding_t;
++typedef struct drm_agp_info drm_agp_info_t;
++typedef struct drm_scatter_gather drm_scatter_gather_t;
++typedef struct drm_set_version drm_set_version_t;
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif
+diff -up firefox-101.0/third_party/drm/drm/drm_mode.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/drm/drm_mode.h
+--- firefox-101.0/third_party/drm/drm/drm_mode.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.741522076 +0200
++++ firefox-101.0/third_party/drm/drm/drm_mode.h 2022-05-30 21:33:19.741522076 +0200
@@ -0,0 +1,1217 @@
+/*
+ * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
@@ -3832,11 +3809,9 @@ index 0000000..e1e3516
+#endif
+
+#endif
-diff --git a/third_party/drm/drm/xf86drm.h b/third_party/drm/drm/xf86drm.h
-new file mode 100644
-index 0000000..58d66f1
---- /dev/null
-+++ b/third_party/drm/drm/xf86drm.h
+diff -up firefox-101.0/third_party/drm/drm/xf86drm.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/drm/xf86drm.h
+--- firefox-101.0/third_party/drm/drm/xf86drm.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/drm/drm/xf86drm.h 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,966 @@
+/**
+ * \file xf86drm.h
@@ -4804,11 +4779,9 @@ index 0000000..58d66f1
+#endif
+
+#endif
-diff --git a/third_party/drm/libdrm/moz.build b/third_party/drm/libdrm/moz.build
-new file mode 100644
-index 0000000..3b37b91
---- /dev/null
-+++ b/third_party/drm/libdrm/moz.build
+diff -up firefox-101.0/third_party/drm/libdrm/moz.build.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/libdrm/moz.build
+--- firefox-101.0/third_party/drm/libdrm/moz.build.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/drm/libdrm/moz.build 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,16 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
@@ -4826,11 +4799,9 @@ index 0000000..3b37b91
+LOCAL_INCLUDES += ['/third_party/drm']
+
+FINAL_LIBRARY = 'xul'
-diff --git a/third_party/drm/libdrm/mozdrm.cpp b/third_party/drm/libdrm/mozdrm.cpp
-new file mode 100644
-index 0000000..b2fb59b
---- /dev/null
-+++ b/third_party/drm/libdrm/mozdrm.cpp
+diff -up firefox-101.0/third_party/drm/libdrm/mozdrm.cpp.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/libdrm/mozdrm.cpp
+--- firefox-101.0/third_party/drm/libdrm/mozdrm.cpp.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/drm/libdrm/mozdrm.cpp 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,66 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=4:tabstop=4:
@@ -4898,21 +4869,17 @@ index 0000000..b2fb59b
+ }
+ return drmFreeDevices_fn(devices, count);
+}
-diff --git a/third_party/gbm/README b/third_party/gbm/README
-new file mode 100644
-index 0000000..4b6e2e8
---- /dev/null
-+++ b/third_party/gbm/README
+diff -up firefox-101.0/third_party/drm/README.libwebrtc-screen-cast-sync firefox-101.0/third_party/drm/README
+--- firefox-101.0/third_party/drm/README.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.740522043 +0200
++++ firefox-101.0/third_party/drm/README 2022-05-30 21:33:19.740522043 +0200
@@ -0,0 +1,4 @@
-+Libgbm is a gbm library wrapper needed to build and run Firefox with
-+Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/gbm).
++Libdrm is a drm library wrapper needed to build and run Firefox with
++Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/drm).
+
-+libgbm directory stores headers of libgbm needed for build only.
-diff --git a/third_party/gbm/gbm/gbm.h b/third_party/gbm/gbm/gbm.h
-new file mode 100644
-index 0000000..a963ed7
---- /dev/null
-+++ b/third_party/gbm/gbm/gbm.h
++libdrm directory stores headers of libdrm needed for build only.
+diff -up firefox-101.0/third_party/gbm/gbm/gbm.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/gbm/gbm/gbm.h
+--- firefox-101.0/third_party/gbm/gbm/gbm.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/gbm/gbm/gbm.h 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,452 @@
+/*
+ * Copyright © 2011 Intel Corporation
@@ -5366,11 +5333,9 @@ index 0000000..a963ed7
+#endif
+
+#endif
-diff --git a/third_party/gbm/libgbm/moz.build b/third_party/gbm/libgbm/moz.build
-new file mode 100644
-index 0000000..0953d2f
---- /dev/null
-+++ b/third_party/gbm/libgbm/moz.build
+diff -up firefox-101.0/third_party/gbm/libgbm/moz.build.libwebrtc-screen-cast-sync firefox-101.0/third_party/gbm/libgbm/moz.build
+--- firefox-101.0/third_party/gbm/libgbm/moz.build.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/gbm/libgbm/moz.build 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,16 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
@@ -5388,11 +5353,9 @@ index 0000000..0953d2f
+LOCAL_INCLUDES += ['/third_party/gbm']
+
+FINAL_LIBRARY = 'xul'
-diff --git a/third_party/gbm/libgbm/mozgbm.cpp b/third_party/gbm/libgbm/mozgbm.cpp
-new file mode 100644
-index 0000000..bc024a1
---- /dev/null
-+++ b/third_party/gbm/libgbm/mozgbm.cpp
+diff -up firefox-101.0/third_party/gbm/libgbm/mozgbm.cpp.libwebrtc-screen-cast-sync firefox-101.0/third_party/gbm/libgbm/mozgbm.cpp
+--- firefox-101.0/third_party/gbm/libgbm/mozgbm.cpp.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/gbm/libgbm/mozgbm.cpp 2022-05-30 21:33:19.742522110 +0200
@@ -0,0 +1,66 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=4:tabstop=4:
@@ -5460,11 +5423,18 @@ index 0000000..bc024a1
+ }
+ return gbm_device_destroy_fn(gbm);
+}
-diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
-index a5cf923..99cabbf 100644
---- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
-+++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
-@@ -77,6 +77,8 @@ if CONFIG["OS_TARGET"] == "Darwin":
+diff -up firefox-101.0/third_party/gbm/README.libwebrtc-screen-cast-sync firefox-101.0/third_party/gbm/README
+--- firefox-101.0/third_party/gbm/README.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.742522110 +0200
++++ firefox-101.0/third_party/gbm/README 2022-05-30 21:33:19.742522110 +0200
+@@ -0,0 +1,4 @@
++Libgbm is a gbm library wrapper needed to build and run Firefox with
++Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/gbm).
++
++libgbm directory stores headers of libgbm needed for build only.
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build 2022-05-30 21:33:19.742522110 +0200
+@@ -76,6 +76,8 @@ if CONFIG["OS_TARGET"] == "Darwin":
LOCAL_INCLUDES += [
"/media/libyuv/libyuv/include/",
"/media/libyuv/libyuv/include/",
@@ -5473,7 +5443,7 @@ index a5cf923..99cabbf 100644
"/third_party/pipewire/"
]
-@@ -108,7 +110,8 @@ if CONFIG["OS_TARGET"] == "Linux":
+@@ -105,7 +107,8 @@ if CONFIG["OS_TARGET"] == "Linux":
LOCAL_INCLUDES += [
"/media/libyuv/libyuv/include/",
"/media/libyuv/libyuv/include/",
@@ -5483,38 +5453,7 @@ index a5cf923..99cabbf 100644
"/third_party/pipewire/"
]
-@@ -126,15 +129,18 @@ if CONFIG["OS_TARGET"] == "Linux":
- ]
-
- SOURCES += [
-- "/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc"
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc",
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc",
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc",
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc",
-+ "/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc"
- ]
-
- UNIFIED_SOURCES += [
- "/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc",
-- "/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
- "/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_x11.cc",
- "/third_party/libwebrtc/modules/desktop_capture/linux/shared_x_display.cc",
-- "/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc",
- "/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
- "/third_party/libwebrtc/modules/desktop_capture/linux/window_finder_x11.cc",
- "/third_party/libwebrtc/modules/desktop_capture/linux/window_list_utils.cc",
-@@ -162,6 +168,8 @@ if CONFIG["OS_TARGET"] == "OpenBSD":
-
- LOCAL_INCLUDES += [
- "/media/libyuv/libyuv/include/",
-+ "/third_party/drm/",
-+ "/third_party/gbm/",
- "/third_party/pipewire/"
- ]
-
-@@ -177,15 +185,18 @@ if CONFIG["OS_TARGET"] == "OpenBSD":
+@@ -156,15 +159,18 @@ if CONFIG["OS_TARGET"] == "OpenBSD":
]
SOURCES += [
@@ -5536,7 +5475,7 @@ index a5cf923..99cabbf 100644
"/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
"/third_party/libwebrtc/modules/desktop_capture/linux/window_finder_x11.cc",
"/third_party/libwebrtc/modules/desktop_capture/linux/window_list_utils.cc",
-@@ -227,6 +238,7 @@ if CONFIG["OS_TARGET"] == "WINNT":
+@@ -206,6 +212,7 @@ if CONFIG["OS_TARGET"] == "WINNT":
LOCAL_INCLUDES += [
"/media/libyuv/libyuv/include/",
"/media/libyuv/libyuv/include/",
@@ -5544,10 +5483,9 @@ index a5cf923..99cabbf 100644
"/third_party/pipewire/"
]
-diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
-index c89896d..c8ef822 100644
---- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
-+++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc 2022-05-30 21:33:19.742522110 +0200
@@ -14,6 +14,9 @@
#elif defined(WEBRTC_WIN)
#include "modules/desktop_capture/win/full_screen_win_application_handler.h"
@@ -5558,7 +5496,7 @@ index c89896d..c8ef822 100644
namespace webrtc {
-@@ -35,6 +38,9 @@ DesktopCaptureOptions DesktopCaptureOptions::CreateDefault() {
+@@ -35,6 +38,9 @@ DesktopCaptureOptions DesktopCaptureOpti
#if defined(WEBRTC_USE_X11)
result.set_x_display(SharedXDisplay::CreateDefault());
#endif
@@ -5568,10 +5506,9 @@ index c89896d..c8ef822 100644
#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
result.set_configuration_monitor(new DesktopConfigurationMonitor());
result.set_full_screen_window_detector(
-diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
-index ee0dd3a..ac56c8c 100644
---- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
-+++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h.libwebrtc-screen-cast-sync 2022-05-27 01:17:04.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h 2022-05-30 21:33:19.743522143 +0200
@@ -17,6 +17,10 @@
#include "modules/desktop_capture/linux/shared_x_display.h"
#endif
@@ -5611,10 +5548,9 @@ index ee0dd3a..ac56c8c 100644
#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor_;
bool allow_iosurface_ = false;
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
-index 2fd3b1a..e4685fc 100644
---- a/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc 2022-05-30 21:33:19.743522143 +0200
@@ -10,937 +10,67 @@
#include "modules/desktop_capture/linux/base_capturer_pipewire.h"
@@ -5718,12 +5654,8 @@ index 2fd3b1a..e4685fc 100644
- case PW_STREAM_STATE_CONNECTING:
- break;
- }
-+BaseCapturerPipeWire::BaseCapturerPipeWire(const DesktopCaptureOptions& options)
-+ : options_(options) {
-+ screencast_portal_ = std::make_unique<ScreenCastPortal>(
-+ ScreenCastPortal::CaptureSourceType::kAnyScreenContent, this);
- }
-
+-}
+-
-// static
-void BaseCapturerPipeWire::OnStreamParamChanged(void *data, uint32_t id,
- const struct spa_pod *format) {
@@ -5777,8 +5709,7 @@ index 2fd3b1a..e4685fc 100644
-
- struct pw_buffer *next_buffer;
- struct pw_buffer *buffer = nullptr;
-+BaseCapturerPipeWire::~BaseCapturerPipeWire() {}
-
+-
- next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
- while (next_buffer) {
- buffer = next_buffer;
@@ -5791,23 +5722,13 @@ index 2fd3b1a..e4685fc 100644
-
- if (!buffer) {
- return;
-+void BaseCapturerPipeWire::OnScreenCastRequestResult(
-+ ScreenCastPortal::RequestResponse result,
-+ uint32_t stream_node_id,
-+ int fd) {
-+ if (result != ScreenCastPortal::RequestResponse::kSuccess ||
-+ !options_.screencast_stream()->StartScreenCastStream(stream_node_id,
-+ fd)) {
-+ capturer_failed_ = true;
-+ RTC_LOG(LS_ERROR) << "ScreenCastPortal failed: "
-+ << static_cast<uint>(result);
- }
+- }
-
- that->HandleBuffer(buffer);
-
- pw_stream_queue_buffer(that->pw_stream_, buffer);
- }
-
+-}
+-
-BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type)
- : capture_source_type_(source_type) {}
-
@@ -5830,10 +5751,7 @@ index 2fd3b1a..e4685fc 100644
-
- if (pw_main_loop_) {
- pw_thread_loop_destroy(pw_main_loop_);
-+void BaseCapturerPipeWire::OnScreenCastSessionClosed() {
-+ if (!capturer_failed_) {
-+ options_.screencast_stream()->StopScreenCastStream();
- }
+- }
-
- if (start_request_signal_id_) {
- g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_);
@@ -5877,7 +5795,25 @@ index 2fd3b1a..e4685fc 100644
- if (proxy_) {
- g_object_unref(proxy_);
- proxy_ = nullptr;
-- }
++BaseCapturerPipeWire::BaseCapturerPipeWire(const DesktopCaptureOptions& options)
++ : options_(options) {
++ screencast_portal_ = std::make_unique<ScreenCastPortal>(
++ ScreenCastPortal::CaptureSourceType::kAnyScreenContent, this);
++}
++
++BaseCapturerPipeWire::~BaseCapturerPipeWire() {}
++
++void BaseCapturerPipeWire::OnScreenCastRequestResult(
++ ScreenCastPortal::RequestResponse result,
++ uint32_t stream_node_id,
++ int fd) {
++ if (result != ScreenCastPortal::RequestResponse::kSuccess ||
++ !options_.screencast_stream()->StartScreenCastStream(stream_node_id,
++ fd)) {
++ capturer_failed_ = true;
++ RTC_LOG(LS_ERROR) << "ScreenCastPortal failed: "
++ << static_cast<uint>(result);
+ }
-
- if (pw_fd_ != -1) {
- close(pw_fd_);
@@ -5980,17 +5916,20 @@ index 2fd3b1a..e4685fc 100644
- }
-
- return stream;
--}
--
+ }
+
-static void SpaBufferUnmap(unsigned char *map, int map_size, bool IsDMABuf, int fd) {
- if (map) {
- if (IsDMABuf) {
- SyncDmaBuf(fd, DMA_BUF_SYNC_END);
- }
- munmap(map, map_size);
-- }
--}
--
++void BaseCapturerPipeWire::OnScreenCastSessionClosed() {
++ if (!capturer_failed_) {
++ options_.screencast_stream()->StopScreenCastStream();
+ }
+ }
+
-void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
- spa_buffer* spaBuffer = buffer->buffer;
- uint8_t *map = nullptr;
@@ -6527,8 +6466,8 @@ index 2fd3b1a..e4685fc 100644
- g_object_unref(outlist);
-
- that->InitPipeWire();
- }
-
+-}
+-
void BaseCapturerPipeWire::Start(Callback* callback) {
RTC_DCHECK(!callback_);
RTC_DCHECK(callback);
@@ -6580,7 +6519,7 @@ index 2fd3b1a..e4685fc 100644
}
// Keep in sync with defines at browser/actors/WebRTCParent.jsm
-@@ -953,31 +83,13 @@ void BaseCapturerPipeWire::CaptureFrame() {
+@@ -953,31 +83,13 @@ void BaseCapturerPipeWire::CaptureFrame(
#define PIPEWIRE_NAME "####_PIPEWIRE_PORTAL_####"
bool BaseCapturerPipeWire::GetSourceList(SourceList* sources) {
@@ -6613,10 +6552,9 @@ index 2fd3b1a..e4685fc 100644
-}
-
} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
-index af8e20c..5db09e0 100644
---- a/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/base_capturer_pipewire.h 2022-05-30 21:33:19.743522143 +0200
@@ -11,160 +11,39 @@
#ifndef MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_
#define MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_
@@ -6793,11 +6731,9 @@ index af8e20c..5db09e0 100644
};
} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs b/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs
-new file mode 100644
-index 0000000..226979f
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.743522143 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/drm.sigs 2022-05-30 21:33:19.743522143 +0200
@@ -0,0 +1,11 @@
+// Copyright 2021 The WebRTC project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
@@ -6810,11 +6746,9 @@ index 0000000..226979f
+// xf86drm.h
+int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices);
+void drmFreeDevices(drmDevicePtr devices[], int count);
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc b/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc
-new file mode 100644
-index 0000000..de63c2a
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.743522143 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.cc 2022-05-30 21:33:19.743522143 +0200
@@ -0,0 +1,695 @@
+/*
+ * Copyright 2021 The WebRTC project authors. All Rights Reserved.
@@ -7511,11 +7445,9 @@ index 0000000..de63c2a
+}
+
+} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h b/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h
-new file mode 100644
-index 0000000..b755d8b
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.743522143 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/egl_dmabuf.h 2022-05-30 21:33:19.743522143 +0200
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 The WebRTC project authors. All Rights Reserved.
@@ -7585,11 +7517,9 @@ index 0000000..b755d8b
+} // namespace webrtc
+
+#endif // MODULES_DESKTOP_CAPTURE_LINUX_EGL_DMABUF_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc b/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc
-new file mode 100644
-index 0000000..09dea24
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.743522143 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.cc 2022-05-30 21:33:19.743522143 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
@@ -7647,11 +7577,9 @@ index 0000000..09dea24
+}
+
+} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h b/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h
-new file mode 100644
-index 0000000..9b9ccf7
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.743522143 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_pipewire.h 2022-05-30 21:33:19.743522143 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -7694,10 +7622,9 @@ index 0000000..9b9ccf7
+} // namespace webrtc
+
+#endif // MODULES_DESKTOP_CAPTURE_LINUX_MOUSE_CURSOR_MONITOR_PIPEWIRE_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs b/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs
-index 3e21e9d..06a97b8 100644
---- a/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire.sigs 2022-05-30 21:33:19.743522143 +0200
@@ -7,38 +7,44 @@
//------------------------------------------------
@@ -7757,21 +7684,18 @@ index 3e21e9d..06a97b8 100644
+pw_context *pw_context_new(pw_loop *main_loop, pw_properties *props, size_t user_data_size);
+pw_core * pw_context_connect(pw_context *context, pw_properties *properties, size_t user_data_size);
+pw_core * pw_context_connect_fd(pw_context *context, int fd, pw_properties *properties, size_t user_data_size);
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment b/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment
-index 9d7dbd2..06ae18d 100644
---- a/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/pipewire_stub_header.fragment 2022-05-30 21:33:19.744522177 +0200
@@ -5,4 +5,5 @@ extern "C" {
#include <pipewire/pipewire.h>
+#include <xf86drm.h>
}
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc b/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc
-new file mode 100644
-index 0000000..51ca57a
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.cc 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -7830,11 +7754,9 @@ index 0000000..51ca57a
+}
+
+} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h b/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h
-new file mode 100644
-index 0000000..bf77855
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/scoped_glib.h 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -7901,84 +7823,11 @@ index 0000000..bf77855
+} // namespace webrtc
+
+#endif // MODULES_DESKTOP_CAPTURE_LINUX_SCOPED_GLIB_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
-deleted file mode 100644
-index 3813d69..0000000
---- a/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
-+++ /dev/null
-@@ -1,28 +0,0 @@
--/*
-- * Copyright 2018 The WebRTC project authors. All Rights Reserved.
-- *
-- * Use of this source code is governed by a BSD-style license
-- * that can be found in the LICENSE file in the root of the source
-- * tree. An additional intellectual property rights grant can be found
-- * in the file PATENTS. All contributing project authors may
-- * be found in the AUTHORS file in the root of the source tree.
-- */
--
--#include "modules/desktop_capture/linux/screen_capturer_pipewire.h"
--
--#include <memory>
--
--namespace webrtc {
--
--ScreenCapturerPipeWire::ScreenCapturerPipeWire()
-- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kScreen) {}
--ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {}
--
--// static
--std::unique_ptr<DesktopCapturer>
--ScreenCapturerPipeWire::CreateRawScreenCapturer(
-- const DesktopCaptureOptions& options) {
-- return std::make_unique<ScreenCapturerPipeWire>();
--}
--
--} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h b/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h
-deleted file mode 100644
-index 66dcd68..0000000
---- a/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h
-+++ /dev/null
-@@ -1,33 +0,0 @@
--/*
-- * Copyright 2018 The WebRTC project authors. All Rights Reserved.
-- *
-- * Use of this source code is governed by a BSD-style license
-- * that can be found in the LICENSE file in the root of the source
-- * tree. An additional intellectual property rights grant can be found
-- * in the file PATENTS. All contributing project authors may
-- * be found in the AUTHORS file in the root of the source tree.
-- */
--
--#ifndef MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_
--#define MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_
--
--#include <memory>
--
--#include "modules/desktop_capture/linux/base_capturer_pipewire.h"
--
--namespace webrtc {
--
--class ScreenCapturerPipeWire : public BaseCapturerPipeWire {
-- public:
-- ScreenCapturerPipeWire();
-- ~ScreenCapturerPipeWire() override;
--
-- static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer(
-- const DesktopCaptureOptions& options);
--
-- RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerPipeWire);
--};
--
--} // namespace webrtc
--
--#endif // MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc b/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc
-new file mode 100644
-index 0000000..306e984
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.cc 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,532 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -8512,11 +8361,9 @@ index 0000000..306e984
+}
+
+} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h b/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h
-new file mode 100644
-index 0000000..7da218e
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/screencast_portal.h 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -8687,11 +8534,9 @@ index 0000000..7da218e
+} // namespace webrtc
+
+#endif // MODULES_DESKTOP_CAPTURE_LINUX_SCREENCAST_PORTAL_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc b/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc
-new file mode 100644
-index 0000000..c6ba661
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.cc 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,872 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -9565,11 +9410,9 @@ index 0000000..c6ba661
+}
+
+} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h b/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h
-new file mode 100644
-index 0000000..72411e5
---- /dev/null
-+++ b/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h.libwebrtc-screen-cast-sync 2022-05-30 21:33:19.744522177 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/shared_screencast_stream.h 2022-05-30 21:33:19.744522177 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2022 The WebRTC project authors. All Rights Reserved.
@@ -9642,83 +9485,11 @@ index 0000000..72411e5
+} // namespace webrtc
+
+#endif // MODULES_DESKTOP_CAPTURE_LINUX_SHARED_SCREENCAST_STREAM_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
-deleted file mode 100644
-index c43a1f1..0000000
---- a/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
-+++ /dev/null
-@@ -1,28 +0,0 @@
--/*
-- * Copyright 2018 The WebRTC project authors. All Rights Reserved.
-- *
-- * Use of this source code is governed by a BSD-style license
-- * that can be found in the LICENSE file in the root of the source
-- * tree. An additional intellectual property rights grant can be found
-- * in the file PATENTS. All contributing project authors may
-- * be found in the AUTHORS file in the root of the source tree.
-- */
--
--#include "modules/desktop_capture/linux/window_capturer_pipewire.h"
--
--#include <memory>
--
--namespace webrtc {
--
--WindowCapturerPipeWire::WindowCapturerPipeWire()
-- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kWindow) {}
--WindowCapturerPipeWire::~WindowCapturerPipeWire() {}
--
--// static
--std::unique_ptr<DesktopCapturer>
--WindowCapturerPipeWire::CreateRawWindowCapturer(
-- const DesktopCaptureOptions& options) {
-- return std::make_unique<WindowCapturerPipeWire>();
--}
--
--} // namespace webrtc
-diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.h b/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.h
-deleted file mode 100644
-index 7f184ef..0000000
---- a/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.h
-+++ /dev/null
-@@ -1,33 +0,0 @@
--/*
-- * Copyright 2018 The WebRTC project authors. All Rights Reserved.
-- *
-- * Use of this source code is governed by a BSD-style license
-- * that can be found in the LICENSE file in the root of the source
-- * tree. An additional intellectual property rights grant can be found
-- * in the file PATENTS. All contributing project authors may
-- * be found in the AUTHORS file in the root of the source tree.
-- */
--
--#ifndef MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_
--#define MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_
--
--#include <memory>
--
--#include "modules/desktop_capture/linux/base_capturer_pipewire.h"
--
--namespace webrtc {
--
--class WindowCapturerPipeWire : public BaseCapturerPipeWire {
-- public:
-- WindowCapturerPipeWire();
-- ~WindowCapturerPipeWire() override;
--
-- static std::unique_ptr<DesktopCapturer> CreateRawWindowCapturer(
-- const DesktopCaptureOptions& options);
--
-- RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerPipeWire);
--};
--
--} // namespace webrtc
--
--#endif // MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_
-diff --git a/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc b/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc
-index e569f6e..3bb51e8 100644
---- a/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc
-+++ b/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.h.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.h
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc 2022-05-30 21:33:19.745522210 +0200
@@ -17,6 +17,10 @@
#include "modules/desktop_capture/linux/mouse_cursor_monitor_x11.h"
#endif // defined(WEBRTC_USE_X11)
@@ -9730,7 +9501,7 @@ index e569f6e..3bb51e8 100644
namespace webrtc {
// static
-@@ -44,6 +48,13 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
+@@ -44,6 +48,13 @@ MouseCursorMonitor* MouseCursorMonitor::
// static
std::unique_ptr<MouseCursorMonitor> MouseCursorMonitor::Create(
const DesktopCaptureOptions& options) {
@@ -9744,10 +9515,9 @@ index e569f6e..3bb51e8 100644
#if defined(WEBRTC_USE_X11)
return MouseCursorMonitorX11::Create(options);
#else
-diff --git a/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc b/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
-index 57a2002..b44ae35 100644
---- a/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
-+++ b/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc 2022-05-30 21:33:19.745522210 +0200
@@ -14,7 +14,7 @@
#include "modules/desktop_capture/desktop_capturer.h"
@@ -9757,7 +9527,7 @@ index 57a2002..b44ae35 100644
#endif // defined(WEBRTC_USE_PIPEWIRE)
#if defined(WEBRTC_USE_X11)
-@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
+@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> Desktop
const DesktopCaptureOptions& options) {
#if defined(WEBRTC_USE_PIPEWIRE)
if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
@@ -9766,10 +9536,9 @@ index 57a2002..b44ae35 100644
}
#endif // defined(WEBRTC_USE_PIPEWIRE)
-diff --git a/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc b/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
-index ed03ba0..3bc6577 100644
---- a/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
-+++ b/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
+diff -up firefox-101.0/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc.libwebrtc-screen-cast-sync firefox-101.0/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
+--- firefox-101.0/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc 2022-05-30 21:33:19.745522210 +0200
@@ -14,7 +14,7 @@
#include "modules/desktop_capture/desktop_capturer.h"
@@ -9779,7 +9548,7 @@ index ed03ba0..3bc6577 100644
#endif // defined(WEBRTC_USE_PIPEWIRE)
#if defined(WEBRTC_USE_X11)
-@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
+@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> Desktop
const DesktopCaptureOptions& options) {
#if defined(WEBRTC_USE_PIPEWIRE)
if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
@@ -9788,11 +9557,10 @@ index ed03ba0..3bc6577 100644
}
#endif // defined(WEBRTC_USE_PIPEWIRE)
-diff --git a/third_party/moz.build b/third_party/moz.build
-index 1941c11..f804531 100644
---- a/third_party/moz.build
-+++ b/third_party/moz.build
-@@ -49,6 +49,12 @@ with Files("libwebrtc/**"):
+diff -up firefox-101.0/third_party/moz.build.libwebrtc-screen-cast-sync firefox-101.0/third_party/moz.build
+--- firefox-101.0/third_party/moz.build.libwebrtc-screen-cast-sync 2022-05-27 01:17:04.000000000 +0200
++++ firefox-101.0/third_party/moz.build 2022-05-30 21:33:19.745522210 +0200
+@@ -58,6 +58,12 @@ with Files("libwebrtc/**"):
with Files("pipewire/**"):
BUG_COMPONENT = ("Core", "WebRTC")
@@ -9805,11 +9573,10 @@ index 1941c11..f804531 100644
with Files('rlbox_wasm2c_sandbox/**'):
BUG_COMPONENT = ('Firefox Build System', 'General')
-diff --git a/third_party/pipewire/libpipewire/mozpipewire.cpp b/third_party/pipewire/libpipewire/mozpipewire.cpp
-index 1ecfc31..fbeeb8e 100644
---- a/third_party/pipewire/libpipewire/mozpipewire.cpp
-+++ b/third_party/pipewire/libpipewire/mozpipewire.cpp
-@@ -69,11 +69,13 @@ static int (*pw_stream_connect_fn)(struct pw_stream *stream,
+diff -up firefox-101.0/third_party/pipewire/libpipewire/mozpipewire.cpp.libwebrtc-screen-cast-sync firefox-101.0/third_party/pipewire/libpipewire/mozpipewire.cpp
+--- firefox-101.0/third_party/pipewire/libpipewire/mozpipewire.cpp.libwebrtc-screen-cast-sync 2022-05-27 01:17:03.000000000 +0200
++++ firefox-101.0/third_party/pipewire/libpipewire/mozpipewire.cpp 2022-05-30 21:33:19.745522210 +0200
+@@ -69,11 +69,13 @@ static int (*pw_stream_connect_fn)(struc
enum pw_stream_flags flags,
const struct spa_pod **params,
uint32_t n_params);
@@ -9823,7 +9590,7 @@ index 1ecfc31..fbeeb8e 100644
static int (*pw_stream_queue_buffer_fn)(struct pw_stream *stream,
struct pw_buffer *buffer);
static int (*pw_stream_update_params_fn)(struct pw_stream *stream,
-@@ -87,7 +89,10 @@ static int (*pw_thread_loop_start_fn)(struct pw_thread_loop *loop);
+@@ -87,7 +89,10 @@ static int (*pw_thread_loop_start_fn)(st
static void (*pw_thread_loop_stop_fn)(struct pw_thread_loop *loop);
static void (*pw_thread_loop_lock_fn)(struct pw_thread_loop *loop);
static void (*pw_thread_loop_unlock_fn)(struct pw_thread_loop *loop);
@@ -9873,7 +9640,7 @@ index 1ecfc31..fbeeb8e 100644
}
return IsPwLibraryLoaded();
-@@ -242,6 +255,15 @@ pw_stream_connect(struct pw_stream *stream,
+@@ -242,6 +255,15 @@ pw_stream_connect(struct pw_stream *stre
params, n_params);
}
@@ -9889,7 +9656,7 @@ index 1ecfc31..fbeeb8e 100644
struct pw_buffer *
pw_stream_dequeue_buffer(struct pw_stream *stream)
{
-@@ -356,6 +378,23 @@ pw_thread_loop_unlock(struct pw_thread_loop *loop)
+@@ -356,6 +378,23 @@ pw_thread_loop_unlock(struct pw_thread_l
return pw_thread_loop_unlock_fn(loop);
}
@@ -9913,7 +9680,7 @@ index 1ecfc31..fbeeb8e 100644
struct pw_properties *
pw_properties_new_string(const char *str)
-@@ -366,3 +405,12 @@ pw_properties_new_string(const char *str)
+@@ -366,3 +405,12 @@ pw_properties_new_string(const char *str
return pw_properties_new_string_fn(str);
}
diff --git a/mozilla-1663844.patch b/mozilla-1663844.patch
index 6c2392f..d356425 100644
--- a/mozilla-1663844.patch
+++ b/mozilla-1663844.patch
@@ -1,6 +1,6 @@
-diff -up firefox-84.0/dom/media/gmp/GMPSharedMemManager.h.1663844 firefox-84.0/dom/media/gmp/GMPSharedMemManager.h
---- firefox-84.0/dom/media/gmp/GMPSharedMemManager.h.1663844 2020-12-07 23:32:59.000000000 +0100
-+++ firefox-84.0/dom/media/gmp/GMPSharedMemManager.h 2020-12-10 12:59:39.287832851 +0100
+diff -up firefox-101.0/dom/media/gmp/GMPSharedMemManager.h.1663844 firefox-101.0/dom/media/gmp/GMPSharedMemManager.h
+--- firefox-101.0/dom/media/gmp/GMPSharedMemManager.h.1663844 2022-05-27 01:16:53.000000000 +0200
++++ firefox-101.0/dom/media/gmp/GMPSharedMemManager.h 2022-05-30 21:15:20.989993419 +0200
@@ -27,7 +27,7 @@ class GMPSharedMem {
// returned to the parent pool (which is not included). If more than
// this are needed, we presume the client has either crashed or hung
@@ -10,22 +10,21 @@ diff -up firefox-84.0/dom/media/gmp/GMPSharedMemManager.h.1663844 firefox-84.0/d
GMPSharedMem() {
for (size_t i = 0; i < sizeof(mGmpAllocated) / sizeof(mGmpAllocated[0]);
-diff -up firefox-84.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp.1663844 firefox-84.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
---- firefox-84.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp.1663844 2020-12-10 12:59:39.287832851 +0100
-+++ firefox-84.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp 2020-12-10 14:05:00.833685947 +0100
-@@ -82,7 +82,7 @@ bool GMPDecoderModule::SupportsMimeType(
+diff -up firefox-101.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp.1663844 firefox-101.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
+--- firefox-101.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp.1663844 2022-05-30 21:15:20.989993419 +0200
++++ firefox-101.0/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp 2022-05-30 21:24:16.615282035 +0200
+@@ -66,6 +66,7 @@ media::DecodeSupportSet GMPDecoderModule
- bool GMPDecoderModule::SupportsMimeType(
- const nsACString& aMimeType, DecoderDoctorDiagnostics* aDiagnostics) const {
-- return false;
-+ return MP4Decoder::IsH264(aMimeType);
- }
+ nsCString api = nsLiteralCString(CHROMIUM_CDM_API);
- /* static */
-diff -up firefox-84.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp.1663844 firefox-84.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp
---- firefox-84.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp.1663844 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp 2020-12-10 12:59:39.287832851 +0100
-@@ -67,6 +67,8 @@ void GMPVideoDecoder::Decoded(GMPVideoi4
++ // TODO: Do we enable it here?
+ if (MP4Decoder::IsH264(aMimeType)) {
+ isSupported = HaveGMPFor(api, {"h264"_ns, aGMP.value()});
+ } else if (VPXDecoder::IsVP9(aMimeType)) {
+diff -up firefox-101.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp.1663844 firefox-101.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp
+--- firefox-101.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp.1663844 2022-05-27 01:16:53.000000000 +0200
++++ firefox-101.0/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp 2022-05-30 21:15:20.989993419 +0200
+@@ -70,6 +70,8 @@ void GMPVideoDecoder::Decoded(GMPVideoi4
RefPtr<GMPVideoDecoder> self = this;
if (v) {
mDecodedData.AppendElement(std::move(v));
diff --git a/sources b/sources
index 381f526..39a05eb 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
SHA512 (cbindgen-vendor.tar.xz) = b9ab1498be90ecf60822df7021f8812f124550d97f8cd687c69d3ab56fc5fb714bfe88c78c978a1794d211724909a9a5cad6a4b483fa05f762909c45d5075520
SHA512 (mochitest-python.tar.gz) = 18e1aeb475df5fbf1fe3838897d5ac2f3114aa349030713fc2be27af087b1b12f57642621b87bd052f324a7cb7fbae5f36b21502191d85692f62c8cdd69c8bf2
-SHA512 (firefox-100.0.2.source.tar.xz) = 6d9922e35e496fa63833ba03d1466e075287e40e50854ddc4f4a2036d9c7ca1f35c03bc6f708a3c469e0ec3b389b3346ac754bb84df0fecb86955fc21c05e00f
-SHA512 (firefox-langpacks-100.0.2-20220520.tar.xz) = 12ce91a452cef7937c6b25623a00fa2d2aedea3b7856bbbd3c0ee2cf08f55d525aa5e2b91d11e265b58f4b4505930d99b7a5d295d9cd92839ada3e3850e181af
+SHA512 (firefox-101.0.source.tar.xz) = fffe7e0940c1443fcdc5b205677764cb4e04b29f33fcfafb2857d383700584f309806b81fc4989efb56cc12a3cca1ff7d451b647050c43e98777b5c952ed5d56
+SHA512 (firefox-langpacks-101.0-20220530.tar.xz) = aa81113b6aef965aa17921d563759da6c499021b6f471369d998c35802f72e79a107080b4df59ca51dae15ac464176f23bce2fc84942f5852e810d963553b687
bgstack15