dri: Add createNewScreen into the __DRI_MESA extension.

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>
This commit is contained in:
Emma Anholt
2022-11-29 10:39:52 -08:00
committed by Marge Bot
parent fbf9f671e4
commit 4dd656e19a
8 changed files with 30 additions and 34 deletions

View File

@@ -46,6 +46,14 @@ struct __DRImesaCoreExtensionRec {
*/ */
#define MESA_INTERFACE_VERSION_STRING PACKAGE_VERSION MESA_GIT_SHA1 #define MESA_INTERFACE_VERSION_STRING PACKAGE_VERSION MESA_GIT_SHA1
const char *version_string; 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 */ #endif /* MESA_INTERFACE_H */

View File

@@ -1008,26 +1008,12 @@ dri2_create_screen(_EGLDisplay *disp)
{ {
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
if (dri2_dpy->image_driver) { int screen_fd = dri2_dpy->swrast ? -1 : dri2_dpy->fd;
dri2_dpy->dri_screen = dri2_dpy->dri_screen = dri2_dpy->mesa->createNewScreen(0, screen_fd,
dri2_dpy->image_driver->createNewScreen2(0, dri2_dpy->fd, dri2_dpy->loader_extensions,
dri2_dpy->loader_extensions, dri2_dpy->driver_extensions,
dri2_dpy->driver_extensions, &dri2_dpy->driver_configs,
&dri2_dpy->driver_configs, disp);
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);
}
if (dri2_dpy->dri_screen == NULL) { if (dri2_dpy->dri_screen == NULL) {
_eglLog(_EGL_WARNING, "egl: failed to create dri2 screen"); _eglLog(_EGL_WARNING, "egl: failed to create dri2 screen");

View File

@@ -2410,6 +2410,7 @@ static const struct __DRIBackendVtableExtensionRec galliumdrm_vtable = {
static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.base = { __DRI_MESA, 1 }, .base = { __DRI_MESA, 1 },
.version_string = MESA_INTERFACE_VERSION_STRING, .version_string = MESA_INTERFACE_VERSION_STRING,
.createNewScreen = driCreateNewScreen2,
}; };
/* This is the table of extensions that the loader will dlsym() for. */ /* This is the table of extensions that the loader will dlsym() for. */

View 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 * It's used to create global state for the driver across contexts on the same
* Display. * Display.
*/ */
static __DRIscreen * __DRIscreen *
driCreateNewScreen2(int scrn, int fd, driCreateNewScreen2(int scrn, int fd,
const __DRIextension **loader_extensions, const __DRIextension **loader_extensions,
const __DRIextension **driver_extensions, const __DRIextension **driver_extensions,

View File

@@ -108,6 +108,12 @@ struct __DriverContextConfig {
#define __DRIVER_CONTEXT_ATTRIB_NO_ERROR (1 << 3) #define __DRIVER_CONTEXT_ATTRIB_NO_ERROR (1 << 3)
#define __DRIVER_CONTEXT_ATTRIB_PROTECTED (1 << 4) #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 extern uint32_t
driGLFormatToImageFormat(mesa_format format); driGLFormatToImageFormat(mesa_format format);

View File

@@ -636,6 +636,7 @@ const __DRIcopySubBufferExtension driSWCopySubBufferExtension = {
static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.base = { __DRI_MESA, 1 }, .base = { __DRI_MESA, 1 },
.version_string = MESA_INTERFACE_VERSION_STRING, .version_string = MESA_INTERFACE_VERSION_STRING,
.createNewScreen = driCreateNewScreen2,
}; };
/* This is the table of extensions that the loader will dlsym() for. */ /* This is the table of extensions that the loader will dlsym() for. */

View File

@@ -959,6 +959,7 @@ static const struct __DRIBackendVtableExtensionRec galliumvk_vtable = {
static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.base = { __DRI_MESA, 1 }, .base = { __DRI_MESA, 1 },
.version_string = MESA_INTERFACE_VERSION_STRING, .version_string = MESA_INTERFACE_VERSION_STRING,
.createNewScreen = driCreateNewScreen2,
}; };
const __DRIextension *galliumvk_driver_extensions[] = { const __DRIextension *galliumvk_driver_extensions[] = {

View 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->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) { 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); extensions = dri->core->getExtensions(dri->screen);
if (!loader_bind_extensions(dri, dri_core_extensions, if (!loader_bind_extensions(dri, dri_core_extensions,
ARRAY_SIZE(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; ret = -1;
goto free_screen; 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; dri->lookup_image = NULL;