@ -92,7 +92,7 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
EGLConfig * nativeConfigs ;
_GLFWfbconfig * usableConfigs ;
const _GLFWfbconfig * closest ;
int i , nativeCount , usableCount , apiBit ;
int i , nativeCount , usableCount , apiBit , surfaceTypeBit ;
GLFWbool wrongApiAvailable = GLFW_FALSE ;
if ( ctxconfig - > client = = GLFW_OPENGL_ES_API )
@ -105,6 +105,11 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
else
apiBit = EGL_OPENGL_BIT ;
if ( _glfw . egl . platform = = EGL_PLATFORM_SURFACELESS_MESA )
surfaceTypeBit = EGL_PBUFFER_BIT ;
else
surfaceTypeBit = EGL_WINDOW_BIT ;
if ( fbconfig - > stereo )
{
_glfwInputError ( GLFW_FORMAT_UNAVAILABLE , " EGL: Stereo rendering not supported " ) ;
@ -133,8 +138,7 @@ static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,
if ( getEGLConfigAttrib ( n , EGL_COLOR_BUFFER_TYPE ) ! = EGL_RGB_BUFFER )
continue ;
// Only consider window EGLConfigs
if ( ! ( getEGLConfigAttrib ( n , EGL_SURFACE_TYPE ) & EGL_WINDOW_BIT ) )
if ( ! ( getEGLConfigAttrib ( n , EGL_SURFACE_TYPE ) & surfaceTypeBit ) )
continue ;
# if defined(_GLFW_X11)
@ -420,6 +424,8 @@ GLFWbool _glfwInitEGL(void)
_glfwPlatformGetModuleSymbol ( _glfw . egl . handle , " eglDestroyContext " ) ;
_glfw . egl . CreateWindowSurface = ( PFN_eglCreateWindowSurface )
_glfwPlatformGetModuleSymbol ( _glfw . egl . handle , " eglCreateWindowSurface " ) ;
_glfw . egl . CreatePbufferSurface = ( PFN_eglCreatePbufferSurface )
_glfwPlatformGetModuleSymbol ( _glfw . egl . handle , " eglCreatePbufferSurface " ) ;
_glfw . egl . MakeCurrent = ( PFN_eglMakeCurrent )
_glfwPlatformGetModuleSymbol ( _glfw . egl . handle , " eglMakeCurrent " ) ;
_glfw . egl . SwapBuffers = ( PFN_eglSwapBuffers )
@ -442,6 +448,7 @@ GLFWbool _glfwInitEGL(void)
! _glfw . egl . DestroySurface | |
! _glfw . egl . DestroyContext | |
! _glfw . egl . CreateWindowSurface | |
! _glfw . egl . CreatePbufferSurface | |
! _glfw . egl . MakeCurrent | |
! _glfw . egl . SwapBuffers | |
! _glfw . egl . SwapInterval | |
@ -477,6 +484,8 @@ GLFWbool _glfwInitEGL(void)
_glfwStringInExtensionString ( " EGL_ANGLE_platform_angle_vulkan " , extensions ) ;
_glfw . egl . ANGLE_platform_angle_metal =
_glfwStringInExtensionString ( " EGL_ANGLE_platform_angle_metal " , extensions ) ;
_glfw . egl . MESA_platform_surfaceless =
_glfwStringInExtensionString ( " EGL_MESA_platform_surfaceless " , extensions ) ;
}
if ( _glfw . egl . EXT_platform_base )
@ -708,20 +717,36 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
SET_ATTRIB ( EGL_PRESENT_OPAQUE_EXT , ! fbconfig - > transparent ) ;
}
if ( _glfw . egl . platform = = EGL_PLATFORM_SURFACELESS_MESA )
{
int width , height ;
_glfw . platform . getFramebufferSize ( window , & width , & height ) ;
SET_ATTRIB ( EGL_WIDTH , width ) ;
SET_ATTRIB ( EGL_HEIGHT , height ) ;
}
SET_ATTRIB ( EGL_NONE , EGL_NONE ) ;
native = _glfw . platform . getEGLNativeWindow ( window ) ;
// HACK: ANGLE does not implement eglCreatePlatformWindowSurfaceEXT
// despite reporting EGL_EXT_platform_base
if ( _glfw . egl . platform & & _glfw . egl . platform ! = EGL_PLATFORM_ANGLE_ANGLE )
if ( ! _glfw . egl . platform | | _glfw . egl . platform = = EGL_PLATFORM_ANGLE_ANGLE )
{
// HACK: Also use non-platform function for ANGLE, as it does not
// implement eglCreatePlatformWindowSurfaceEXT despite reporting
// support for EGL_EXT_platform_base
window - > context . egl . surface =
eglCreatePlatformWindowSurfaceEXT ( _glfw . egl . display , config , native , attribs ) ;
eglCreateWindowSurface ( _glfw . egl . display , config , native , attribs ) ;
}
else if ( _glfw . egl . platform = = EGL_PLATFORM_SURFACELESS_MESA )
{
// HACK: Use a pbuffer surface as the default framebuffer
window - > context . egl . surface =
eglCreatePbufferSurface ( _glfw . egl . display , config , attribs ) ;
}
else
{
window - > context . egl . surface =
eglCreateWindowSurface ( _glfw . egl . display , config , native , attribs ) ;
eglCreatePlatform WindowSurfaceEXT ( _glfw . egl . display , config , native , attribs ) ;
}
if ( window - > context . egl . surface = = EGL_NO_SURFACE )