Wayland screencast: add support for preferred device Setting a preferred device allows to pick a device that will be used for rendering. Bug: webrtc:461543454 Change-Id: I87d08f3637db1a97e9ef5ee3e4e9fd8577713dbe Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/428540 Reviewed-by: Alexander Cooper <alcooper@chromium.org> Commit-Queue: Jan Grulich <grulja@gmail.com> Cr-Commit-Position: refs/heads/main@{#46557}
diff --git a/modules/desktop_capture/linux/wayland/egl_dmabuf.cc b/modules/desktop_capture/linux/wayland/egl_dmabuf.cc index 29a70f4..a60402e 100644 --- a/modules/desktop_capture/linux/wayland/egl_dmabuf.cc +++ b/modules/desktop_capture/linux/wayland/egl_dmabuf.cc
@@ -849,6 +849,11 @@ } EglDrmDevice* EglDmaBuf::GetRenderDevice() { + if (auto it = devices_.find(preferred_render_device_id_); + it != devices_.end()) { + return it->second.get(); + } + if (default_platform_device_) { return default_platform_device_.get(); } @@ -856,7 +861,27 @@ if (!devices_.empty()) { return devices_.begin()->second.get(); } + return nullptr; } +bool EglDmaBuf::SetPreferredRenderDevice(dev_t device_id) { + if (device_id == DEVICE_ID_INVALID) { + RTC_LOG(LS_ERROR) << "Cannot set invalid device ID as render device"; + return false; + } + + auto it = devices_.find(device_id); + if (it == devices_.end()) { + RTC_LOG(LS_ERROR) << "Device ID " << device_id << " not found"; + return false; + } + + preferred_render_device_id_ = device_id; + RTC_LOG(LS_INFO) << "Render device set to device ID: " << major(device_id) + << ":" << minor(device_id); + + return true; +} + } // namespace webrtc
diff --git a/modules/desktop_capture/linux/wayland/egl_dmabuf.h b/modules/desktop_capture/linux/wayland/egl_dmabuf.h index ee32f96..f70f5bb 100644 --- a/modules/desktop_capture/linux/wayland/egl_dmabuf.h +++ b/modules/desktop_capture/linux/wayland/egl_dmabuf.h
@@ -97,12 +97,15 @@ // 3. nullptr - if no devices are available EglDrmDevice* GetRenderDevice(); + bool SetPreferredRenderDevice(dev_t device_id); + private: bool CreatePlatformDevice(); void EnumerateDrmDevices(); std::map<dev_t, std::unique_ptr<EglDrmDevice>> devices_; std::unique_ptr<EglDrmDevice> default_platform_device_; + dev_t preferred_render_device_id_ = DEVICE_ID_INVALID; }; } // namespace webrtc