EGL: Implement glfwGetBufferAge()

This feature is provided by the EGL_EXT_buffer_age extension, otherwise
always return 0.
This commit is contained in:
Emmanuel Gil Peyrot 2019-12-08 17:39:19 +01:00
parent 0d2ce23071
commit c8233ce7d3
2 changed files with 27 additions and 0 deletions

View File

@ -254,6 +254,24 @@ static void swapIntervalEGL(int interval)
eglSwapInterval(_glfw.egl.display, interval); eglSwapInterval(_glfw.egl.display, interval);
} }
static int getBufferAgeEGL(_GLFWwindow* window)
{
EGLint buffer_age;
if (window != _glfwPlatformGetTls(&_glfw.contextSlot))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGL: The context must be current on the calling thread when swapping buffers");
return 0;
}
if (!eglQuerySurface(_glfw.egl.display, window->context.egl.surface,
EGL_BUFFER_AGE_EXT, &buffer_age))
return 0;
return buffer_age;
}
static int extensionSupportedEGL(const char* extension) static int extensionSupportedEGL(const char* extension)
{ {
const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS); const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS);
@ -384,6 +402,8 @@ GLFWbool _glfwInitEGL(void)
_glfw_dlsym(_glfw.egl.handle, "eglSwapInterval"); _glfw_dlsym(_glfw.egl.handle, "eglSwapInterval");
_glfw.egl.QueryString = (PFN_eglQueryString) _glfw.egl.QueryString = (PFN_eglQueryString)
_glfw_dlsym(_glfw.egl.handle, "eglQueryString"); _glfw_dlsym(_glfw.egl.handle, "eglQueryString");
_glfw.egl.QuerySurface = (PFN_eglQuerySurface)
_glfw_dlsym(_glfw.egl.handle, "eglQuerySurface");
_glfw.egl.GetProcAddress = (PFN_eglGetProcAddress) _glfw.egl.GetProcAddress = (PFN_eglGetProcAddress)
_glfw_dlsym(_glfw.egl.handle, "eglGetProcAddress"); _glfw_dlsym(_glfw.egl.handle, "eglGetProcAddress");
@ -402,6 +422,7 @@ GLFWbool _glfwInitEGL(void)
!_glfw.egl.SwapBuffers || !_glfw.egl.SwapBuffers ||
!_glfw.egl.SwapInterval || !_glfw.egl.SwapInterval ||
!_glfw.egl.QueryString || !_glfw.egl.QueryString ||
!_glfw.egl.QuerySurface ||
!_glfw.egl.GetProcAddress) !_glfw.egl.GetProcAddress)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
@ -719,6 +740,7 @@ GLFWbool _glfwCreateContextEGL(_GLFWwindow* window,
window->context.swapBuffers = swapBuffersEGL; window->context.swapBuffers = swapBuffersEGL;
window->context.swapBuffersWithDamage = swapBuffersWithDamageEGL; window->context.swapBuffersWithDamage = swapBuffersWithDamageEGL;
window->context.swapInterval = swapIntervalEGL; window->context.swapInterval = swapIntervalEGL;
window->context.getBufferAge = getBufferAgeEGL;
window->context.extensionSupported = extensionSupportedEGL; window->context.extensionSupported = extensionSupportedEGL;
window->context.getProcAddress = getProcAddressEGL; window->context.getProcAddress = getProcAddressEGL;
window->context.destroy = destroyContextEGL; window->context.destroy = destroyContextEGL;

View File

@ -107,6 +107,8 @@ typedef struct wl_egl_window* EGLNativeWindowType;
#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 #define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0
#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 #define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098
#define EGL_BUFFER_AGE_EXT 0x313D
typedef int EGLint; typedef int EGLint;
typedef unsigned int EGLBoolean; typedef unsigned int EGLBoolean;
typedef unsigned int EGLenum; typedef unsigned int EGLenum;
@ -131,6 +133,7 @@ typedef EGLBoolean (EGLAPIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLS
typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface); typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface);
typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint); typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint);
typedef const char* (EGLAPIENTRY * PFN_eglQueryString)(EGLDisplay,EGLint); typedef const char* (EGLAPIENTRY * PFN_eglQueryString)(EGLDisplay,EGLint);
typedef EGLBoolean (EGLAPIENTRY * PFN_eglQuerySurface)(EGLDisplay,EGLSurface,EGLint,EGLint*);
typedef GLFWglproc (EGLAPIENTRY * PFN_eglGetProcAddress)(const char*); typedef GLFWglproc (EGLAPIENTRY * PFN_eglGetProcAddress)(const char*);
typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffersWithDamageKHR)(EGLDisplay,EGLSurface,EGLint*,EGLint); typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffersWithDamageKHR)(EGLDisplay,EGLSurface,EGLint*,EGLint);
#define eglGetConfigAttrib _glfw.egl.GetConfigAttrib #define eglGetConfigAttrib _glfw.egl.GetConfigAttrib
@ -148,6 +151,7 @@ typedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffersWithDamageKHR)(EGLDisplay,EG
#define eglSwapBuffers _glfw.egl.SwapBuffers #define eglSwapBuffers _glfw.egl.SwapBuffers
#define eglSwapInterval _glfw.egl.SwapInterval #define eglSwapInterval _glfw.egl.SwapInterval
#define eglQueryString _glfw.egl.QueryString #define eglQueryString _glfw.egl.QueryString
#define eglQuerySurface _glfw.egl.QuerySurface
#define eglGetProcAddress _glfw.egl.GetProcAddress #define eglGetProcAddress _glfw.egl.GetProcAddress
#define eglSwapBuffersWithDamageKHR _glfw.egl.SwapBuffersWithDamageKHR #define eglSwapBuffersWithDamageKHR _glfw.egl.SwapBuffersWithDamageKHR
@ -199,6 +203,7 @@ typedef struct _GLFWlibraryEGL
PFN_eglSwapBuffers SwapBuffers; PFN_eglSwapBuffers SwapBuffers;
PFN_eglSwapInterval SwapInterval; PFN_eglSwapInterval SwapInterval;
PFN_eglQueryString QueryString; PFN_eglQueryString QueryString;
PFN_eglQuerySurface QuerySurface;
PFN_eglGetProcAddress GetProcAddress; PFN_eglGetProcAddress GetProcAddress;
PFN_eglSwapBuffersWithDamageKHR SwapBuffersWithDamageKHR; PFN_eglSwapBuffersWithDamageKHR SwapBuffersWithDamageKHR;