egl: refactor dri2_create_screen() into three separate functions

Split the create_screen into:
 - create screen
 - setup/bind extensions
 - setup screen

This will allow us to reuse the latter two on egl/drm. Said platform
does create its own screen and attempts to reinvent the later two
functions itself.

Since the GBM ones tend to get out of sync quite often, and there is no
distinct reason why it does so we'll drop them with latter commits.

v2: disp -> dpy for the Android platform.
v3: use correct goto label (Rob)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Rob Herring <robh@kernel.org>
This commit is contained in:
Emil Velikov 2017-05-11 16:20:04 +01:00
parent ee3b32696f
commit 2c341f2bda
6 changed files with 58 additions and 19 deletions

View File

@ -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;
if (!dri2_bind_extensions(dri2_dpy, mandatory_core_extensions, extensions, false))
return EGL_FALSE;
dri2_bind_extensions(dri2_dpy, optional_core_extensions, extensions, true);
dri2_setup_screen(disp);
return EGL_TRUE;
cleanup_dri_screen:
dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
return EGL_FALSE;
}
/**

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)) {

View File

@ -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;