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 <sys/ipc.h>
+ #include <sys/shm.h>
+
++#if defined(__OpenBSD__)
++#include <X11/Xlib-xcb.h>
++#include <xcb/shm.h>
++#include <sys/mman.h>
++#include <unistd.h>
++#endif
++
+ #include <cstdint>
+ #include <vector>
+
+@@ -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<void*>(-1)) {
+ shm_segment_info_->shmaddr = reinterpret_cast<char*>(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 <X11/Xlib.h>
+ #include <X11/extensions/XShm.h>
+
++#if defined(__OpenBSD__)
++#include <xcb/xcb.h>
++#endif
++
+ #include <cstdint>
+ #include <vector>
+
+@@ -84,6 +88,10 @@ class XServerPixelBuffer {
+ bool xshm_attached_ = false;
+ bool xshm_get_image_succeeded_ = false;
+ std::vector<uint8_t> icc_profile_;
++#if defined(__OpenBSD__)
++ size_t shm_size_ = 0;
++ xcb_connection_t* xcb_connection_ = nullptr;
++#endif
+ };
+
+ } // namespace webrtc
--
Matthieu Herrb