On 25/05/26 11:00 +0200, Matthieu Herrb wrote:
> Hi,
> 
> Same diff as for firefox, based on robert@'s code/suggestions.  Make
> screen sharing use the XSham 1.2 extension which is compatible wih
> the default chromium pledge.
> 
> ok, comments ?

go ahead for all chromium ports
 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/OpenBSD/ports/www/chromium/Makefile,v
> diff -u -p -u -r1.906 Makefile
> --- Makefile  20 May 2026 12:17:05 -0000      1.906
> +++ Makefile  25 May 2026 08:58:04 -0000
> @@ -13,6 +13,7 @@ DPB_PROPERTIES+=    lonesome
>  COMMENT=             Chromium browser
>  
>  V=                   148.0.7778.178
> +REVISION=            0
>  
>  DISTNAME=            chromium-${V}
>  
> Index: patches/patch-third_party_webrtc_modules_desktop_capture_BUILD_gn
> ===================================================================
> RCS file: patches/patch-third_party_webrtc_modules_desktop_capture_BUILD_gn
> diff -N patches/patch-third_party_webrtc_modules_desktop_capture_BUILD_gn
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-third_party_webrtc_modules_desktop_capture_BUILD_gn 25 May 
> 2026 08:58:06 -0000
> @@ -0,0 +1,12 @@
> +Index: third_party/webrtc/modules/desktop_capture/BUILD.gn
> +--- third_party/webrtc/modules/desktop_capture/BUILD.gn.orig
> ++++ third_party/webrtc/modules/desktop_capture/BUILD.gn
> +@@ -424,6 +424,8 @@ rtc_library("desktop_capture") {
> + 
> +       "Xrender",
> +       "Xtst",
> ++      "xcb-shm",
> ++      "X11-xcb",
> +     ]
> +   }
> + 
> Index: 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
> ===================================================================
> RCS file: 
> /cvs/OpenBSD/ports/www/chromium/patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc,v
> diff -u -p -u -r1.6 
> patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
> --- 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
>        11 Aug 2025 08:06:06 -0000      1.6
> +++ 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
>        25 May 2026 08:58:06 -0000
> @@ -1,16 +1,134 @@
> +Use XShm 1.2 on OpenBSD for webrtc display sharing
> +
>  Index: 
> third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
>  --- 
> third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc.orig
>  +++ 
> third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
> -@@ -212,6 +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;
> +@@ -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,24 @@ 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);
> +-  if (shm_segment_info_->shmid != -1)
> ++#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;
> + }
> +@@ -198,8 +216,8 @@ bool XServerPixelBuffer::Init(XAtomCache* cache, Windo
> +       icc_profile_ = std::vector<uint8_t>(
> +           icc_profile_property.data(),
> +           icc_profile_property.data() + icc_profile_property.size());
> +-    } else {
> +-      RTC_LOG(LS_WARNING) << "Failed to get icc profile";
> ++      //    } else {
> ++      // RTC_LOG(LS_WARNING) << "Failed to get icc profile";
> +     }
> +   }
> + 
> +@@ -224,26 +242,59 @@ 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<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;
> +         if (xshm_attached_) {
> +-          RTC_LOG(LS_VERBOSE)
> ++          RTC_LOG(LS_WARNING)
> +               << "Using X shared memory segment " << 
> shm_segment_info_->shmid;
> +         }
> +       }
> +@@ -263,12 +314,14 @@ void XServerPixelBuffer::InitShm(const XWindowAttribut
> +   if (have_pixmaps)
> +     have_pixmaps = InitPixmaps(default_depth);
> + 
> ++#if !defined(__OpenBSD__)
> +   shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr);
> +   shm_segment_info_->shmid = -1;
> ++#endif
> + 
> +-  RTC_LOG(LS_VERBOSE) << "Using X shared memory extension v" << major << "."
> ++  RTC_LOG(LS_WARNING) << "Using X shared memory extension v" << major << "."
> +                       << minor << " with" << (have_pixmaps ? "" : "out")
> +-                      << " pixmaps.";
> ++                      << " pixmaps." << "fd " << shm_segment_info_->shmid;
> + }
>   
> -   int major, minor;
> -   Bool have_pixmaps;
> + bool XServerPixelBuffer::InitPixmaps(int depth) {
> Index: 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
> ===================================================================
> RCS file: 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
> diff -N 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ 
> patches/patch-third_party_webrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
>         25 May 2026 08:58:06 -0000
> @@ -0,0 +1,25 @@
> +Index: 
> third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h
> +--- 
> third_party/webrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h.orig
> ++++ 
> third_party/webrtc/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

-- 
Regards,
Robert Nagy

Reply via email to