egl: create DRI screen for display GPU in case of prime
authorYogesh Mohanmarimuthu <yogesh.mohanmarimuthu@amd.com>
Mon, 18 Oct 2021 04:22:16 +0000 (09:52 +0530)
committerMarge Bot <emma+marge@anholt.net>
Tue, 24 Jan 2023 12:51:35 +0000 (12:51 +0000)
The created DRI screen can be used to allocate VRAM memory from
display GPU in case of prime.

v2: remove extra whitespace (Marek Olšák)

Signed-off-by: Yogesh Mohanmarimuthu <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>

src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/dri2/egl_dri2.h

index d82eb29..dcdf0b3 100644 (file)
@@ -980,6 +980,25 @@ EGLBoolean
 dri2_create_screen(_EGLDisplay *disp)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+   char *driver_name_display_gpu;
+
+   if (dri2_dpy->fd_display_gpu >= 0) {
+      driver_name_display_gpu = loader_get_driver_for_fd(dri2_dpy->fd_display_gpu);
+      if (driver_name_display_gpu) {
+         /* check if driver name is matching so that non mesa drivers
+          * will not crash.
+          */
+         if (strcmp(dri2_dpy->driver_name, driver_name_display_gpu) == 0) {
+            dri2_dpy->dri_screen_display_gpu =
+               dri2_dpy->mesa->createNewScreen(0, dri2_dpy->fd_display_gpu,
+                                               dri2_dpy->loader_extensions,
+                                               dri2_dpy->driver_extensions,
+                                               &dri2_dpy->driver_configs,
+                                               disp);
+         }
+         free(driver_name_display_gpu);
+      }
+   }
 
    int screen_fd = dri2_dpy->swrast ? -1 : dri2_dpy->fd;
    dri2_dpy->dri_screen = dri2_dpy->mesa->createNewScreen(0, screen_fd,
@@ -1123,7 +1142,11 @@ dri2_display_destroy(_EGLDisplay *disp)
    if (dri2_dpy->own_dri_screen) {
       if (dri2_dpy->vtbl && dri2_dpy->vtbl->close_screen_notify)
          dri2_dpy->vtbl->close_screen_notify(disp);
+
       dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
+
+      if (dri2_dpy->dri_screen_display_gpu)
+         dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen_display_gpu);
    }
    if (dri2_dpy->fd >= 0)
       close(dri2_dpy->fd);
index a1d77f5..31c0d40 100644 (file)
@@ -223,6 +223,7 @@ struct dri2_egl_display
    int dri2_major;
    int dri2_minor;
    __DRIscreen *dri_screen;
+   __DRIscreen *dri_screen_display_gpu;
    bool own_dri_screen;
    const __DRIconfig **driver_configs;
    void *driver;