mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 06:50:11 +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;
|
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) {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue