From: Matthieu Herrb Subject: Re: firefox: let webrtc/screen sharing use XShm 1.2 To: Matthieu Herrb Cc: Landry Breuil , Robert Nagy , ports@openbsd.org Date: Mon, 25 May 2026 10:57:09 +0200 On Sun, May 17, 2026 at 09:19:46AM +0000, Matthieu Herrb wrote: > 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 ? Diff updated to firefox 151: Index: Makefile =================================================================== RCS file: /cvs/OpenBSD/ports/www/mozilla-firefox/Makefile,v diff -u -p -u -r1.684 Makefile --- Makefile 19 May 2026 13:22:38 -0000 1.684 +++ Makefile 25 May 2026 08:55:42 -0000 @@ -8,6 +8,8 @@ MOZILLA_BRANCH = release MOZILLA_PROJECT = firefox MOZILLA_CODENAME = browser +REVISION = 0 + WRKDIST = ${WRKDIR}/${MOZILLA_DIST}-${MOZILLA_DIST_VERSION:C/b[0-9]*//} HOMEPAGE = https://www.mozilla.org/firefox/ SO_VERSION = 163.0 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.2 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 19 May 2026 13:22:38 -0000 1.2 +++ patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc 25 May 2026 08:55:42 -0000 @@ -1,19 +1,108 @@ -https://bugzil.la/1702919, fallback to ximage +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 - 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)) { +@@ -17,6 +17,13 @@ + #include + #include + ++#if defined(__OpenBSD__) ++#include ++#include ++#include ++#include ++#endif ++ + #include + #include + +@@ -170,13 +177,23 @@ void XServerPixelBuffer::ReleaseSharedMemorySegment() + 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__) + shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr); ++#endif + delete shm_segment_info_; + shm_segment_info_ = nullptr; + } +@@ -224,21 +241,54 @@ void XServerPixelBuffer::InitShm(const XWindowAttribut + 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 +313,9 @@ void XServerPixelBuffer::InitShm(const XWindowAttribut + 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 25 May 2026 08:55:42 -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