From 2a44277492771ac43a0b5be03634791f199ebbd4 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 14 Apr 2025 16:37:02 +0000 Subject: [PATCH] Bug 1954903 - Allow to use system drm libs instead of bundled r=stransky,mjf Introduce "--with-system-libdrm" option, allowing to build Firefox with system drm library and to find system drm header files. Also unify all drm includes to match both system and bundled paths. Differential Revision: https://phabricator.services.mozilla.com/D242099 --- build/gn_processor.py | 13 +++++++++++++ config/system-headers.mozbuild | 6 ++++++ .../platforms/ffmpeg/FFmpegVideoFramePool.cpp | 2 +- dom/media/platforms/ffmpeg/ffmpeg58/moz.build | 4 +++- dom/media/platforms/ffmpeg/ffmpeg59/moz.build | 4 +++- dom/media/platforms/ffmpeg/ffmpeg60/moz.build | 4 +++- dom/media/platforms/ffmpeg/ffmpeg61/moz.build | 4 +++- dom/media/platforms/ffmpeg/ffvpx/moz.build | 4 +++- dom/media/webrtc/moz.build | 1 - .../third_party_build/gn-configs/webrtc.json | 4 ++++ media/ffvpx/libavutil/hwcontext_vaapi.c | 2 +- third_party/drm/drm/xf86drm.h | 2 +- third_party/drm/libdrm/moz.build | 17 +++++++---------- third_party/drm/libdrm/mozdrm.cpp | 2 +- toolkit/library/moz.build | 3 +++ toolkit/moz.configure | 18 ++++++++++++++++++ widget/gtk/DMABufFormats.cpp | 2 +- widget/gtk/moz.build | 9 +++++++-- 18 files changed, 78 insertions(+), 23 deletions(-) diff --git a/build/gn_processor.py b/build/gn_processor.py index b2b2aaf76692..00d96b743c45 100644 --- a/build/gn_processor.py +++ b/build/gn_processor.py @@ -571,6 +571,19 @@ def write_mozbuild( mb.write(' LOCAL_INCLUDES += [ "/third_party/gbm/gbm/" ]\n') except KeyError: pass + try: + if ( + relsrcdir + in write_mozbuild_variables["INCLUDE_SYSTEM_LIBDRM_HANDLING"] + ): + mb.write('CXXFLAGS += CONFIG["MOZ_LIBDRM_CFLAGS"]\n') + mb.write('if not CONFIG["MOZ_SYSTEM_LIBDRM"]:\n') + mb.write(' LOCAL_INCLUDES += [ "/third_party/drm/drm/",\n') + mb.write( + ' "/third_party/drm/drm/include/" ]\n' + ) + except KeyError: + pass try: if ( relsrcdir diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild index e11ddf6b97a9..4d4f4c414ac9 100644 --- a/config/system-headers.mozbuild +++ b/config/system-headers.mozbuild @@ -1261,6 +1261,12 @@ if CONFIG["MOZ_SYSTEM_GBM"]: "gbm.h", ] +if CONFIG["MOZ_SYSTEM_LIBDRM"]: + system_headers += [ + "drm.h", + "xf86drm.h", + ] + if CONFIG["MOZ_JACK"]: system_headers += [ "jack/jack.h", diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp index 3005de450501..5256f2381424 100644 --- a/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp @@ -18,7 +18,7 @@ #ifdef DRM_FORMAT_MOD_INVALID # undef DRM_FORMAT_MOD_INVALID #endif -#include "drm_fourcc.h" +#include #ifdef MOZ_LOGGING # undef DMABUF_LOG diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build index c95a71a2458a..6bb365373c35 100644 --- a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build +++ b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build @@ -34,7 +34,9 @@ if CONFIG['MOZ_WIDGET_GTK']: CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS'] if CONFIG['MOZ_ENABLE_VAAPI'] or CONFIG['MOZ_ENABLE_V4L2']: UNIFIED_SOURCES += ['../FFmpegVideoFramePool.cpp'] - LOCAL_INCLUDES += ['/third_party/drm/drm/include/libdrm/'] + CXXFLAGS += CONFIG['MOZ_DRM_CFLAGS'] + if not CONFIG['MOZ_SYSTEM_LIBDRM']: + LOCAL_INCLUDES += ['/third_party/drm/drm/include/'] USE_LIBS += ['mozva'] DEFINES['MOZ_USE_HWDECODE'] = 1 diff --git a/dom/media/platforms/ffmpeg/ffmpeg59/moz.build b/dom/media/platforms/ffmpeg/ffmpeg59/moz.build index b24e6d34032c..663c2ae263b9 100644 --- a/dom/media/platforms/ffmpeg/ffmpeg59/moz.build +++ b/dom/media/platforms/ffmpeg/ffmpeg59/moz.build @@ -34,7 +34,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] if CONFIG["MOZ_ENABLE_VAAPI"] or CONFIG["MOZ_ENABLE_V4L2"]: UNIFIED_SOURCES += ["../FFmpegVideoFramePool.cpp"] - LOCAL_INCLUDES += ["/third_party/drm/drm/include/libdrm/"] + CXXFLAGS += CONFIG['MOZ_DRM_CFLAGS'] + if not CONFIG['MOZ_SYSTEM_LIBDRM']: + LOCAL_INCLUDES += ['/third_party/drm/drm/include/'] USE_LIBS += ["mozva"] DEFINES["MOZ_USE_HWDECODE"] = 1 diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/moz.build b/dom/media/platforms/ffmpeg/ffmpeg60/moz.build index b24e6d34032c..663c2ae263b9 100644 --- a/dom/media/platforms/ffmpeg/ffmpeg60/moz.build +++ b/dom/media/platforms/ffmpeg/ffmpeg60/moz.build @@ -34,7 +34,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] if CONFIG["MOZ_ENABLE_VAAPI"] or CONFIG["MOZ_ENABLE_V4L2"]: UNIFIED_SOURCES += ["../FFmpegVideoFramePool.cpp"] - LOCAL_INCLUDES += ["/third_party/drm/drm/include/libdrm/"] + CXXFLAGS += CONFIG['MOZ_DRM_CFLAGS'] + if not CONFIG['MOZ_SYSTEM_LIBDRM']: + LOCAL_INCLUDES += ['/third_party/drm/drm/include/'] USE_LIBS += ["mozva"] DEFINES["MOZ_USE_HWDECODE"] = 1 diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/moz.build b/dom/media/platforms/ffmpeg/ffmpeg61/moz.build index fce65109e5dd..26b538d6f302 100644 --- a/dom/media/platforms/ffmpeg/ffmpeg61/moz.build +++ b/dom/media/platforms/ffmpeg/ffmpeg61/moz.build @@ -34,7 +34,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] if CONFIG["MOZ_ENABLE_VAAPI"] or CONFIG["MOZ_ENABLE_V4L2"]: UNIFIED_SOURCES += ["../FFmpegVideoFramePool.cpp"] - LOCAL_INCLUDES += ["/third_party/drm/drm/include/libdrm/"] + CXXFLAGS += CONFIG['MOZ_DRM_CFLAGS'] + if not CONFIG['MOZ_SYSTEM_LIBDRM']: + LOCAL_INCLUDES += ['/third_party/drm/drm/include/'] USE_LIBS += ["mozva"] DEFINES["MOZ_USE_HWDECODE"] = 1 diff --git a/dom/media/platforms/ffmpeg/ffvpx/moz.build b/dom/media/platforms/ffmpeg/ffvpx/moz.build index 27c9b65cecb2..e57286327c94 100644 --- a/dom/media/platforms/ffmpeg/ffvpx/moz.build +++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build @@ -46,7 +46,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] if CONFIG["MOZ_ENABLE_VAAPI"] or CONFIG["MOZ_ENABLE_V4L2"]: UNIFIED_SOURCES += ["../FFmpegVideoFramePool.cpp"] - LOCAL_INCLUDES += ["/third_party/drm/drm/include/libdrm/"] + CXXFLAGS += CONFIG["MOZ_LIBDRM_CFLAGS"] + if not CONFIG["MOZ_SYSTEM_LIBDRM"]: + LOCAL_INCLUDES += ["/third_party/drm/drm/include/"] USE_LIBS += ["mozva"] DEFINES["MOZ_USE_HWDECODE"] = 1 if CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows": diff --git a/dom/media/webrtc/moz.build b/dom/media/webrtc/moz.build index eecbf2faf6a4..c8a67918365d 100644 --- a/dom/media/webrtc/moz.build +++ b/dom/media/webrtc/moz.build @@ -86,7 +86,6 @@ if CONFIG["MOZ_WEBRTC_SIGNALING"]: if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": DIRS += [ - "/third_party/drm/", "/third_party/drm/libdrm", "/third_party/libepoxy/", "/third_party/pipewire/libpipewire", diff --git a/dom/media/webrtc/third_party_build/gn-configs/webrtc.json b/dom/media/webrtc/third_party_build/gn-configs/webrtc.json index c9132a1ec759..faf0d971ad1e 100644 --- a/dom/media/webrtc/third_party_build/gn-configs/webrtc.json +++ b/dom/media/webrtc/third_party_build/gn-configs/webrtc.json @@ -21,6 +21,10 @@ "third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn", "third_party/libwebrtc/modules/portal/portal_gn" ], + "INCLUDE_SYSTEM_LIBDRM_HANDLING": [ + "third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn", + "third_party/libwebrtc/modules/portal/portal_gn" + ], "INCLUDE_SYSTEM_DAV1D_HANDLING": [ "third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder_gn", "third_party/libwebrtc/modules/video_coding/codecs/av1/libaom_av1_encoder_gn" diff --git a/media/ffvpx/libavutil/hwcontext_vaapi.c b/media/ffvpx/libavutil/hwcontext_vaapi.c index 95aa38d9d25e..f201be08a6da 100644 --- a/media/ffvpx/libavutil/hwcontext_vaapi.c +++ b/media/ffvpx/libavutil/hwcontext_vaapi.c @@ -37,7 +37,7 @@ typedef HRESULT (WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory) #if CONFIG_LIBDRM # include # include -# include +# include # ifndef DRM_FORMAT_MOD_INVALID # define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1) # endif diff --git a/third_party/drm/drm/xf86drm.h b/third_party/drm/drm/xf86drm.h index 6d91dfbd92ba..f9c3e4eed87b 100644 --- a/third_party/drm/drm/xf86drm.h +++ b/third_party/drm/drm/xf86drm.h @@ -37,7 +37,7 @@ #include #include #include -#include +#include #if defined(__cplusplus) extern "C" { diff --git a/third_party/drm/libdrm/moz.build b/third_party/drm/libdrm/moz.build index 3c5ebbf1e078..84ee87924936 100644 --- a/third_party/drm/libdrm/moz.build +++ b/third_party/drm/libdrm/moz.build @@ -4,16 +4,13 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -SOURCES += [ - 'mozdrm.cpp', -] - -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS'] - -LOCAL_INCLUDES += [ - '/third_party/drm/', - '/third_party/drm/drm/include/libdrm/', +if CONFIG["MOZ_SYSTEM_LIBDRM"]: + OS_LIBS += CONFIG["MOZ_LIBDRM_LIBS"] +else: + SOURCES += ['mozdrm.cpp'] + LOCAL_INCLUDES += [ + '/third_party/drm/drm/', + '/third_party/drm/drm/include/', ] FINAL_LIBRARY = 'xul' diff --git a/third_party/drm/libdrm/mozdrm.cpp b/third_party/drm/libdrm/mozdrm.cpp index b2fb59be64a2..05a8290bfc3a 100644 --- a/third_party/drm/libdrm/mozdrm.cpp +++ b/third_party/drm/libdrm/mozdrm.cpp @@ -8,7 +8,7 @@ #include "mozilla/Types.h" #include "prlink.h" -#include +#include #define GET_FUNC(func, lib) \ func##_fn = \ diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index fedbaec8c42b..59f776ac8f36 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -325,6 +325,9 @@ if CONFIG["OS_ARCH"] == "OpenBSD": if CONFIG["MOZ_ENABLE_DBUS"]: OS_LIBS += CONFIG["MOZ_DBUS_LIBS"] +if CONFIG["MOZ_SYSTEM_LIBDRM"]: + OS_LIBS += CONFIG["MOZ_LIBDRM_LIBS"] + if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk" and CONFIG["COMPILE_ENVIRONMENT"]: OS_LIBS += [l for l in CONFIG["MOZ_GTK3_LIBS"] if l not in ("-lgtk-3", "-lgdk-3")] OS_LIBS += CONFIG["MOZ_X11_LIBS"] diff --git a/toolkit/moz.configure b/toolkit/moz.configure index 8dd2ebe27ec2..ccf496454191 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -696,6 +696,24 @@ with only_when(compile_environment): set_config("MOZ_SYSTEM_GBM", True, when="--with-system-gbm") +# System libdrm support +# ============================================================= +with only_when(compile_environment): + system_lib_option( + "--with-system-libdrm", + nargs="?", + help="Use system libdrm", + when=use_pkg_config, + ) + + pipewire_headers = pkg_check_modules( + "MOZ_LIBDRM", + "libdrm", + when="--with-system-libdrm", + ) + + set_config("MOZ_SYSTEM_LIBDRM", True, when="--with-system-libdrm") + # GL Provider # ============================================================== option("--with-gl-provider", nargs=1, help="Set GL provider backend type") diff --git a/widget/gtk/DMABufFormats.cpp b/widget/gtk/DMABufFormats.cpp index 8996901b4ccf..f5c31082caf0 100644 --- a/widget/gtk/DMABufFormats.cpp +++ b/widget/gtk/DMABufFormats.cpp @@ -5,7 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include +#include #include #include diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build index c000b8dbead4..71879f10b1aa 100644 --- a/widget/gtk/moz.build +++ b/widget/gtk/moz.build @@ -160,8 +160,6 @@ LOCAL_INCLUDES += [ "/layout/xul", "/other-licenses/atk-1.0", "/third_party/cups/include", - "/third_party/drm/", - "/third_party/drm/drm/include/libdrm/", "/widget", "/widget/headless", "/widget/x11", @@ -176,6 +174,13 @@ if not CONFIG["MOZ_SYSTEM_GBM"]: "/third_party/gbm/gbm/", ] +CXXFLAGS += CONFIG["MOZ_LIBDRM_CFLAGS"] +if not CONFIG["MOZ_SYSTEM_LIBDRM"]: + LOCAL_INCLUDES += [ + "/third_party/drm/drm/", + "/third_party/drm/drm/include/", + ] + DEFINES["CAIRO_GFX"] = True DEFINES["MOZ_APP_NAME"] = '"%s"' % CONFIG["MOZ_APP_NAME"]