diff options
author | Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com> | 2022-12-17 22:51:08 +0530 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-01-24 12:51:35 +0000 |
commit | 1a0ec8e8d3750d580ded41158b782b8070ff0e0a (patch) | |
tree | eb3a25cbc077815452fed3903bfb9258a1f64529 | |
parent | 1c5b61eefb9be69256552cfde1caf3b7e1d29614 (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.c | 9 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_x11_dri3.c | 9 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_winsys_dri3.c | 2 | ||||
-rw-r--r-- | src/gallium/targets/d3dadapter9/drm.c | 2 | ||||
-rw-r--r-- | src/glx/dri3_glx.c | 8 | ||||
-rw-r--r-- | src/loader/loader.c | 46 | ||||
-rw-r--r-- | src/loader/loader.h | 11 |
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. |