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

Reply via email to