glx: unify dri screen init

lot of duplication

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30619>
This commit is contained in:
Mike Blumenkrantz 2024-08-01 16:45:10 -04:00 committed by Marge Bot
parent 520572eb25
commit 7930fe5f01
5 changed files with 71 additions and 99 deletions

View file

@ -649,10 +649,8 @@ static const __DRIextension *loader_extensions[] = {
struct glx_screen * struct glx_screen *
dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_inferred) dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_inferred)
{ {
const __DRIconfig **driver_configs;
struct dri2_screen *psc; struct dri2_screen *psc;
__GLXDRIscreen *psp; __GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;
char *driverName = NULL, *loader_driverName, *deviceName, *tmp; char *driverName = NULL, *loader_driverName, *deviceName, *tmp;
drm_magic_t magic; drm_magic_t magic;
@ -662,10 +660,6 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
psc->fd = -1; psc->fd = -1;
if (!glx_screen_init(&psc->base, screen, priv)) {
free(psc);
return NULL;
}
if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen),
&driverName, &deviceName)) { &driverName, &deviceName)) {
@ -700,32 +694,13 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
driverName = loader_driverName; driverName = loader_driverName;
} }
psc->base.driverName = driverName; psc->base.driverName = driverName;
priv->driver = GLX_DRIVER_DRI2;
psc->base.frontend_screen = driCreateNewScreen3(screen, psc->fd, loader_extensions, DRI_SCREEN_DRI3, if (!dri_screen_init(&psc->base, priv, screen, psc->fd, loader_extensions, driver_name_is_inferred)) {
&driver_configs, driver_name_is_inferred,
priv->has_multibuffer, psc);
if (psc->base.frontend_screen == NULL) {
ErrorMessageF("glx: failed to create dri2 screen\n"); ErrorMessageF("glx: failed to create dri2 screen\n");
goto handle_error; goto handle_error;
} }
configs = driConvertConfigs(psc->base.configs, driver_configs);
visuals = driConvertConfigs(psc->base.visuals, driver_configs);
if (!configs || !visuals) {
ErrorMessageF("No matching fbConfigs or visuals found\n");
goto handle_error;
}
glx_config_destroy_list(psc->base.configs);
psc->base.configs = configs;
glx_config_destroy_list(psc->base.visuals);
psc->base.visuals = visuals;
psc->base.driver_configs = driver_configs;
psc->base.vtable = &dri_screen_vtable;
psc->base.context_vtable = &dri2_context_vtable; psc->base.context_vtable = &dri2_context_vtable;
psp = &psc->base.driScreen; psp = &psc->base.driScreen;
psp->deinitScreen = dri2DeinitScreen; psp->deinitScreen = dri2DeinitScreen;
@ -736,7 +711,6 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
psp->waitForSBC = NULL; psp->waitForSBC = NULL;
psp->setSwapInterval = NULL; psp->setSwapInterval = NULL;
psp->getSwapInterval = NULL; psp->getSwapInterval = NULL;
psp->bindTexImage = dri_bind_tex_image;
psp->getDrawableMSC = dri2DrawableGetMSC; psp->getDrawableMSC = dri2DrawableGetMSC;
psp->waitForMSC = dri2WaitForMSC; psp->waitForMSC = dri2WaitForMSC;
@ -758,7 +732,6 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
if (psc->show_fps_interval < 0) if (psc->show_fps_interval < 0)
psc->show_fps_interval = 0; psc->show_fps_interval = 0;
priv->driver = GLX_DRIVER_DRI2;
InfoMessageF("Using DRI2 for screen %d\n", screen); InfoMessageF("Using DRI2 for screen %d\n", screen);
@ -767,10 +740,6 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
handle_error: handle_error:
CriticalErrorMessageF("failed to load driver: %s\n", driverName); CriticalErrorMessageF("failed to load driver: %s\n", driverName);
if (configs)
glx_config_destroy_list(configs);
if (visuals)
glx_config_destroy_list(visuals);
if (psc->fd >= 0) if (psc->fd >= 0)
close(psc->fd); close(psc->fd);

View file

@ -494,7 +494,6 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
const __DRIconfig **driver_configs; const __DRIconfig **driver_configs;
struct dri3_screen *psc; struct dri3_screen *psc;
__GLXDRIscreen *psp; __GLXDRIscreen *psp;
struct glx_config *configs = NULL, *visuals = NULL;
char *driverName, *driverNameDisplayGPU; char *driverName, *driverNameDisplayGPU;
*return_zink = false; *return_zink = false;
@ -502,14 +501,8 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
if (psc == NULL) if (psc == NULL)
return NULL; return NULL;
psc->fd_render_gpu = -1;
psc->fd_display_gpu = -1; psc->fd_display_gpu = -1;
if (!glx_screen_init(&psc->base, screen, priv)) {
free(psc);
return NULL;
}
psc->fd_render_gpu = x11_dri3_open(c, RootWindow(priv->dpy, screen), None); psc->fd_render_gpu = x11_dri3_open(c, RootWindow(priv->dpy, screen), None);
if (psc->fd_render_gpu < 0) { if (psc->fd_render_gpu < 0) {
int conn_error = xcb_connection_has_error(c); int conn_error = xcb_connection_has_error(c);
@ -558,14 +551,9 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
free(driverNameDisplayGPU); free(driverNameDisplayGPU);
} }
} }
priv->driver = GLX_DRIVER_DRI3;
psc->base.frontend_screen = driCreateNewScreen3(screen, psc->fd_render_gpu, if (!dri_screen_init(&psc->base, priv, screen, psc->fd_render_gpu, loader_extensions, driver_name_is_inferred)) {
loader_extensions,
DRI_SCREEN_DRI3,
&driver_configs, driver_name_is_inferred,
priv->has_multibuffer, psc);
if (psc->base.frontend_screen == NULL) {
ErrorMessageF("glx: failed to create dri3 screen\n"); ErrorMessageF("glx: failed to create dri3 screen\n");
goto handle_error; goto handle_error;
} }
@ -573,22 +561,6 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
if (psc->fd_render_gpu == psc->fd_display_gpu) if (psc->fd_render_gpu == psc->fd_display_gpu)
psc->driScreenDisplayGPU = psc->base.frontend_screen; psc->driScreenDisplayGPU = psc->base.frontend_screen;
configs = driConvertConfigs(psc->base.configs, driver_configs);
visuals = driConvertConfigs(psc->base.visuals, driver_configs);
if (!configs || !visuals) {
ErrorMessageF("No matching fbConfigs or visuals found\n");
goto handle_error;
}
glx_config_destroy_list(psc->base.configs);
psc->base.configs = configs;
glx_config_destroy_list(psc->base.visuals);
psc->base.visuals = visuals;
psc->base.driver_configs = driver_configs;
psc->base.vtable = &dri_screen_vtable;
psc->base.context_vtable = &dri3_context_vtable; psc->base.context_vtable = &dri3_context_vtable;
psp = &psc->base.driScreen; psp = &psc->base.driScreen;
psp->deinitScreen = dri3_deinit_screen; psp->deinitScreen = dri3_deinit_screen;
@ -600,7 +572,6 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
psp->waitForSBC = dri3_wait_for_sbc; psp->waitForSBC = dri3_wait_for_sbc;
psp->setSwapInterval = dri3_set_swap_interval; psp->setSwapInterval = dri3_set_swap_interval;
psp->getSwapInterval = dri3_get_swap_interval; psp->getSwapInterval = dri3_get_swap_interval;
psp->bindTexImage = dri_bind_tex_image;
psp->maxSwapInterval = INT_MAX; psp->maxSwapInterval = INT_MAX;
/* when on a different gpu than the server, the server pixmaps /* when on a different gpu than the server, the server pixmaps
@ -621,7 +592,6 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
psc->prefer_back_buffer_reuse = value; psc->prefer_back_buffer_reuse = value;
} }
priv->driver = GLX_DRIVER_DRI3;
return &psc->base; return &psc->base;
@ -629,10 +599,6 @@ handle_error:
if (!*return_zink) if (!*return_zink)
CriticalErrorMessageF("failed to load driver: %s\n", driverName ? driverName : "(null)"); CriticalErrorMessageF("failed to load driver: %s\n", driverName ? driverName : "(null)");
if (configs)
glx_config_destroy_list(configs);
if (visuals)
glx_config_destroy_list(visuals);
if (psc->fd_render_gpu != psc->fd_display_gpu && psc->driScreenDisplayGPU) if (psc->fd_render_gpu != psc->fd_display_gpu && psc->driScreenDisplayGPU)
driDestroyScreen(psc->driScreenDisplayGPU); driDestroyScreen(psc->driScreenDisplayGPU);
psc->driScreenDisplayGPU = NULL; psc->driScreenDisplayGPU = NULL;

View file

@ -967,4 +967,67 @@ dri_bind_tex_image(__GLXDRIdrawable *base, int buffer, const int *attrib_list)
base->dri_drawable); base->dri_drawable);
} }
bool
dri_screen_init(struct glx_screen *psc, struct glx_display *priv, int screen, int fd, const __DRIextension **loader_extensions, bool driver_name_is_inferred)
{
const __DRIconfig **driver_configs;
struct glx_config *configs = NULL, *visuals = NULL;
if (!glx_screen_init(psc, screen, priv))
return false;
enum dri_screen_type type;
switch (psc->display->driver) {
case GLX_DRIVER_DRI3:
case GLX_DRIVER_DRI2:
type = DRI_SCREEN_DRI3;
break;
case GLX_DRIVER_ZINK_YES:
type = DRI_SCREEN_KOPPER;
break;
case GLX_DRIVER_SW:
type = DRI_SCREEN_SWRAST;
break;
default:
unreachable("unknown glx driver type");
}
psc->frontend_screen = driCreateNewScreen3(screen, fd,
loader_extensions,
type,
&driver_configs, driver_name_is_inferred,
psc->display->has_multibuffer, psc);
if (psc->frontend_screen == NULL) {
goto handle_error;
}
configs = driConvertConfigs(psc->configs, driver_configs);
visuals = driConvertConfigs(psc->visuals, driver_configs);
if (!configs || !visuals) {
ErrorMessageF("No matching fbConfigs or visuals found\n");
goto handle_error;
}
glx_config_destroy_list(psc->configs);
psc->configs = configs;
glx_config_destroy_list(psc->visuals);
psc->visuals = visuals;
psc->driver_configs = driver_configs;
psc->vtable = &dri_screen_vtable;
psc->driScreen.bindTexImage = dri_bind_tex_image;
return true;
handle_error:
if (configs)
glx_config_destroy_list(configs);
if (visuals)
glx_config_destroy_list(visuals);
return false;
}
#endif /* GLX_DIRECT_RENDERING */ #endif /* GLX_DIRECT_RENDERING */

View file

@ -114,6 +114,8 @@ char *
dri_get_driver_name(struct glx_screen *glx_screen); dri_get_driver_name(struct glx_screen *glx_screen);
void void
dri_bind_tex_image(__GLXDRIdrawable *base, int buffer, const int *attrib_list); dri_bind_tex_image(__GLXDRIdrawable *base, int buffer, const int *attrib_list);
bool
dri_screen_init(struct glx_screen *psc, struct glx_display *priv, int screen, int fd, const __DRIextension **loader_extensions, bool driver_name_is_inferred);
#endif /* GLX_DIRECT_RENDERING */ #endif /* GLX_DIRECT_RENDERING */
#endif /* _DRI_COMMON_H */ #endif /* _DRI_COMMON_H */

View file

@ -623,9 +623,7 @@ struct glx_screen *
driswCreateScreen(int screen, struct glx_display *priv, enum glx_driver glx_driver, bool driver_name_is_inferred) driswCreateScreen(int screen, struct glx_display *priv, enum glx_driver glx_driver, bool driver_name_is_inferred)
{ {
__GLXDRIscreen *psp; __GLXDRIscreen *psp;
const __DRIconfig **driver_configs;
struct drisw_screen *psc; struct drisw_screen *psc;
struct glx_config *configs = NULL, *visuals = NULL;
const __DRIextension **loader_extensions_local; const __DRIextension **loader_extensions_local;
bool kopper_disable = debug_get_bool_option("LIBGL_KOPPER_DISABLE", false); bool kopper_disable = debug_get_bool_option("LIBGL_KOPPER_DISABLE", false);
@ -651,39 +649,19 @@ driswCreateScreen(int screen, struct glx_display *priv, enum glx_driver glx_driv
loader_extensions_local = loader_extensions_noshm; loader_extensions_local = loader_extensions_noshm;
else else
loader_extensions_local = loader_extensions_shm; loader_extensions_local = loader_extensions_shm;
priv->driver = glx_driver ? GLX_DRIVER_ZINK_YES : GLX_DRIVER_SW;
psc->base.frontend_screen = driCreateNewScreen3(screen, -1, loader_extensions_local, if (!dri_screen_init(&psc->base, priv, screen, -1, loader_extensions_local, driver_name_is_inferred)) {
glx_driver ? DRI_SCREEN_KOPPER : DRI_SCREEN_SWRAST,
&driver_configs, driver_name_is_inferred,
priv->has_multibuffer, psc);
if (psc->base.frontend_screen == NULL) {
if (!glx_driver || !driver_name_is_inferred) if (!glx_driver || !driver_name_is_inferred)
ErrorMessageF("glx: failed to create drisw screen\n"); ErrorMessageF("glx: failed to create drisw screen\n");
goto handle_error; goto handle_error;
} }
configs = driConvertConfigs(psc->base.configs, driver_configs);
visuals = driConvertConfigs(psc->base.visuals, driver_configs);
if (!configs || !visuals) {
ErrorMessageF("No matching fbConfigs or visuals found\n");
goto handle_error;
}
glx_config_destroy_list(psc->base.configs);
psc->base.configs = configs;
glx_config_destroy_list(psc->base.visuals);
psc->base.visuals = visuals;
psc->base.driver_configs = driver_configs;
psc->base.vtable = &dri_screen_vtable;
psc->base.context_vtable = &drisw_context_vtable; psc->base.context_vtable = &drisw_context_vtable;
psp = &psc->base.driScreen; psp = &psc->base.driScreen;
psc->base.can_EXT_texture_from_pixmap = true; psc->base.can_EXT_texture_from_pixmap = true;
psp->createDrawable = driswCreateDrawable; psp->createDrawable = driswCreateDrawable;
psp->swapBuffers = driswSwapBuffers; psp->swapBuffers = driswSwapBuffers;
psp->bindTexImage = dri_bind_tex_image;
if (!glx_driver) if (!glx_driver)
psp->copySubBuffer = drisw_copy_sub_buffer; psp->copySubBuffer = drisw_copy_sub_buffer;
@ -694,15 +672,9 @@ driswCreateScreen(int screen, struct glx_display *priv, enum glx_driver glx_driv
psp->maxSwapInterval = 1; psp->maxSwapInterval = 1;
} }
priv->driver = glx_driver ? GLX_DRIVER_ZINK_YES : GLX_DRIVER_SW;
return &psc->base; return &psc->base;
handle_error: handle_error:
if (configs)
glx_config_destroy_list(configs);
if (visuals)
glx_config_destroy_list(visuals);
glx_screen_cleanup(&psc->base); glx_screen_cleanup(&psc->base);
free(psc); free(psc);