mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 14:40:10 +01:00
egl/dri: flesh out and use dri2_create_drawable()
Wrap the loader->createNewDrawable() dance into a helper and use it throughout the codebase. This addresses a cases like surfaceless (SL) on swrast (SL on kms_swrast is fine) where we'd attempt using the wrong driver and crash out. v2: fixup quirky GBM (Mathias) v3: fixup GBM for real (Marek) Cc: mesa-stable@lists.freedesktop.org Cc: Mathias Fröhlich <Mathias.Froehlich@web.de> Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de> (v1) Reviewed-by: Marek Olšák <marek.olsak@amd.com> (v1) Signed-off-by: Emil Velikov <emil.velikov@collabora.com> (v2) Signed-off-by: Marek Olšák <marek.olsak@amd.com> (v2) Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
5e0f527d60
commit
2282ec0ad6
7 changed files with 41 additions and 60 deletions
|
|
@ -1425,6 +1425,37 @@ dri2_surf_update_fence_fd(_EGLContext *ctx,
|
|||
dri2_surface_set_out_fence_fd(surf, fence_fd);
|
||||
}
|
||||
|
||||
EGLBoolean
|
||||
dri2_create_drawable(struct dri2_egl_display *dri2_dpy,
|
||||
const __DRIconfig *config,
|
||||
struct dri2_egl_surface *dri2_surf)
|
||||
{
|
||||
__DRIcreateNewDrawableFunc createNewDrawable;
|
||||
void *loaderPrivate = dri2_surf;
|
||||
|
||||
if (dri2_dpy->image_driver)
|
||||
createNewDrawable = dri2_dpy->image_driver->createNewDrawable;
|
||||
else if (dri2_dpy->dri2)
|
||||
createNewDrawable = dri2_dpy->dri2->createNewDrawable;
|
||||
else if (dri2_dpy->swrast)
|
||||
createNewDrawable = dri2_dpy->swrast->createNewDrawable;
|
||||
else
|
||||
return _eglError(EGL_BAD_ALLOC, "no createNewDrawable");
|
||||
|
||||
/* As always gbm is a bit special.. */
|
||||
#ifdef HAVE_DRM_PLATFORM
|
||||
if (dri2_surf->gbm_surf)
|
||||
loaderPrivate = dri2_surf->gbm_surf;
|
||||
#endif
|
||||
|
||||
dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen,
|
||||
config, loaderPrivate);
|
||||
if (dri2_surf->dri_drawable == NULL)
|
||||
return _eglError(EGL_BAD_ALLOC, "createNewDrawable");
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called via eglMakeCurrent(), drv->API.MakeCurrent().
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -541,6 +541,11 @@ dri2_init_surface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
|
|||
void
|
||||
dri2_fini_surface(_EGLSurface *surf);
|
||||
|
||||
EGLBoolean
|
||||
dri2_create_drawable(struct dri2_egl_display *dri2_dpy,
|
||||
const __DRIconfig *config,
|
||||
struct dri2_egl_surface *dri2_surf);
|
||||
|
||||
static inline uint64_t
|
||||
combine_u32_into_u64(uint32_t hi, uint32_t lo)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -341,7 +341,6 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
_EGLConfig *conf, void *native_window,
|
||||
const EGLint *attrib_list)
|
||||
{
|
||||
__DRIcreateNewDrawableFunc createNewDrawable;
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
|
||||
struct dri2_egl_surface *dri2_surf;
|
||||
|
|
@ -386,17 +385,8 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
goto cleanup_surface;
|
||||
}
|
||||
|
||||
if (dri2_dpy->image_driver)
|
||||
createNewDrawable = dri2_dpy->image_driver->createNewDrawable;
|
||||
else
|
||||
createNewDrawable = dri2_dpy->dri2->createNewDrawable;
|
||||
|
||||
dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen, config,
|
||||
dri2_surf);
|
||||
if (dri2_surf->dri_drawable == NULL) {
|
||||
_eglError(EGL_BAD_ALLOC, "createNewDrawable");
|
||||
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))
|
||||
goto cleanup_surface;
|
||||
}
|
||||
|
||||
if (window) {
|
||||
window->common.incRef(&window->common);
|
||||
|
|
|
|||
|
|
@ -171,23 +171,8 @@ dri2_drm_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
|
|||
dri2_surf->base.Height = surf->base.height;
|
||||
surf->dri_private = dri2_surf;
|
||||
|
||||
if (dri2_dpy->dri2) {
|
||||
dri2_surf->dri_drawable =
|
||||
dri2_dpy->dri2->createNewDrawable(dri2_dpy->dri_screen, config,
|
||||
dri2_surf->gbm_surf);
|
||||
|
||||
} else {
|
||||
assert(dri2_dpy->swrast != NULL);
|
||||
|
||||
dri2_surf->dri_drawable =
|
||||
dri2_dpy->swrast->createNewDrawable(dri2_dpy->dri_screen, config,
|
||||
dri2_surf->gbm_surf);
|
||||
|
||||
}
|
||||
if (dri2_surf->dri_drawable == NULL) {
|
||||
_eglError(EGL_BAD_ALLOC, "createNewDrawable()");
|
||||
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))
|
||||
goto cleanup_surf;
|
||||
}
|
||||
|
||||
return &dri2_surf->base;
|
||||
|
||||
|
|
|
|||
|
|
@ -136,13 +136,8 @@ dri2_surfaceless_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
goto cleanup_surface;
|
||||
}
|
||||
|
||||
dri2_surf->dri_drawable =
|
||||
dri2_dpy->image_driver->createNewDrawable(dri2_dpy->dri_screen, config,
|
||||
dri2_surf);
|
||||
if (dri2_surf->dri_drawable == NULL) {
|
||||
_eglError(EGL_BAD_ALLOC, "image->createNewDrawable");
|
||||
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))
|
||||
goto cleanup_surface;
|
||||
}
|
||||
|
||||
if (conf->RedSize == 5)
|
||||
dri2_surf->visual = __DRI_IMAGE_FORMAT_RGB565;
|
||||
|
|
|
|||
|
|
@ -272,7 +272,6 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
|
|||
_EGLConfig *conf, void *native_window,
|
||||
const EGLint *attrib_list)
|
||||
{
|
||||
__DRIcreateNewDrawableFunc createNewDrawable;
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
|
||||
struct wl_egl_window *window = native_window;
|
||||
|
|
@ -349,19 +348,8 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
|
|||
if (dri2_dpy->flush)
|
||||
dri2_surf->wl_win->resize_callback = resize_callback;
|
||||
|
||||
if (dri2_dpy->image_driver)
|
||||
createNewDrawable = dri2_dpy->image_driver->createNewDrawable;
|
||||
else if (dri2_dpy->dri2)
|
||||
createNewDrawable = dri2_dpy->dri2->createNewDrawable;
|
||||
else
|
||||
createNewDrawable = dri2_dpy->swrast->createNewDrawable;
|
||||
|
||||
dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen, config,
|
||||
dri2_surf);
|
||||
if (dri2_surf->dri_drawable == NULL) {
|
||||
_eglError(EGL_BAD_ALLOC, "createNewDrawable");
|
||||
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))
|
||||
goto cleanup_surf_wrapper;
|
||||
}
|
||||
|
||||
dri2_surf->base.SwapInterval = dri2_dpy->default_swap_interval;
|
||||
|
||||
|
|
|
|||
|
|
@ -290,21 +290,8 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
goto cleanup_pixmap;
|
||||
}
|
||||
|
||||
if (dri2_dpy->dri2) {
|
||||
dri2_surf->dri_drawable =
|
||||
dri2_dpy->dri2->createNewDrawable(dri2_dpy->dri_screen, config,
|
||||
dri2_surf);
|
||||
} else {
|
||||
assert(dri2_dpy->swrast);
|
||||
dri2_surf->dri_drawable =
|
||||
dri2_dpy->swrast->createNewDrawable(dri2_dpy->dri_screen, config,
|
||||
dri2_surf);
|
||||
}
|
||||
|
||||
if (dri2_surf->dri_drawable == NULL) {
|
||||
_eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");
|
||||
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf))
|
||||
goto cleanup_pixmap;
|
||||
}
|
||||
|
||||
if (type != EGL_PBUFFER_BIT) {
|
||||
cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue