From 133e2f8ac395fff20efa9fb12021003e1af995db Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Tue, 29 Nov 2022 12:04:21 -0800 Subject: [PATCH] dri: Add createContext hook to __DRI_MESA. Again, reduces switching on driver type in the loader. Reviewed-by: Adam Jackson Acked-by: Eric Engestrom Part-of: --- include/GL/internal/mesa_interface.h | 2 ++ src/egl/drivers/dri2/egl_dri2.c | 41 ++++++---------------------- src/gallium/frontends/dri/dri2.c | 2 ++ src/gallium/frontends/dri/dri_util.c | 2 +- src/gallium/frontends/dri/dri_util.h | 8 ++++++ src/gallium/frontends/dri/drisw.c | 1 + src/gallium/frontends/dri/kopper.c | 1 + 7 files changed, 24 insertions(+), 33 deletions(-) diff --git a/include/GL/internal/mesa_interface.h b/include/GL/internal/mesa_interface.h index 2f7f8e46818..f0a29503e46 100644 --- a/include/GL/internal/mesa_interface.h +++ b/include/GL/internal/mesa_interface.h @@ -57,6 +57,8 @@ struct __DRImesaCoreExtensionRec { */ __DRIcreateNewScreen2Func createNewScreen; + __DRIcreateContextAttribsFunc createContext; + /* driver function for finishing initialization inside createNewScreen(). */ const __DRIconfig **(*initScreen)(struct dri_screen *screen); }; diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index f2d3b055ae5..fd7799a8180 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1505,38 +1505,15 @@ dri2_create_context(_EGLDisplay *disp, _EGLConfig *conf, &num_attribs)) goto cleanup; - if (dri2_dpy->image_driver) { - dri2_ctx->dri_context = - dri2_dpy->image_driver->createContextAttribs(dri2_dpy->dri_screen, - api, - dri_config, - shared, - num_attribs / 2, - ctx_attribs, - & error, - dri2_ctx); - } else if (dri2_dpy->dri2) { - dri2_ctx->dri_context = - dri2_dpy->dri2->createContextAttribs(dri2_dpy->dri_screen, - api, - dri_config, - shared, - num_attribs / 2, - ctx_attribs, - & error, - dri2_ctx); - } else { - assert(dri2_dpy->swrast); - dri2_ctx->dri_context = - dri2_dpy->swrast->createContextAttribs(dri2_dpy->dri_screen, - api, - dri_config, - shared, - num_attribs / 2, - ctx_attribs, - & error, - dri2_ctx); - } + dri2_ctx->dri_context = + dri2_dpy->mesa->createContext(dri2_dpy->dri_screen, + api, + dri_config, + shared, + num_attribs / 2, + ctx_attribs, + &error, + dri2_ctx); dri2_create_context_attribs_error(error); if (!dri2_ctx->dri_context) diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index cc4e289676e..6bb08568168 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -2401,6 +2401,7 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { .base = { __DRI_MESA, 1 }, .version_string = MESA_INTERFACE_VERSION_STRING, .createNewScreen = driCreateNewScreen2, + .createContext = driCreateContextAttribs, .initScreen = dri2_init_screen, }; @@ -2418,6 +2419,7 @@ static const struct __DRImesaCoreExtensionRec swkmsMesaCoreExtension = { .base = { __DRI_MESA, 1 }, .version_string = MESA_INTERFACE_VERSION_STRING, .createNewScreen = driCreateNewScreen2, + .createContext = driCreateContextAttribs, .initScreen = dri_swrast_kms_init_screen, }; diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index f1a185962fd..61f74b7d9fd 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -433,7 +433,7 @@ validate_context_version(struct dri_screen *screen, /*****************************************************************/ /*@{*/ -static __DRIcontext * +__DRIcontext * driCreateContextAttribs(__DRIscreen *psp, int api, const __DRIconfig *config, __DRIcontext *shared, diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index 693fceb379a..a358487f006 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -108,6 +108,14 @@ driCreateNewScreen2(int scrn, int fd, const __DRIextension **loader_extensions, const __DRIextension **driver_extensions, const __DRIconfig ***driver_configs, void *data); +__DRIcontext * +driCreateContextAttribs(__DRIscreen *psp, int api, + const __DRIconfig *config, + __DRIcontext *shared, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error, + void *data); extern uint32_t driGLFormatToImageFormat(mesa_format format); diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 63bcf7a949e..92d853ff3df 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -627,6 +627,7 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { .base = { __DRI_MESA, 1 }, .version_string = MESA_INTERFACE_VERSION_STRING, .createNewScreen = driCreateNewScreen2, + .createContext = driCreateContextAttribs, .initScreen = drisw_init_screen, }; diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index d19509ac8a9..61c5dc22c21 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -955,6 +955,7 @@ static const struct __DRImesaCoreExtensionRec mesaCoreExtension = { .base = { __DRI_MESA, 1 }, .version_string = MESA_INTERFACE_VERSION_STRING, .createNewScreen = driCreateNewScreen2, + .createContext = driCreateContextAttribs, .initScreen = kopper_init_screen, };