dri: Add createNewScreen into the __DRI_MESA extension.
authorEmma Anholt <emma@anholt.net>
Tue, 29 Nov 2022 18:39:52 +0000 (10:39 -0800)
committerMarge Bot <emma+marge@anholt.net>
Mon, 5 Dec 2022 19:26:41 +0000 (19:26 +0000)
Now the loaders don't have to switch on dri2/dri3/swrast.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20069>

include/GL/internal/mesa_interface.h
src/egl/drivers/dri2/egl_dri2.c
src/gallium/frontends/dri/dri2.c
src/gallium/frontends/dri/dri_util.c
src/gallium/frontends/dri/dri_util.h
src/gallium/frontends/dri/drisw.c
src/gallium/frontends/dri/kopper.c
src/gbm/backends/dri/gbm_dri.c

index 8e3ed9c..bfe4a55 100644 (file)
@@ -46,6 +46,14 @@ struct __DRImesaCoreExtensionRec {
     */
 #define MESA_INTERFACE_VERSION_STRING PACKAGE_VERSION MESA_GIT_SHA1
    const char *version_string;
+
+   /* Screen creation function regardless of DRI2, image, or swrast backend.
+    * (Nothing uses the old __DRI_CORE screen create).
+    *
+    * If not associated with a DRM fd (non-swkms swrast), the fd argument should
+    * be -1.
+    */
+   __DRIcreateNewScreen2Func createNewScreen;
 };
 
 #endif /* MESA_INTERFACE_H */
index 8be1436..f2d3b05 100644 (file)
@@ -1008,26 +1008,12 @@ dri2_create_screen(_EGLDisplay *disp)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
 
-   if (dri2_dpy->image_driver) {
-      dri2_dpy->dri_screen =
-         dri2_dpy->image_driver->createNewScreen2(0, dri2_dpy->fd,
-                                                  dri2_dpy->loader_extensions,
-                                                  dri2_dpy->driver_extensions,
-                                                  &dri2_dpy->driver_configs,
-                                                  disp);
-   } else if (dri2_dpy->dri2) {
-      dri2_dpy->dri_screen =
-         dri2_dpy->dri2->createNewScreen2(0, dri2_dpy->fd,
-                                          dri2_dpy->loader_extensions,
-                                          dri2_dpy->driver_extensions,
-                                          &dri2_dpy->driver_configs, disp);
-   } else {
-      assert(dri2_dpy->swrast);
-      dri2_dpy->dri_screen =
-         dri2_dpy->swrast->createNewScreen2(0, dri2_dpy->loader_extensions,
-                                             dri2_dpy->driver_extensions,
-                                             &dri2_dpy->driver_configs, disp);
-   }
+   int screen_fd = dri2_dpy->swrast ? -1 : dri2_dpy->fd;
+   dri2_dpy->dri_screen = dri2_dpy->mesa->createNewScreen(0, screen_fd,
+                                                          dri2_dpy->loader_extensions,
+                                                          dri2_dpy->driver_extensions,
+                                                          &dri2_dpy->driver_configs,
+                                                          disp);
 
    if (dri2_dpy->dri_screen == NULL) {
       _eglLog(_EGL_WARNING, "egl: failed to create dri2 screen");
index caff7bf..ddca70c 100644 (file)
@@ -2410,6 +2410,7 @@ static const struct __DRIBackendVtableExtensionRec galliumdrm_vtable = {
 static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
    .base = { __DRI_MESA, 1 },
    .version_string = MESA_INTERFACE_VERSION_STRING,
+   .createNewScreen = driCreateNewScreen2,
 };
 
 /* This is the table of extensions that the loader will dlsym() for. */
index 201b482..664955f 100644 (file)
@@ -94,7 +94,7 @@ setupLoaderExtensions(struct dri_screen *screen,
  * It's used to create global state for the driver across contexts on the same
  * Display.
  */
-static __DRIscreen *
+__DRIscreen *
 driCreateNewScreen2(int scrn, int fd,
                     const __DRIextension **loader_extensions,
                     const __DRIextension **driver_extensions,
index 84fbfba..3da8b59 100644 (file)
@@ -108,6 +108,12 @@ struct __DriverContextConfig {
 #define __DRIVER_CONTEXT_ATTRIB_NO_ERROR         (1 << 3)
 #define __DRIVER_CONTEXT_ATTRIB_PROTECTED        (1 << 4)
 
+__DRIscreen *
+driCreateNewScreen2(int scrn, int fd,
+                    const __DRIextension **loader_extensions,
+                    const __DRIextension **driver_extensions,
+                    const __DRIconfig ***driver_configs, void *data);
+
 extern uint32_t
 driGLFormatToImageFormat(mesa_format format);
 
index ade9565..271d76a 100644 (file)
@@ -636,6 +636,7 @@ const __DRIcopySubBufferExtension driSWCopySubBufferExtension = {
 static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
    .base = { __DRI_MESA, 1 },
    .version_string = MESA_INTERFACE_VERSION_STRING,
+   .createNewScreen = driCreateNewScreen2,
 };
 
 /* This is the table of extensions that the loader will dlsym() for. */
index 4aa05f4..fb42ac4 100644 (file)
@@ -959,6 +959,7 @@ static const struct __DRIBackendVtableExtensionRec galliumvk_vtable = {
 static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
    .base = { __DRI_MESA, 1 },
    .version_string = MESA_INTERFACE_VERSION_STRING,
+   .createNewScreen = driCreateNewScreen2,
 };
 
 const __DRIextension *galliumvk_driver_extensions[] = {
index 18a2273..11a6ba9 100644 (file)
@@ -368,15 +368,14 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name)
    }
 
    dri->loader_extensions = gbm_dri_screen_extensions;
+   dri->screen = dri->mesa->createNewScreen(0, swrast ? -1 : dri->base.v0.fd,
+                                            dri->loader_extensions,
+                                            dri->driver_extensions,
+                                            &dri->driver_configs, dri);
+   if (dri->screen == NULL)
+      return -1;
 
    if (!swrast) {
-      dri->screen = dri->dri2->createNewScreen2(0, dri->base.v0.fd,
-                                                dri->loader_extensions,
-                                                dri->driver_extensions,
-                                                &dri->driver_configs, dri);
-      if (dri->screen == NULL)
-         return -1;
-
       extensions = dri->core->getExtensions(dri->screen);
       if (!loader_bind_extensions(dri, dri_core_extensions,
                                   ARRAY_SIZE(dri_core_extensions),
@@ -384,12 +383,6 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name)
          ret = -1;
          goto free_screen;
       }
-   } else {
-      dri->screen = dri->swrast->createNewScreen2(0, dri->loader_extensions,
-                                                  dri->driver_extensions,
-                                                  &dri->driver_configs, dri);
-      if (dri->screen == NULL)
-         return -1;
    }
 
    dri->lookup_image = NULL;