loader,glx,egl,vl,d3d: loader_get_user_preferred_fd() function to return original_fd
authorYogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
Sat, 17 Dec 2022 17:21:08 +0000 (22:51 +0530)
committerMarge Bot <emma+marge@anholt.net>
Tue, 24 Jan 2023 12:51:35 +0000 (12:51 +0000)
v1: return original_fd in loader_get_user_preferred_fd() (Pierre-Eric)
v2: fix *original_id crash for android, haiku... (Pierre-Eric)
    remove extra comment (Pierre-Eric)
v2: also return render fd in case of original_fd passed is NULL (Pierre-Eric)

Signed-off-by: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13422>

src/egl/drivers/dri2/platform_wayland.c
src/egl/drivers/dri2/platform_x11_dri3.c
src/gallium/auxiliary/vl/vl_winsys_dri3.c
src/gallium/targets/d3dadapter9/drm.c
src/glx/dri3_glx.c
src/loader/loader.c
src/loader/loader.h

index 3069983..f497e62 100644 (file)
@@ -2229,13 +2229,8 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
          goto cleanup;
    }
 
-   dri2_dpy->fd_display_gpu = fcntl(dri2_dpy->fd_render_gpu, F_DUPFD_CLOEXEC, 3);
-   dri2_dpy->fd_render_gpu = loader_get_user_preferred_fd(dri2_dpy->fd_render_gpu,
-                                                          &dri2_dpy->is_different_gpu);
-   if (!dri2_dpy->is_different_gpu) {
-      close(dri2_dpy->fd_display_gpu);
-      dri2_dpy->fd_display_gpu = -1;
-   }
+   dri2_dpy->is_different_gpu =
+      loader_get_user_preferred_fd(&dri2_dpy->fd_render_gpu, &dri2_dpy->fd_display_gpu);
 
    dev = _eglAddDevice(dri2_dpy->fd_render_gpu, false);
    if (!dev) {
index 5148331..7666849 100644 (file)
@@ -635,13 +635,8 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
       return EGL_FALSE;
    }
 
-   dri2_dpy->fd_display_gpu = fcntl(dri2_dpy->fd_render_gpu, F_DUPFD_CLOEXEC, 3);
-   dri2_dpy->fd_render_gpu = loader_get_user_preferred_fd(dri2_dpy->fd_render_gpu,
-                                                          &dri2_dpy->is_different_gpu);
-   if (!dri2_dpy->is_different_gpu) {
-      close(dri2_dpy->fd_display_gpu);
-      dri2_dpy->fd_display_gpu = -1;
-   }
+   dri2_dpy->is_different_gpu =
+      loader_get_user_preferred_fd(&dri2_dpy->fd_render_gpu, &dri2_dpy->fd_display_gpu);
 
    dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd_render_gpu);
    if (!dri2_dpy->driver_name) {
index baa12fa..8d7e6fa 100644 (file)
@@ -811,7 +811,7 @@ vl_dri3_screen_create(Display *display, int screen)
    fcntl(fd, F_SETFD, FD_CLOEXEC);
    free(open_reply);
 
-   fd = loader_get_user_preferred_fd(fd, &scrn->is_different_gpu);
+   scrn->is_different_gpu = loader_get_user_preferred_fd(&fd, NULL);
 
    geom_cookie = xcb_get_geometry(scrn->conn, RootWindow(display, screen));
    geom_reply = xcb_get_geometry_reply(scrn->conn, geom_cookie, NULL);
index 6487340..ca7f9ab 100644 (file)
@@ -230,7 +230,7 @@ drm_create_adapter( int fd,
 
     /* Although the fd is provided from external source, mesa/nine
      * takes ownership of it. */
-    fd = loader_get_user_preferred_fd(fd, &different_device);
+    different_device = loader_get_user_preferred_fd(&fd, NULL);
     ctx->fd = fd;
     ctx->base.linear_framebuffer = different_device;
 
index 5a9ec95..8816d50 100644 (file)
@@ -821,12 +821,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
       return NULL;
    }
 
-   psc->fd_display_gpu = fcntl(psc->fd_render_gpu, F_DUPFD_CLOEXEC, 3);
-   psc->fd_render_gpu = loader_get_user_preferred_fd(psc->fd_render_gpu, &psc->is_different_gpu);
-   if (!psc->is_different_gpu) {
-      close(psc->fd_display_gpu);
-      psc->fd_display_gpu = -1;
-   }
+   psc->is_different_gpu =
+      loader_get_user_preferred_fd(&psc->fd_render_gpu, &psc->fd_display_gpu);
 
    driverName = loader_get_driver_for_fd(psc->fd_render_gpu);
    if (!driverName) {
index dd6f837..75968bd 100644 (file)
@@ -325,7 +325,7 @@ static char *drm_get_id_path_tag_for_fd(int fd)
    return tag;
 }
 
-int loader_get_user_preferred_fd(int default_fd, bool *different_device)
+bool loader_get_user_preferred_fd(int *fd_render_gpu, int *original_fd)
 {
    const char *dri_prime = getenv("DRI_PRIME");
    char *default_tag, *prime = NULL;
@@ -341,14 +341,12 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
       prime = loader_get_dri_config_device_id();
 #endif
 
-   if (prime == NULL) {
-      *different_device = false;
-      return default_fd;
-   } else {
+   if (prime == NULL)
+      goto no_prime_gpu_offloading;
+   else
       prime_is_vid_did = sscanf(prime, "%hx:%hx", &vendor_id, &device_id) == 2;
-   }
 
-   default_tag = drm_get_id_path_tag_for_fd(default_fd);
+   default_tag = drm_get_id_path_tag_for_fd(*fd_render_gpu);
    if (default_tag == NULL)
       goto err;
 
@@ -394,20 +392,30 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
    if (fd < 0)
       goto err;
 
-   close(default_fd);
-
-   *different_device = !!strcmp(default_tag, prime);
+   bool is_render_and_display_gpu_diff = !!strcmp(default_tag, prime);
+   if (original_fd) {
+      if (is_render_and_display_gpu_diff) {
+         *original_fd = *fd_render_gpu;
+         *fd_render_gpu = fd;
+      } else {
+         *original_fd = *fd_render_gpu;
+         close(fd);
+      }
+   } else {
+      close(*fd_render_gpu);
+      *fd_render_gpu = fd;
+   }
 
    free(default_tag);
    free(prime);
-   return fd;
-
+   return is_render_and_display_gpu_diff;
  err:
-   *different_device = false;
-
    free(default_tag);
    free(prime);
-   return default_fd;
+ no_prime_gpu_offloading:
+   if (original_fd)
+      *original_fd = *fd_render_gpu;
+   return false;
 }
 #else
 int
@@ -422,10 +430,10 @@ loader_get_render_node(dev_t device)
    return NULL;
 }
 
-int loader_get_user_preferred_fd(int default_fd, bool *different_device)
-{
-   *different_device = false;
-   return default_fd;
+bool loader_get_user_preferred_fd(int *fd_render_gpu, int *original_fd)
+   if (original_fd)
+      *original_fd = *fd_render_gpu;
+   return false;
 }
 #endif
 
index 68e24a1..2480b62 100644 (file)
@@ -70,13 +70,14 @@ loader_open_driver(const char *driver_name,
 char *
 loader_get_device_name_for_fd(int fd);
 
-/* Function to get a different device than the one we are to use by default,
- * if the user requests so and it is possible. The initial fd will be closed
- * if necessary. The returned fd is potentially a render-node.
+/* For dri prime gpu offloading this function will take current render fd and possibly
+ * update it with new prime gpu offloading fd. For dri prime gpu offloading optionally
+ * this function can return the original fd. Also this function returns true/false based
+ * on render gpu is different from display gpu.
  */
 
-int
-loader_get_user_preferred_fd(int default_fd, bool *different_device);
+bool
+loader_get_user_preferred_fd(int *fd_render_gpu, int *original_fd);
 
 /* for logging.. keep this aligned with egllog.h so we can just use
  * _eglLog directly.