glx: Use loader_bind_extensions().
This adds more consistent logging on failure and gives us a spot for version checks. Reviewed-by: Adam Jackson <ajax@redhat.com> Acked-by: Eric Engestrom <eric@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20069>
This commit is contained in:
@@ -976,45 +976,39 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv,
|
||||
"GLX_EXT_create_context_es2_profile");
|
||||
}
|
||||
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI_TEX_BUFFER, 1, offsetof(struct dri2_screen, texBuffer), true },
|
||||
{ __DRI2_FLUSH, 1, offsetof(struct dri2_screen, f), true },
|
||||
{ __DRI2_CONFIG_QUERY, 1, offsetof(struct dri2_screen, config), true },
|
||||
{ __DRI2_THROTTLE, 1, offsetof(struct dri2_screen, throttle), true },
|
||||
{ __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_screen, rendererQuery), true },
|
||||
{ __DRI2_INTEROP, 1, offsetof(struct dri2_screen, interop), true },
|
||||
};
|
||||
loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions);
|
||||
|
||||
/* Extensions where we don't care about the extension struct */
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
|
||||
psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
|
||||
}
|
||||
|
||||
if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) {
|
||||
psc->f = (__DRI2flushExtension *) extensions[i];
|
||||
/* internal driver extension, no GL extension exposed */
|
||||
}
|
||||
|
||||
if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0))
|
||||
psc->config = (__DRI2configQueryExtension *) extensions[i];
|
||||
|
||||
if (((strcmp(extensions[i]->name, __DRI2_THROTTLE) == 0)))
|
||||
psc->throttle = (__DRI2throttleExtension *) extensions[i];
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_robustness");
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) {
|
||||
psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i];
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0)
|
||||
psc->interop = (__DRI2interopExtension*)extensions[i];
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_context_flush_control");
|
||||
}
|
||||
|
||||
if (psc->texBuffer)
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
|
||||
|
||||
if (psc->rendererQuery) {
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
@@ -1045,7 +1039,6 @@ dri2CreateScreen(int screen, struct glx_display * priv)
|
||||
struct glx_config *configs = NULL, *visuals = NULL;
|
||||
char *driverName = NULL, *loader_driverName, *deviceName, *tmp;
|
||||
drm_magic_t magic;
|
||||
int i;
|
||||
|
||||
psc = calloc(1, sizeof *psc);
|
||||
if (psc == NULL)
|
||||
@@ -1096,17 +1089,12 @@ dri2CreateScreen(int screen, struct glx_display * priv)
|
||||
if (extensions == NULL)
|
||||
goto handle_error;
|
||||
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
|
||||
psc->core = (__DRIcoreExtension *) extensions[i];
|
||||
if (strcmp(extensions[i]->name, __DRI_DRI2) == 0)
|
||||
psc->dri2 = (__DRIdri2Extension *) extensions[i];
|
||||
}
|
||||
|
||||
if (psc->core == NULL || psc->dri2 == NULL || psc->dri2->base.version < 4) {
|
||||
ErrorMessageF("core dri or dri2 extension not found\n");
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI_CORE, 1, offsetof(struct dri2_screen, core), false },
|
||||
{ __DRI_DRI2, 4, offsetof(struct dri2_screen, dri2), false },
|
||||
};
|
||||
if (!loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions))
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
psc->driScreen =
|
||||
psc->dri2->createNewScreen2(screen, psc->fd,
|
||||
|
@@ -750,6 +750,15 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
|
||||
"GLX_EXT_create_context_es2_profile");
|
||||
}
|
||||
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI2_RENDERER_QUERY, 1, offsetof(struct dri3_screen, rendererQuery), true },
|
||||
{ __DRI2_FLUSH, 1, offsetof(struct dri3_screen, f), true },
|
||||
{ __DRI_IMAGE, 1, offsetof(struct dri3_screen, image), true },
|
||||
{ __DRI2_INTEROP, 1, offsetof(struct dri3_screen, interop), true },
|
||||
{ __DRI2_CONFIG_QUERY, 1, offsetof(struct dri3_screen, config), true },
|
||||
};
|
||||
loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions);
|
||||
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
/* when on a different gpu than the server, the server pixmaps
|
||||
* can have a tiling mode we can't read. Thus we can't create
|
||||
@@ -761,39 +770,25 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
|
||||
}
|
||||
|
||||
if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) {
|
||||
psc->f = (__DRI2flushExtension *) extensions[i];
|
||||
/* internal driver extension, no GL extension exposed */
|
||||
}
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI_IMAGE) == 0)
|
||||
psc->image = (__DRIimageExtension *) extensions[i];
|
||||
|
||||
if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0))
|
||||
psc->config = (__DRI2configQueryExtension *) extensions[i];
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_robustness");
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) {
|
||||
psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i];
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0)
|
||||
psc->interop = (__DRI2interopExtension*)extensions[i];
|
||||
|
||||
if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_context_flush_control");
|
||||
}
|
||||
|
||||
if (psc->rendererQuery) {
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error) {
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
@@ -836,7 +831,6 @@ dri3_create_screen(int screen, struct glx_display * priv)
|
||||
__GLXDRIscreen *psp;
|
||||
struct glx_config *configs = NULL, *visuals = NULL;
|
||||
char *driverName, *driverNameDisplayGPU, *tmp;
|
||||
int i;
|
||||
|
||||
psc = calloc(1, sizeof *psc);
|
||||
if (psc == NULL)
|
||||
@@ -881,23 +875,12 @@ dri3_create_screen(int screen, struct glx_display * priv)
|
||||
if (extensions == NULL)
|
||||
goto handle_error;
|
||||
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
|
||||
psc->core = (__DRIcoreExtension *) extensions[i];
|
||||
if (strcmp(extensions[i]->name, __DRI_IMAGE_DRIVER) == 0)
|
||||
psc->image_driver = (__DRIimageDriverExtension *) extensions[i];
|
||||
}
|
||||
|
||||
|
||||
if (psc->core == NULL) {
|
||||
ErrorMessageF("core dri driver extension not found\n");
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI_CORE, 1, offsetof(struct dri3_screen, core), false },
|
||||
{ __DRI_IMAGE_DRIVER, 1, offsetof(struct dri3_screen, image_driver), false },
|
||||
};
|
||||
if (!loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions))
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
if (psc->image_driver == NULL) {
|
||||
ErrorMessageF("image driver extension not found\n");
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
if (psc->is_different_gpu) {
|
||||
driverNameDisplayGPU = loader_get_driver_for_fd(psc->fd_display_gpu);
|
||||
|
@@ -823,22 +823,16 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer");
|
||||
|
||||
/* FIXME: Figure out what other extensions can be ported here from dri2. */
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
|
||||
psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
|
||||
}
|
||||
if (strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) {
|
||||
psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i];
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI_TEX_BUFFER, 1, offsetof(struct drisw_screen, texBuffer), true },
|
||||
{ __DRI2_RENDERER_QUERY, 1, offsetof(struct drisw_screen, rendererQuery), true },
|
||||
{ __DRI2_FLUSH, 1, offsetof(struct drisw_screen, f), true },
|
||||
{ __DRI2_CONFIG_QUERY, 1, offsetof(struct drisw_screen, config), true },
|
||||
};
|
||||
loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions);
|
||||
|
||||
/* Extensions where we don't care about the extension struct */
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_robustness");
|
||||
@@ -847,11 +841,20 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_context_flush_control");
|
||||
}
|
||||
if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)
|
||||
psc->f = (__DRI2flushExtension *) extensions[i];
|
||||
if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0))
|
||||
psc->config = (__DRI2configQueryExtension *) extensions[i];
|
||||
}
|
||||
|
||||
if (psc->texBuffer)
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap");
|
||||
|
||||
if (psc->rendererQuery) {
|
||||
__glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
|
||||
unsigned int no_error = 0;
|
||||
if (psc->rendererQuery->queryInteger(psc->driScreen,
|
||||
__DRI2_RENDERER_HAS_NO_ERROR_CONTEXT,
|
||||
&no_error) == 0 && no_error) {
|
||||
__glXEnableDirectExtension(&psc->base,
|
||||
"GLX_ARB_create_context_no_error");
|
||||
}
|
||||
}
|
||||
|
||||
if (psc->kopper) {
|
||||
@@ -928,7 +931,6 @@ driswCreateScreenDriver(int screen, struct glx_display *priv,
|
||||
const __DRIextension **extensions;
|
||||
struct drisw_screen *psc;
|
||||
struct glx_config *configs = NULL, *visuals = NULL;
|
||||
int i;
|
||||
const __DRIextension **loader_extensions_local;
|
||||
const struct drisw_display *pdpyp = (struct drisw_display *)priv->driswDisplay;
|
||||
|
||||
@@ -953,21 +955,14 @@ driswCreateScreenDriver(int screen, struct glx_display *priv,
|
||||
else
|
||||
loader_extensions_local = loader_extensions_shm;
|
||||
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
|
||||
psc->core = (__DRIcoreExtension *) extensions[i];
|
||||
if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0)
|
||||
psc->swrast = (__DRIswrastExtension *) extensions[i];
|
||||
if (strcmp(extensions[i]->name, __DRI_KOPPER) == 0)
|
||||
psc->kopper = (__DRIkopperExtension *) extensions[i];
|
||||
if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0)
|
||||
psc->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
|
||||
}
|
||||
|
||||
if (psc->core == NULL || psc->swrast == NULL || psc->swrast->base.version < 4) {
|
||||
ErrorMessageF("core dri extension not found\n");
|
||||
static const struct dri_extension_match exts[] = {
|
||||
{ __DRI_CORE, 1, offsetof(struct drisw_screen, core), false },
|
||||
{ __DRI_SWRAST, 4, offsetof(struct drisw_screen, swrast), false },
|
||||
{ __DRI_KOPPER, 1, offsetof(struct drisw_screen, kopper), true },
|
||||
{ __DRI_COPY_SUB_BUFFER, 1, offsetof(struct drisw_screen, copySubBuffer), true },
|
||||
};
|
||||
if (!loader_bind_extensions(psc, exts, ARRAY_SIZE(exts), extensions))
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
psc->driScreen =
|
||||
psc->swrast->createNewScreen2(screen, loader_extensions_local,
|
||||
|
Reference in New Issue
Block a user