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>
This commit is contained in:
Yogesh Mohan Marimuthu 2022-12-17 22:51:08 +05:30 committed by Marge Bot
parent 1c5b61eefb
commit 1a0ec8e8d3
7 changed files with 41 additions and 46 deletions

View file

@ -2229,13 +2229,8 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
goto cleanup; goto cleanup;
} }
dri2_dpy->fd_display_gpu = fcntl(dri2_dpy->fd_render_gpu, F_DUPFD_CLOEXEC, 3); dri2_dpy->is_different_gpu =
dri2_dpy->fd_render_gpu = loader_get_user_preferred_fd(dri2_dpy->fd_render_gpu, loader_get_user_preferred_fd(&dri2_dpy->fd_render_gpu, &dri2_dpy->fd_display_gpu);
&dri2_dpy->is_different_gpu);
if (!dri2_dpy->is_different_gpu) {
close(dri2_dpy->fd_display_gpu);
dri2_dpy->fd_display_gpu = -1;
}
dev = _eglAddDevice(dri2_dpy->fd_render_gpu, false); dev = _eglAddDevice(dri2_dpy->fd_render_gpu, false);
if (!dev) { if (!dev) {

View file

@ -635,13 +635,8 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
return EGL_FALSE; return EGL_FALSE;
} }
dri2_dpy->fd_display_gpu = fcntl(dri2_dpy->fd_render_gpu, F_DUPFD_CLOEXEC, 3); dri2_dpy->is_different_gpu =
dri2_dpy->fd_render_gpu = loader_get_user_preferred_fd(dri2_dpy->fd_render_gpu, loader_get_user_preferred_fd(&dri2_dpy->fd_render_gpu, &dri2_dpy->fd_display_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->driver_name = loader_get_driver_for_fd(dri2_dpy->fd_render_gpu); dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd_render_gpu);
if (!dri2_dpy->driver_name) { if (!dri2_dpy->driver_name) {

View file

@ -811,7 +811,7 @@ vl_dri3_screen_create(Display *display, int screen)
fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFD, FD_CLOEXEC);
free(open_reply); 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_cookie = xcb_get_geometry(scrn->conn, RootWindow(display, screen));
geom_reply = xcb_get_geometry_reply(scrn->conn, geom_cookie, NULL); geom_reply = xcb_get_geometry_reply(scrn->conn, geom_cookie, NULL);

View file

@ -230,7 +230,7 @@ drm_create_adapter( int fd,
/* Although the fd is provided from external source, mesa/nine /* Although the fd is provided from external source, mesa/nine
* takes ownership of it. */ * 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->fd = fd;
ctx->base.linear_framebuffer = different_device; ctx->base.linear_framebuffer = different_device;

View file

@ -821,12 +821,8 @@ dri3_create_screen(int screen, struct glx_display * priv)
return NULL; return NULL;
} }
psc->fd_display_gpu = fcntl(psc->fd_render_gpu, F_DUPFD_CLOEXEC, 3); psc->is_different_gpu =
psc->fd_render_gpu = loader_get_user_preferred_fd(psc->fd_render_gpu, &psc->is_different_gpu); loader_get_user_preferred_fd(&psc->fd_render_gpu, &psc->fd_display_gpu);
if (!psc->is_different_gpu) {
close(psc->fd_display_gpu);
psc->fd_display_gpu = -1;
}
driverName = loader_get_driver_for_fd(psc->fd_render_gpu); driverName = loader_get_driver_for_fd(psc->fd_render_gpu);
if (!driverName) { if (!driverName) {

View file

@ -325,7 +325,7 @@ static char *drm_get_id_path_tag_for_fd(int fd)
return tag; 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"); const char *dri_prime = getenv("DRI_PRIME");
char *default_tag, *prime = NULL; 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(); prime = loader_get_dri_config_device_id();
#endif #endif
if (prime == NULL) { if (prime == NULL)
*different_device = false; goto no_prime_gpu_offloading;
return default_fd; else
} else {
prime_is_vid_did = sscanf(prime, "%hx:%hx", &vendor_id, &device_id) == 2; 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) if (default_tag == NULL)
goto err; goto err;
@ -394,20 +392,30 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
if (fd < 0) if (fd < 0)
goto err; goto err;
close(default_fd); bool is_render_and_display_gpu_diff = !!strcmp(default_tag, prime);
if (original_fd) {
*different_device = !!strcmp(default_tag, prime); 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(default_tag);
free(prime); free(prime);
return fd; return is_render_and_display_gpu_diff;
err: err:
*different_device = false;
free(default_tag); free(default_tag);
free(prime); free(prime);
return default_fd; no_prime_gpu_offloading:
if (original_fd)
*original_fd = *fd_render_gpu;
return false;
} }
#else #else
int int
@ -422,10 +430,10 @@ loader_get_render_node(dev_t device)
return NULL; return NULL;
} }
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)
{ if (original_fd)
*different_device = false; *original_fd = *fd_render_gpu;
return default_fd; return false;
} }
#endif #endif

View file

@ -70,13 +70,14 @@ loader_open_driver(const char *driver_name,
char * char *
loader_get_device_name_for_fd(int fd); loader_get_device_name_for_fd(int fd);
/* Function to get a different device than the one we are to use by default, /* For dri prime gpu offloading this function will take current render fd and possibly
* if the user requests so and it is possible. The initial fd will be closed * update it with new prime gpu offloading fd. For dri prime gpu offloading optionally
* if necessary. The returned fd is potentially a render-node. * this function can return the original fd. Also this function returns true/false based
* on render gpu is different from display gpu.
*/ */
int bool
loader_get_user_preferred_fd(int default_fd, bool *different_device); 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 /* for logging.. keep this aligned with egllog.h so we can just use
* _eglLog directly. * _eglLog directly.