mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 02:30:12 +01:00
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:
parent
1c5b61eefb
commit
1a0ec8e8d3
7 changed files with 41 additions and 46 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue