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