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:
@@ -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 */
|
||||||
|
@@ -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");
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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,
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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[] = {
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user