mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 05:00:09 +01:00
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:
parent
4246432c3e
commit
1de7c86bc1
12 changed files with 73 additions and 26 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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[] = {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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[] = {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue