}
}
-/* All platforms but DRM call this function to create the screen, query the
- * dri extensions, setup the vtables and populate the driver_configs.
- * DRM inherits all that information from its display - GBM.
+/* All platforms but DRM call this function to create the screen and populate
+ * the driver_configs. DRM inherits that information from its display - GBM.
*/
EGLBoolean
dri2_create_screen(_EGLDisplay *disp)
{
- const __DRIextension **extensions;
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
if (dri2_dpy->image_driver) {
}
dri2_dpy->own_dri_screen = 1;
+ return EGL_TRUE;
+}
+
+EGLBoolean
+dri2_setup_extensions(_EGLDisplay *disp)
+{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ const struct dri2_extension_match *mandatory_core_extensions;
+ const __DRIextension **extensions;
extensions = dri2_dpy->core->getExtensions(dri2_dpy->dri_screen);
- if (dri2_dpy->image_driver || dri2_dpy->dri2) {
- if (!dri2_bind_extensions(dri2_dpy, dri2_core_extensions, extensions, false))
- goto cleanup_dri_screen;
- } else {
- assert(dri2_dpy->swrast);
- if (!dri2_bind_extensions(dri2_dpy, swrast_core_extensions, extensions, false))
- goto cleanup_dri_screen;
- }
+ if (dri2_dpy->image_driver || dri2_dpy->dri2)
+ mandatory_core_extensions = dri2_core_extensions;
+ else
+ mandatory_core_extensions = swrast_core_extensions;
- dri2_bind_extensions(dri2_dpy, optional_core_extensions, extensions, true);
- dri2_setup_screen(disp);
+ if (!dri2_bind_extensions(dri2_dpy, mandatory_core_extensions, extensions, false))
+ return EGL_FALSE;
+ dri2_bind_extensions(dri2_dpy, optional_core_extensions, extensions, true);
return EGL_TRUE;
-
- cleanup_dri_screen:
- dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
-
- return EGL_FALSE;
}
/**
if (!dri2_create_screen(disp))
goto cleanup;
+ if (!dri2_setup_extensions(disp))
+ goto cleanup;
+
+ dri2_setup_screen(disp);
+
dri2_wl_setup_swap_interval(dri2_dpy);
/* To use Prime, we must have _DRI_IMAGE v7 at least.
if (!dri2_create_screen(disp))
goto cleanup;
+ if (!dri2_setup_extensions(disp))
+ goto cleanup;
+
+ dri2_setup_screen(disp);
+
dri2_wl_setup_swap_interval(dri2_dpy);
if (!dri2_wl_add_configs_for_visuals(drv, disp)) {
if (!dri2_create_screen(disp))
goto cleanup;
+ if (!dri2_setup_extensions(disp))
+ goto cleanup;
+
+ dri2_setup_screen(disp);
+
if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp, true))
goto cleanup;
if (!dri2_create_screen(disp))
goto cleanup;
+ if (!dri2_setup_extensions(disp))
+ goto cleanup;
+
+ dri2_setup_screen(disp);
+
dri2_x11_setup_swap_interval(dri2_dpy);
if (!dri2_dpy->is_different_gpu)
if (!dri2_create_screen(disp))
goto cleanup;
+ if (!dri2_setup_extensions(disp))
+ goto cleanup;
+
+ dri2_setup_screen(disp);
+
dri2_x11_setup_swap_interval(dri2_dpy);
disp->Extensions.KHR_image_pixmap = EGL_TRUE;