From 4dd656e19a7cfcc4023538bc863583ed8b47352b Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Tue, 29 Nov 2022 10:39:52 -0800 Subject: [PATCH] dri: Add createNewScreen into the __DRI_MESA extension. Now the loaders don't have to switch on dri2/dri3/swrast. Reviewed-by: Adam Jackson Part-of: --- include/GL/internal/mesa_interface.h | 8 ++++++++ src/egl/drivers/dri2/egl_dri2.c | 26 ++++++-------------------- src/gallium/frontends/dri/dri2.c | 1 + src/gallium/frontends/dri/dri_util.c | 2 +- src/gallium/frontends/dri/dri_util.h | 6 ++++++ src/gallium/frontends/dri/drisw.c | 1 + src/gallium/frontends/dri/kopper.c | 1 + src/gbm/backends/dri/gbm_dri.c | 19 ++++++------------- 8 files changed, 30 insertions(+), 34 deletions(-) diff --git a/include/GL/internal/mesa_interface.h b/include/GL/internal/mesa_interface.h index 8e3ed9c..bfe4a55 100644 --- a/include/GL/internal/mesa_interface.h +++ b/include/GL/internal/mesa_interface.h @@ -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 */ diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 8be1436..f2d3b05 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -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"); diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index caff7bf..ddca70c 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -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. */ diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 201b482..664955f 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -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, diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index 84fbfba..3da8b59 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -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); diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index ade9565..271d76a 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -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. */ diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 4aa05f4..fb42ac4 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -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[] = { diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 18a2273..11a6ba9 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -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; -- 2.7.4