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)
|
#define EGL_NO_CONFIG_MESA ((EGLConfig)0)
|
||||||
#endif
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -392,6 +392,11 @@ _eglGetPlatformDisplayCommon(EGLenum platform, void *native_display,
|
|||||||
dpy = _eglGetWaylandDisplay((struct wl_display*) native_display,
|
dpy = _eglGetWaylandDisplay((struct wl_display*) native_display,
|
||||||
attrib_list);
|
attrib_list);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||||
|
case EGL_PLATFORM_SURFACELESS_MESA:
|
||||||
|
dpy = _eglGetSurfacelessDisplay(native_display, attrib_list);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
|
RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
|
||||||
@@ -837,11 +842,30 @@ _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
|
|||||||
_EGLSurface *surf;
|
_EGLSurface *surf;
|
||||||
EGLSurface ret;
|
EGLSurface ret;
|
||||||
|
|
||||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
|
|
||||||
|
|
||||||
if (native_window == NULL)
|
if (native_window == NULL)
|
||||||
RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
|
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,
|
surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window,
|
||||||
attrib_list);
|
attrib_list);
|
||||||
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
|
ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
|
||||||
@@ -943,6 +967,22 @@ _eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
|
|||||||
_EGLSurface *surf;
|
_EGLSurface *surf;
|
||||||
EGLSurface ret;
|
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);
|
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
|
||||||
surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
|
surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
|
||||||
attrib_list);
|
attrib_list);
|
||||||
|
@@ -540,3 +540,24 @@ _eglGetWaylandDisplay(struct wl_display *native_display,
|
|||||||
return _eglFindDisplay(_EGL_PLATFORM_WAYLAND, native_display);
|
return _eglFindDisplay(_EGL_PLATFORM_WAYLAND, native_display);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_WAYLAND_PLATFORM */
|
#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);
|
const EGLint *attrib_list);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||||
|
_EGLDisplay*
|
||||||
|
_eglGetSurfacelessDisplay(void *native_display,
|
||||||
|
const EGLint *attrib_list);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -61,6 +61,9 @@ struct _egl_global _eglGlobal =
|
|||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_DRM_PLATFORM
|
||||||
" EGL_MESA_platform_gbm"
|
" EGL_MESA_platform_gbm"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SURFACELESS_PLATFORM
|
||||||
|
" EGL_MESA_platform_surfaceless"
|
||||||
#endif
|
#endif
|
||||||
" EGL_KHR_client_get_all_proc_addresses"
|
" EGL_KHR_client_get_all_proc_addresses"
|
||||||
" EGL_KHR_debug",
|
" EGL_KHR_debug",
|
||||||
|
Reference in New Issue
Block a user