diff options
Diffstat (limited to 'src/egl')
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 37 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 3 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_android.c | 5 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_surfaceless.c | 7 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 10 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_x11.c | 15 |
6 files changed, 58 insertions, 19 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 1c3d00cf8c3..787c377c12e 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -694,14 +694,12 @@ dri2_setup_screen(_EGLDisplay *disp) } } -/* 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) { @@ -744,27 +742,28 @@ dri2_create_screen(_EGLDisplay *disp) } 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; } /** diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index c9c064b23fe..a71b4489cde 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -365,6 +365,9 @@ dri2_load_driver_dri3(_EGLDisplay *disp); EGLBoolean dri2_create_screen(_EGLDisplay *disp); +EGLBoolean +dri2_setup_extensions(_EGLDisplay *disp); + __DRIdrawable * dri2_surface_get_dri_drawable(_EGLSurface *surf); diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 42820c9793a..8384cab3904 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -1153,6 +1153,11 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy) goto cleanup; } + if (!dri2_setup_extensions(dpy)) + goto cleanup; + + dri2_setup_screen(dpy); + if (!droid_add_configs_for_visuals(drv, dpy)) { err = "DRI2: failed to add configs"; goto cleanup; diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index f001eda369c..df46099c242 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -320,6 +320,13 @@ dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp) goto cleanup; } + if (!dri2_setup_extensions(disp)) { + err = "DRI2: failed to find required DRI extensions"; + goto cleanup; + } + + dri2_setup_screen(disp); + if (!surfaceless_add_configs_for_visuals(drv, disp)) { err = "DRI2: failed to add configs"; goto cleanup; diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 325a2e4beea..174cfeeb7e9 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -1226,6 +1226,11 @@ dri2_initialize_wayland_drm(_EGLDriver *drv, _EGLDisplay *disp) 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. @@ -1838,6 +1843,11 @@ dri2_initialize_wayland_swrast(_EGLDriver *drv, _EGLDisplay *disp) 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)) { diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index c512448952d..d15c1ce9274 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -1252,6 +1252,11 @@ dri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *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; @@ -1349,6 +1354,11 @@ dri2_initialize_x11_dri3(_EGLDriver *drv, _EGLDisplay *disp) 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) @@ -1444,6 +1454,11 @@ dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp) 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; |