mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 13:50:11 +01:00
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:
parent
520572eb25
commit
7930fe5f01
5 changed files with 71 additions and 99 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue