diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 75623a6f616..f53c7871c09 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -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) { diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index b70b472aaed..773bdd9524b 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -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[] = { diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h index 14304771071..54048acd1f0 100644 --- a/src/gallium/frontends/dri/dri_screen.h +++ b/src/gallium/frontends/dri/dri_screen.h @@ -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; diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index cc4f582d28f..140e5fa65d5 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -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; diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index d463f1ff820..5009a6e5c9a 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -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, diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index abc9f4b876e..b13bfc99f93 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -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. */ diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 9ba51728f8b..4521cc1bae0 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -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[] = { diff --git a/src/gallium/frontends/dri/kopper_stubs.c b/src/gallium/frontends/dri/kopper_stubs.c index 3a5292ba446..3182add37ce 100644 --- a/src/gallium/frontends/dri/kopper_stubs.c +++ b/src/gallium/frontends/dri/kopper_stubs.c @@ -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; +} diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 0c39ddaf015..32bd39d4c4b 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -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; diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 4b5fe9c836b..642bb600102 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -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) { diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index fb2e29e252b..3f16acbada0 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -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) { diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 2ac591333fe..7b107cd95a3 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -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)