dri: pass through a type enum for creating screen instead of driver_extensions

the caller always knows what type of screen this will be, which means
it's finally possible to kill off passing a vtable here

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30524>
This commit is contained in:
Mike Blumenkrantz 2024-07-30 15:02:10 -04:00 committed by Marge Bot
parent 4246432c3e
commit 1de7c86bc1
12 changed files with 73 additions and 26 deletions

View file

@ -804,6 +804,14 @@ dri2_create_screen(_EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
char *driver_name_display_gpu;
enum dri_screen_type type = DRI_SCREEN_DRI3;
if (dri2_dpy->kopper)
type = DRI_SCREEN_KOPPER;
else if (dri2_dpy->swrast_not_kms)
type = DRI_SCREEN_SWRAST;
else if (dri2_dpy->swrast)
type = DRI_SCREEN_KMS_SWRAST;
if (dri2_dpy->fd_render_gpu != dri2_dpy->fd_display_gpu) {
driver_name_display_gpu =
@ -815,7 +823,7 @@ dri2_create_screen(_EGLDisplay *disp)
if (strcmp(dri2_dpy->driver_name, driver_name_display_gpu) == 0) {
dri2_dpy->dri_screen_display_gpu = driCreateNewScreen3(
0, dri2_dpy->fd_display_gpu, dri2_dpy->loader_extensions,
dri2_dpy->driver_extensions, &dri2_dpy->driver_configs, false, disp);
type, &dri2_dpy->driver_configs, false, disp);
}
free(driver_name_display_gpu);
}
@ -823,7 +831,7 @@ dri2_create_screen(_EGLDisplay *disp)
int screen_fd = dri2_dpy->swrast ? -1 : dri2_dpy->fd_render_gpu;
dri2_dpy->dri_screen_render_gpu = driCreateNewScreen3(
0, screen_fd, dri2_dpy->loader_extensions, dri2_dpy->driver_extensions,
0, screen_fd, dri2_dpy->loader_extensions, type,
&dri2_dpy->driver_configs, false, disp);
if (dri2_dpy->dri_screen_render_gpu == NULL) {

View file

@ -2070,7 +2070,7 @@ dri2_create_drawable(struct dri_screen *screen, const struct gl_config *visual,
*
* Returns the struct gl_config supported by this driver.
*/
static const __DRIconfig **
const __DRIconfig **
dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIconfig **configs;
@ -2106,7 +2106,7 @@ fail:
*
* Returns the struct gl_config supported by this driver.
*/
static const __DRIconfig **
const __DRIconfig **
dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
#if defined(HAVE_SWRAST)
@ -2153,7 +2153,6 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.version_string = MESA_INTERFACE_VERSION_STRING,
.createContext = driCreateContextAttribs,
.initScreen = dri2_init_screen,
.createNewScreen3 = driCreateNewScreen3,
};
/* This is the table of extensions that the loader will dlsym() for. */
@ -2168,7 +2167,6 @@ static const struct __DRImesaCoreExtensionRec swkmsMesaCoreExtension = {
.version_string = MESA_INTERFACE_VERSION_STRING,
.createContext = driCreateContextAttribs,
.initScreen = dri_swrast_kms_init_screen,
.createNewScreen3 = driCreateNewScreen3,
};
const __DRIextension *dri_swrast_kms_driver_extensions[] = {

View file

@ -63,6 +63,8 @@ struct dri_screen
int max_gl_es1_version;
int max_gl_es2_version;
enum dri_screen_type type;
const __DRIswrastLoaderExtension *swrast_loader;
const __DRIkopperLoaderExtension *kopper_loader;
@ -213,6 +215,15 @@ dri_release_screen(struct dri_screen * screen);
void
dri_destroy_screen(struct dri_screen *screen);
const __DRIconfig **
dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
extern const struct __DriverAPIRec dri_swrast_kms_driver_api;
extern const __DRIextension *dri_swrast_kms_driver_extensions[];
extern const struct __DriverAPIRec galliumdrm_driver_api;

View file

@ -101,23 +101,15 @@ setupLoaderExtensions(struct dri_screen *screen,
__DRIscreen *
driCreateNewScreen3(int scrn, int fd,
const __DRIextension **loader_extensions,
const __DRIextension **driver_extensions,
enum dri_screen_type type,
const __DRIconfig ***driver_configs, bool driver_name_is_inferred, void *data)
{
struct dri_screen *screen;
const __DRImesaCoreExtension *mesa = NULL;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
return NULL;
assert(driver_extensions);
for (int i = 0; driver_extensions[i]; i++) {
if (strcmp(driver_extensions[i]->name, __DRI_MESA) == 0) {
mesa = (__DRImesaCoreExtension *)driver_extensions[i];
}
}
setupLoaderExtensions(screen, loader_extensions);
// dri2 drivers require working invalidate
if (fd != -1 && !screen->dri2.useInvalidate) {
@ -129,6 +121,7 @@ driCreateNewScreen3(int scrn, int fd,
screen->fd = fd;
screen->myNum = scrn;
screen->type = type;
/* Option parsing before ->InitScreen(), as some options apply there. */
driParseOptionInfo(&screen->optionInfo,
@ -138,7 +131,22 @@ driCreateNewScreen3(int scrn, int fd,
(void) mtx_init(&screen->opencl_func_mutex, mtx_plain);
*driver_configs = mesa->initScreen(screen, driver_name_is_inferred);
switch (type) {
case DRI_SCREEN_DRI3:
*driver_configs = dri2_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_KOPPER:
*driver_configs = kopper_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_SWRAST:
*driver_configs = drisw_init_screen(screen, driver_name_is_inferred);
break;
case DRI_SCREEN_KMS_SWRAST:
*driver_configs = dri_swrast_kms_init_screen(screen, driver_name_is_inferred);
break;
default:
unreachable("unknown dri screen type");
}
if (*driver_configs == NULL) {
dri_destroy_screen(screen);
return NULL;

View file

@ -54,6 +54,12 @@ struct __DRIconfigRec {
struct gl_config modes;
};
enum dri_screen_type {
DRI_SCREEN_DRI3,
DRI_SCREEN_KOPPER,
DRI_SCREEN_SWRAST,
DRI_SCREEN_KMS_SWRAST,
};
/**
* Description of the attributes used to create a config.
@ -100,7 +106,7 @@ struct __DriverContextConfig {
PUBLIC __DRIscreen *
driCreateNewScreen3(int scrn, int fd,
const __DRIextension **loader_extensions,
const __DRIextension **driver_extensions,
enum dri_screen_type type,
const __DRIconfig ***driver_configs, bool driver_name_is_inferred, void *data);
PUBLIC __DRIcontext *
driCreateContextAttribs(__DRIscreen *psp, int api,

View file

@ -624,7 +624,7 @@ drisw_create_drawable(struct dri_screen *screen, const struct gl_config * visual
return drawable;
}
static const __DRIconfig **
const __DRIconfig **
drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIswrastLoaderExtension *loader = screen->swrast_loader;
@ -681,7 +681,6 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.version_string = MESA_INTERFACE_VERSION_STRING,
.createContext = driCreateContextAttribs,
.initScreen = drisw_init_screen,
.createNewScreen3 = driCreateNewScreen3,
};
/* This is the table of extensions that the loader will dlsym() for. */

View file

@ -62,7 +62,7 @@ kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual
const __DRIkopperExtension driKopperExtension;
static const __DRIconfig **
const __DRIconfig **
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
const __DRIconfig **configs;
@ -887,7 +887,6 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = {
.version_string = MESA_INTERFACE_VERSION_STRING,
.createContext = driCreateContextAttribs,
.initScreen = kopper_init_screen,
.createNewScreen3 = driCreateNewScreen3,
};
const __DRIextension *galliumvk_driver_extensions[] = {

View file

@ -33,3 +33,11 @@ kopperQueryBufferAge(__DRIdrawable *dPriv)
{
return 0;
}
const __DRIconfig **
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred);
const __DRIconfig **
kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
{
return NULL;
}

View file

@ -254,6 +254,15 @@ static int
dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name, bool driver_name_is_inferred)
{
bool swrast = driver_name == NULL; /* If it's pure swrast, not just swkms. */
enum dri_screen_type type = DRI_SCREEN_SWRAST;
if (!swrast) {
if (!strcmp(driver_name, "zink"))
type = DRI_SCREEN_KOPPER;
else if (!strcmp(driver_name, "kms_swrast"))
type = DRI_SCREEN_KMS_SWRAST;
else
type = DRI_SCREEN_DRI3;
}
dri->driver_name = swrast ? strdup("swrast") : driver_name;
@ -270,7 +279,7 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name, bool
dri->loader_extensions = gbm_dri_screen_extensions;
dri->screen = driCreateNewScreen3(0, swrast ? -1 : dri->base.v0.fd,
dri->loader_extensions,
dri->driver_extensions,
type,
&dri->driver_configs, driver_name_is_inferred, dri);
if (dri->screen == NULL)
goto fail;

View file

@ -902,7 +902,7 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
if (extensions == NULL)
goto handle_error;
psc->driScreen = driCreateNewScreen3(screen, psc->fd, loader_extensions, extensions,
psc->driScreen = driCreateNewScreen3(screen, psc->fd, loader_extensions, DRI_SCREEN_DRI3,
&driver_configs, driver_name_is_inferred, psc);
if (psc->driScreen == NULL) {

View file

@ -752,7 +752,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
if (strcmp(driverName, driverNameDisplayGPU) == 0) {
psc->driScreenDisplayGPU = driCreateNewScreen3(screen, psc->fd_display_gpu,
loader_extensions,
extensions,
DRI_SCREEN_DRI3,
&driver_configs, driver_name_is_inferred, psc);
}
@ -762,7 +762,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
psc->driScreenRenderGPU = driCreateNewScreen3(screen, psc->fd_render_gpu,
loader_extensions,
extensions,
DRI_SCREEN_DRI3,
&driver_configs, driver_name_is_inferred, psc);
if (psc->driScreenRenderGPU == NULL) {

View file

@ -865,7 +865,8 @@ driswCreateScreen(int screen, struct glx_display *priv, enum glx_driver glx_driv
else
loader_extensions_local = loader_extensions_shm;
psc->driScreen = driCreateNewScreen3(screen, -1, loader_extensions_local, extensions,
psc->driScreen = driCreateNewScreen3(screen, -1, loader_extensions_local,
glx_driver ? DRI_SCREEN_KOPPER : DRI_SCREEN_SWRAST,
&driver_configs, driver_name_is_inferred, psc);
if (psc->driScreen == NULL) {
if (!glx_driver || !driver_name_is_inferred)