summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>2022-12-17 22:51:08 +0530
committerMarge Bot <emma+marge@anholt.net>2023-01-24 12:51:35 +0000
commit1a0ec8e8d3750d580ded41158b782b8070ff0e0a (patch)
treeeb3a25cbc077815452fed3903bfb9258a1f64529
parent1c5b61eefb9be69256552cfde1caf3b7e1d29614 (diff)
loader,glx,egl,vl,d3d: loader_get_user_preferred_fd() function to return original_fd
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>
-rw-r--r--src/egl/drivers/dri2/platform_wayland.c9
-rw-r--r--src/egl/drivers/dri2/platform_x11_dri3.c9
-rw-r--r--src/gallium/auxiliary/vl/vl_winsys_dri3.c2
-rw-r--r--src/gallium/targets/d3dadapter9/drm.c2
-rw-r--r--src/glx/dri3_glx.c8
-rw-r--r--src/loader/loader.c46
-rw-r--r--src/loader/loader.h11
7 files changed, 41 insertions, 46 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 30699836ac0..f497e62e38c 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -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) {
diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
index 51483318aa7..7666849b5d5 100644
--- a/src/egl/drivers/dri2/platform_x11_dri3.c
+++ b/src/egl/drivers/dri2/platform_x11_dri3.c
@@ -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) {
diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
index baa12fa95d0..8d7e6fa9c46 100644
--- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c
+++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
@@ -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);
diff --git a/src/gallium/targets/d3dadapter9/drm.c b/src/gallium/targets/d3dadapter9/drm.c
index 64873409e2a..ca7f9abb0c9 100644
--- a/src/gallium/targets/d3dadapter9/drm.c
+++ b/src/gallium/targets/d3dadapter9/drm.c
@@ -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;
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 5a9ec959640..8816d500f88 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -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) {
diff --git a/src/loader/loader.c b/src/loader/loader.c
index dd6f837911a..75968bdcdfc 100644
--- a/src/loader/loader.c
+++ b/src/loader/loader.c
@@ -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
diff --git a/src/loader/loader.h b/src/loader/loader.h
index 68e24a1ec1d..2480b62d4f3 100644
--- a/src/loader/loader.h
+++ b/src/loader/loader.h
@@ -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.