<div dir="ltr"><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 16, 2019 at 1:03 PM Emil Velikov <<a href="mailto:emil.l.velikov@gmail.com">emil.l.velikov@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Emil Velikov <<a href="mailto:emil.velikov@collabora.com" target="_blank">emil.velikov@collabora.com</a>><br>
<br>
Wrap the loader->createNewDrawable() dance into a helper and use it<br>
throughout the codebase.<br>
<br>
This addresses a cases like surfaceless (SL) on swrast (SL on kms_swrast<br>
is fine) where we'd attempt using the wrong driver and crash out.<br>
<br>
v2: fixup quirky GBM (Mathias)<br>
<br>
Cc: <a href="mailto:mesa-stable@lists.freedesktop.org" target="_blank">mesa-stable@lists.freedesktop.org</a><br>
Cc: Mathias Fröhlich <<a href="mailto:Mathias.Froehlich@web.de" target="_blank">Mathias.Froehlich@web.de</a>><br>
Reviewed-by: Mathias Fröhlich <<a href="mailto:Mathias.Froehlich@web.de" target="_blank">Mathias.Froehlich@web.de</a>> (v1)<br>
Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>> (v1)<br>
Signed-off-by: Emil Velikov <<a href="mailto:emil.velikov@collabora.com" target="_blank">emil.velikov@collabora.com</a>><br>
---<br>
 src/egl/drivers/dri2/egl_dri2.c             | 39 +++++++++++++++++++++<br>
 src/egl/drivers/dri2/egl_dri2.h             |  5 +++<br>
 src/egl/drivers/dri2/platform_android.c     | 12 +------<br>
 src/egl/drivers/dri2/platform_drm.c         | 17 +--------<br>
 src/egl/drivers/dri2/platform_surfaceless.c |  7 +---<br>
 src/egl/drivers/dri2/platform_wayland.c     | 14 +-------<br>
 src/egl/drivers/dri2/platform_x11.c         | 15 +-------<br>
 7 files changed, 49 insertions(+), 60 deletions(-)<br>
<br>
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c<br>
index 09d6315b19e..17a0176b646 100644<br>
--- a/src/egl/drivers/dri2/egl_dri2.c<br>
+++ b/src/egl/drivers/dri2/egl_dri2.c<br>
@@ -1425,6 +1425,45 @@ dri2_surf_update_fence_fd(_EGLContext *ctx,<br>
    dri2_surface_set_out_fence_fd(surf, fence_fd);<br>
 }<br>
<br>
+static inline _EGLDisplay *<br>
+dri2_display_to_egl_display(struct dri2_egl_display *dri2_dpy)<br>
+{<br>
+   const size_t offset = offsetof(_EGLDisplay, DriverData);<br>
+   return (_EGLDisplay *)(((void*) dri2_dpy) - offset);<br>
+}<br>
+<br>
+EGLBoolean<br>
+dri2_create_drawable(struct dri2_egl_display *dri2_dpy,<br>
+                     const __DRIconfig *config,<br>
+                     struct dri2_egl_surface *dri2_surf)<br>
+{<br>
+   __DRIcreateNewDrawableFunc createNewDrawable;<br>
+   _EGLDisplay *disp = dri2_display_to_egl_display(dri2_dpy);<br>
+   void *loaderPrivate = dri2_surf;<br>
+<br>
+   if (dri2_dpy->image_driver)<br>
+      createNewDrawable = dri2_dpy->image_driver->createNewDrawable;<br>
+   else if (dri2_dpy->dri2)<br>
+      createNewDrawable = dri2_dpy->dri2->createNewDrawable;<br>
+   else if (dri2_dpy->swrast)<br>
+      createNewDrawable = dri2_dpy->swrast->createNewDrawable;<br>
+   else<br>
+      return _eglError(EGL_BAD_ALLOC, "no createNewDrawable");<br>
+<br>
+   /* As always gbm is a bit special.. */<br>
+#ifdef HAVE_DRM_PLATFORM<br>
+   if (disp->Platform == _EGL_PLATFORM_DRM)<br>
+      loaderPrivate = dri2_surf->gbm_surf;<br>
+#endif<br>
+<br>
+   dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen,<br>
+                                                  config, loaderPrivate);<br>
+   if (dri2_surf->dri_drawable == NULL)<br>
+      return _eglError(EGL_BAD_ALLOC, "createNewDrawable");<br>
+<br>
+   return EGL_TRUE;<br>
+}<br>
+<br>
 /**<br>
  * Called via eglMakeCurrent(), drv->API.MakeCurrent().<br>
  */<br>
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h<br>
index 4918517b572..5555bcea3ab 100644<br>
--- a/src/egl/drivers/dri2/egl_dri2.h<br>
+++ b/src/egl/drivers/dri2/egl_dri2.h<br>
@@ -541,6 +541,11 @@ dri2_init_surface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,<br>
 void<br>
 dri2_fini_surface(_EGLSurface *surf);<br>
<br>
+EGLBoolean<br>
+dri2_create_drawable(struct dri2_egl_display *dri2_dpy,<br>
+                     const __DRIconfig *config,<br>
+                     struct dri2_egl_surface *dri2_surf);<br>
+<br>
 static inline uint64_t<br>
 combine_u32_into_u64(uint32_t hi, uint32_t lo)<br>
 {<br>
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c<br>
index fece214d939..e44447c7df7 100644<br>
--- a/src/egl/drivers/dri2/platform_android.c<br>
+++ b/src/egl/drivers/dri2/platform_android.c<br>
@@ -341,7 +341,6 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,<br>
                    _EGLConfig *conf, void *native_window,<br>
                    const EGLint *attrib_list)<br>
 {<br>
-   __DRIcreateNewDrawableFunc createNewDrawable;<br>
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);<br>
    struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);<br>
    struct dri2_egl_surface *dri2_surf;<br>
@@ -386,17 +385,8 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,<br>
       goto cleanup_surface;<br>
    }<br>
<br>
-   if (dri2_dpy->image_driver)<br>
-      createNewDrawable = dri2_dpy->image_driver->createNewDrawable;<br>
-   else<br>
-      createNewDrawable = dri2_dpy->dri2->createNewDrawable;<br>
-<br>
-   dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen, config,<br>
-                                                  dri2_surf);<br>
-   if (dri2_surf->dri_drawable == NULL) {<br>
-      _eglError(EGL_BAD_ALLOC, "createNewDrawable");<br>
+   if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))<br>
       goto cleanup_surface;<br>
-   }<br>
<br>
    if (window) {<br>
       window->common.incRef(&window->common);<br>
diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c<br>
index 7d916fe92b7..c59b9341d87 100644<br>
--- a/src/egl/drivers/dri2/platform_drm.c<br>
+++ b/src/egl/drivers/dri2/platform_drm.c<br>
@@ -171,23 +171,8 @@ dri2_drm_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,<br>
    dri2_surf->base.Height = surf->base.height;<br>
    surf->dri_private = dri2_surf;<br>
<br>
-   if (dri2_dpy->dri2) {<br>
-      dri2_surf->dri_drawable =<br>
-         dri2_dpy->dri2->createNewDrawable(dri2_dpy->dri_screen, config,<br>
-                                           dri2_surf->gbm_surf);<br>
-<br>
-   } else {<br>
-      assert(dri2_dpy->swrast != NULL);<br>
-<br>
-      dri2_surf->dri_drawable =<br>
-         dri2_dpy->swrast->createNewDrawable(dri2_dpy->dri_screen, config,<br>
-                                             dri2_surf->gbm_surf);<br>
-<br>
-   }<br>
-   if (dri2_surf->dri_drawable == NULL) {<br>
-      _eglError(EGL_BAD_ALLOC, "createNewDrawable()");<br>
+   if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))<br>
       goto cleanup_surf;<br>
-   }<br>
<br>
    return &dri2_surf->base;<br>
<br>
diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c<br>
index 27b1d44ebec..ce9f7d0f980 100644<br>
--- a/src/egl/drivers/dri2/platform_surfaceless.c<br>
+++ b/src/egl/drivers/dri2/platform_surfaceless.c<br>
@@ -136,13 +136,8 @@ dri2_surfaceless_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,<br>
       goto cleanup_surface;<br>
    }<br>
<br>
-   dri2_surf->dri_drawable =<br>
-      dri2_dpy->image_driver->createNewDrawable(dri2_dpy->dri_screen, config,<br>
-                                                dri2_surf);<br>
-   if (dri2_surf->dri_drawable == NULL) {<br>
-      _eglError(EGL_BAD_ALLOC, "image->createNewDrawable");<br>
+   if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))<br>
       goto cleanup_surface;<br>
-    }<br>
<br>
    if (conf->RedSize == 5)<br>
       dri2_surf->visual = __DRI_IMAGE_FORMAT_RGB565;<br>
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c<br>
index 0f5d85be326..fb5ecdab2c5 100644<br>
--- a/src/egl/drivers/dri2/platform_wayland.c<br>
+++ b/src/egl/drivers/dri2/platform_wayland.c<br>
@@ -272,7 +272,6 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,<br>
                               _EGLConfig *conf, void *native_window,<br>
                               const EGLint *attrib_list)<br>
 {<br>
-   __DRIcreateNewDrawableFunc createNewDrawable;<br>
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);<br>
    struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);<br>
    struct wl_egl_window *window = native_window;<br>
@@ -349,19 +348,8 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,<br>
    if (dri2_dpy->flush)<br>
       dri2_surf->wl_win->resize_callback = resize_callback;<br>
<br>
-   if (dri2_dpy->image_driver)<br>
-      createNewDrawable = dri2_dpy->image_driver->createNewDrawable;<br>
-   else if (dri2_dpy->dri2)<br>
-      createNewDrawable = dri2_dpy->dri2->createNewDrawable;<br>
-   else<br>
-      createNewDrawable = dri2_dpy->swrast->createNewDrawable;<br>
-<br>
-   dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen, config,<br>
-                                                  dri2_surf);<br>
-    if (dri2_surf->dri_drawable == NULL) {<br>
-      _eglError(EGL_BAD_ALLOC, "createNewDrawable");<br>
+   if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))<br>
        goto cleanup_surf_wrapper;<br>
-    }<br>
<br>
    dri2_surf->base.SwapInterval = dri2_dpy->default_swap_interval;<br>
<br>
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c<br>
index 538cffd6a76..be9eb513243 100644<br>
--- a/src/egl/drivers/dri2/platform_x11.c<br>
+++ b/src/egl/drivers/dri2/platform_x11.c<br>
@@ -290,21 +290,8 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,<br>
       goto cleanup_pixmap;<br>
    }<br>
<br>
-   if (dri2_dpy->dri2) {<br>
-      dri2_surf->dri_drawable =<br>
-         dri2_dpy->dri2->createNewDrawable(dri2_dpy->dri_screen, config,<br>
-                                           dri2_surf);<br>
-   } else {<br>
-      assert(dri2_dpy->swrast);<br>
-      dri2_surf->dri_drawable = <br>
-         dri2_dpy->swrast->createNewDrawable(dri2_dpy->dri_screen, config,<br>
-                                             dri2_surf);<br>
-   }<br>
-<br>
-   if (dri2_surf->dri_drawable == NULL) {<br>
-      _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");<br>
+   if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))<br>
       goto cleanup_pixmap;<br>
-   }<br>
<br>
    if (type != EGL_PBUFFER_BIT) {<br>
       cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);<br>
-- <br>
2.21.0<br>
<br>
_______________________________________________<br>
mesa-stable mailing list<br>
<a href="mailto:mesa-stable@lists.freedesktop.org" target="_blank">mesa-stable@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-stable" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-stable</a></blockquote></div>