egl: Implement EGL_MESA_platform_surfaceless
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
@@ -84,6 +84,11 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOK) (EGLDisplay dpy, EG
|
||||
#define EGL_NO_CONFIG_MESA ((EGLConfig)0)
|
||||
#endif
|
||||
|
||||
#ifndef EGL_MESA_platform_surfaceless
|
||||
#define EGL_MESA_platform_surfaceless 1
|
||||
#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD
|
||||
#endif /* EGL_MESA_platform_surfaceless */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -392,6 +392,11 @@ _eglGetPlatformDisplayCommon(EGLenum platform, void *native_display,
|
||||
dpy = _eglGetWaylandDisplay((struct wl_display*) native_display,
|
||||
attrib_list);
|
||||
break;
|
||||
#endif
|
||||
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||
case EGL_PLATFORM_SURFACELESS_MESA:
|
||||
dpy = _eglGetSurfacelessDisplay(native_display, attrib_list);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
|
||||
@@ -837,11 +842,30 @@ _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
|
||||
_EGLSurface *surf;
|
||||
EGLSurface ret;
|
||||
|
||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
|
||||
|
||||
if (native_window == NULL)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
|
||||
|
||||
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||
if (disp->Platform == _EGL_PLATFORM_SURFACELESS) {
|
||||
/* From the EGL_MESA_platform_surfaceless spec (v1):
|
||||
*
|
||||
* eglCreatePlatformWindowSurface fails when called with a <display>
|
||||
* that belongs to the surfaceless platform. It returns
|
||||
* EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The
|
||||
* justification for this unconditional failure is that the
|
||||
* surfaceless platform has no native windows, and therefore the
|
||||
* <native_window> parameter is always invalid.
|
||||
*
|
||||
* This check must occur before checking the EGLConfig, which emits
|
||||
* EGL_BAD_CONFIG.
|
||||
*/
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
|
||||
}
|
||||
#endif
|
||||
|
||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
|
||||
|
||||
surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window,
|
||||
attrib_list);
|
||||
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
|
||||
@@ -943,6 +967,22 @@ _eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
|
||||
_EGLSurface *surf;
|
||||
EGLSurface ret;
|
||||
|
||||
#if HAVE_SURFACELESS_PLATFORM
|
||||
if (disp->Platform == _EGL_PLATFORM_SURFACELESS) {
|
||||
/* From the EGL_MESA_platform_surfaceless spec (v1):
|
||||
*
|
||||
* [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface
|
||||
* also fails when called with a <display> that belongs to the
|
||||
* surfaceless platform. It returns EGL_NO_SURFACE and generates
|
||||
* EGL_BAD_NATIVE_PIXMAP.
|
||||
*
|
||||
* This check must occur before checking the EGLConfig, which emits
|
||||
* EGL_BAD_CONFIG.
|
||||
*/
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
|
||||
}
|
||||
#endif
|
||||
|
||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
|
||||
surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
|
||||
attrib_list);
|
||||
|
@@ -540,3 +540,24 @@ _eglGetWaylandDisplay(struct wl_display *native_display,
|
||||
return _eglFindDisplay(_EGL_PLATFORM_WAYLAND, native_display);
|
||||
}
|
||||
#endif /* HAVE_WAYLAND_PLATFORM */
|
||||
|
||||
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||
_EGLDisplay*
|
||||
_eglGetSurfacelessDisplay(void *native_display,
|
||||
const EGLint *attrib_list)
|
||||
{
|
||||
/* This platform has no native display. */
|
||||
if (native_display != NULL) {
|
||||
_eglError(EGL_BAD_PARAMETER, "eglGetPlatformDisplay");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This platform recognizes no display attributes. */
|
||||
if (attrib_list != NULL && attrib_list[0] != EGL_NONE) {
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglGetPlatformDisplay");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _eglFindDisplay(_EGL_PLATFORM_SURFACELESS, native_display);
|
||||
}
|
||||
#endif /* HAVE_SURFACELESS_PLATFORM */
|
||||
|
@@ -274,6 +274,11 @@ _eglGetWaylandDisplay(struct wl_display *native_display,
|
||||
const EGLint *attrib_list);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||
_EGLDisplay*
|
||||
_eglGetSurfacelessDisplay(void *native_display,
|
||||
const EGLint *attrib_list);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@@ -61,6 +61,9 @@ struct _egl_global _eglGlobal =
|
||||
#endif
|
||||
#ifdef HAVE_DRM_PLATFORM
|
||||
" EGL_MESA_platform_gbm"
|
||||
#endif
|
||||
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||
" EGL_MESA_platform_surfaceless"
|
||||
#endif
|
||||
" EGL_KHR_client_get_all_proc_addresses"
|
||||
" EGL_KHR_debug",
|
||||
|
Reference in New Issue
Block a user