From: Matthieu Herrb Subject: firefox: let webrtc/screen sharing use XShm 1.2 To: Landry Breuil , Robert Nagy Cc: ports@openbsd.org Date: Sun, 17 May 2026 09:19:46 +0000 Hi, robert@ made a quick diff to webrtc to make it use the XShm 1.2 extention, rather than legacy 1.1. I've adapted it to Firefox. XShm 1.2 doesn't use the SysV shmget() syscall and can thus be used in a pledge(2) process, allowing it to work with firefox (and chrome). I think the Mozilla people should have done this years ago (and not only for OpenBSD, other systems could benefit from it too. anyways, I think this is better than falling back to XImage. Tested with Big Blue Button and Jitsi web conference servers. Comments ? ok ? Index: Makefile =================================================================== RCS file: /cvs/OpenBSD/ports/www/mozilla-firefox/Makefile,v diff -u -p -u -r1.683 Makefile --- Makefile 16 May 2026 07:24:44 -0000 1.683 +++ Makefile 17 May 2026 09:00:40 -0000 @@ -8,7 +8,7 @@ MOZILLA_BRANCH = release MOZILLA_PROJECT = firefox MOZILLA_CODENAME = browser -REVISION = 0 +REVISION = 1 WRKDIST = ${WRKDIR}/${MOZILLA_DIST}-${MOZILLA_DIST_VERSION:C/b[0-9]*//} HOMEPAGE = https://www.mozilla.org/firefox/ Index: patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc =================================================================== RCS file: /cvs/OpenBSD/ports/www/mozilla-firefox/patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc,v diff -u -p -u -r1.1 patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc --- patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc 16 May 2026 07:24:44 -0000 1.1 +++ patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc 17 May 2026 09:00:40 -0000 @@ -1,17 +1,118 @@ +Add XShm 1.2 support + Index: third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc --- third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc.orig +++ third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc -@@ -212,7 +212,12 @@ bool XServerPixelBuffer::Init(XAtomCache* cache, Windo +@@ -17,6 +17,13 @@ + #include + #include + ++#if defined(__OpenBSD__) ++#include ++#include ++#include ++#include ++#endif ++ + #include + #include + +@@ -170,13 +177,25 @@ void XServerPixelBuffer::ReleaseSharedMe + if (!shm_segment_info_) + return; + if (xshm_attached_) { ++#if defined(__OpenBSD__) ++ xcb_shm_detach(xcb_connection_, shm_segment_info_->shmseg); ++#else + XShmDetach(display_, shm_segment_info_); ++#endif + xshm_attached_ = false; + } + if (shm_segment_info_->shmaddr != nullptr) ++#if defined(__OpenBSD__) ++ munmap(shm_segment_info_->shmaddr, shm_size_); ++#else + shmdt(shm_segment_info_->shmaddr); ++#endif + if (shm_segment_info_->shmid != -1) ++#if defined(__OpenBSD__) ++ close(shm_segment_info_->shmid); ++#else + shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr); ++#endif + delete shm_segment_info_; + shm_segment_info_ = nullptr; + } +@@ -212,7 +231,6 @@ bool XServerPixelBuffer::Init(XAtomCache void XServerPixelBuffer::InitShm(const XWindowAttributes& attributes) { Visual* default_visual = attributes.visual; int default_depth = attributes.depth; - -+#if defined(__OpenBSD__) -+// pledge(2) -+ RTC_LOG(LS_WARNING) << "Unable to use shmget(2) while using pledge(2). " -+ "Performance may be degraded."; -+ return; -+#endif int major, minor; Bool have_pixmaps; if (!XShmQueryVersion(display_, &major, &minor, &have_pixmaps)) { +@@ -224,21 +242,54 @@ void XServerPixelBuffer::InitShm(const X + shm_segment_info_->shmid = -1; + shm_segment_info_->shmaddr = nullptr; + shm_segment_info_->readOnly = False; ++#if defined(__OpenBSD__) ++ shm_segment_info_->shmseg = XCB_NONE; ++#endif + x_shm_image_ = XShmCreateImage(display_, default_visual, default_depth, + ZPixmap, nullptr, shm_segment_info_, + window_rect_.width(), window_rect_.height()); + if (x_shm_image_) { ++#if defined(__OpenBSD__) ++ char name[19] = "/webrtc-XXXXXXXXXX"; ++ shm_size_ = x_shm_image_->bytes_per_line * x_shm_image_->height; ++ shm_segment_info_->shmid = shm_mkstemp(name); ++ shm_unlink(name); ++#else + shm_segment_info_->shmid = + shmget(IPC_PRIVATE, x_shm_image_->bytes_per_line * x_shm_image_->height, + IPC_CREAT | 0600); ++#endif + if (shm_segment_info_->shmid != -1) { ++#if defined(__OpenBSD__) ++ if (ftruncate(shm_segment_info_->shmid, shm_size_) < 0) { ++ close(shm_segment_info_->shmid); ++ return; ++ } ++ void* shmat_result = mmap(nullptr, shm_size_, PROT_READ | PROT_WRITE, ++ MAP_SHARED | __MAP_NOFAULT, shm_segment_info_->shmid, 0); ++ if (shmat_result == MAP_FAILED) { ++ close(shm_segment_info_->shmid); ++ return; ++ } ++#else + void* shmat_result = shmat(shm_segment_info_->shmid, nullptr, 0); ++#endif + if (shmat_result != reinterpret_cast(-1)) { + shm_segment_info_->shmaddr = reinterpret_cast(shmat_result); + x_shm_image_->data = shm_segment_info_->shmaddr; + + XErrorTrap error_trap(display_); ++#if defined(__OpenBSD__) ++ xcb_connection_ = XGetXCBConnection(display_); ++ shm_segment_info_->shmseg = xcb_generate_id(xcb_connection_); ++ xcb_void_cookie_t cookie = ++ xcb_shm_attach_fd_checked(xcb_connection_, shm_segment_info_->shmseg, ++ shm_segment_info_->shmid, 0); ++ if (xcb_request_check(xcb_connection_, cookie) == NULL) ++ xshm_attached_ = true; ++#else + xshm_attached_ = XShmAttach(display_, shm_segment_info_); ++#endif + XSync(display_, False); + if (error_trap.GetLastErrorAndDisable() != 0) + xshm_attached_ = false; +@@ -263,7 +314,9 @@ void XServerPixelBuffer::InitShm(const X + if (have_pixmaps) + have_pixmaps = InitPixmaps(default_depth); + ++#if !defined(__OpenBSD__) + shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr); ++#endif + shm_segment_info_->shmid = -1; + + RTC_LOG(LS_VERBOSE) << "Using X shared memory extension v" << major << "." Index: patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h =================================================================== RCS file: patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h diff -N patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h 17 May 2026 09:00:40 -0000 @@ -0,0 +1,27 @@ +XShm 1.2 support + +Index: third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h +--- third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h.orig ++++ third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h +@@ -17,6 +17,10 @@ + #include + #include + ++#if defined(__OpenBSD__) ++#include ++#endif ++ + #include + #include + +@@ -84,6 +88,10 @@ class XServerPixelBuffer { + bool xshm_attached_ = false; + bool xshm_get_image_succeeded_ = false; + std::vector icc_profile_; ++#if defined(__OpenBSD__) ++ size_t shm_size_ = 0; ++ xcb_connection_t* xcb_connection_ = nullptr; ++#endif + }; + + } // namespace webrtc -- Matthieu Herrb