egl: add EGL_KHR_reusable_sync to egl_dri
[mesa.git] / src / egl / main / eglsync.c
index 3b4a88902fd21ac0e214992e5caa6869fc2a7790..33625e97ae31c5533368aceafb613bd79ec039a5 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "eglsync.h"
 #include "eglcurrent.h"
+#include "egldriver.h"
 #include "egllog.h"
 
 
@@ -66,7 +67,7 @@ _eglParseSyncAttribList(_EGLSync *sync, const EGLint *attrib_list)
 
 
 static EGLint
-_eglParseSyncAttribList64(_EGLSync *sync, const EGLAttribKHR *attrib_list)
+_eglParseSyncAttribList64(_EGLSync *sync, const EGLAttrib *attrib_list)
 {
    EGLint i, err = EGL_SUCCESS;
 
@@ -102,7 +103,7 @@ _eglParseSyncAttribList64(_EGLSync *sync, const EGLAttribKHR *attrib_list)
 
 EGLBoolean
 _eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
-             const EGLint *attrib_list, const EGLAttribKHR *attrib_list64)
+             const EGLint *attrib_list, const EGLAttrib *attrib_list64)
 {
    EGLint err;
 
@@ -140,17 +141,21 @@ _eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
 
 
 EGLBoolean
-_eglGetSyncAttribKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync,
-                     EGLint attribute, EGLint *value)
+_eglGetSyncAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync,
+                  EGLint attribute, EGLAttrib *value)
 {
-   if (!value)
-      return _eglError(EGL_BAD_PARAMETER, "eglGetConfigs");
-
    switch (attribute) {
    case EGL_SYNC_TYPE_KHR:
       *value = sync->Type;
       break;
    case EGL_SYNC_STATUS_KHR:
+      /* update the sync status */
+      if (sync->SyncStatus != EGL_SIGNALED_KHR &&
+          (sync->Type == EGL_SYNC_FENCE_KHR ||
+           sync->Type == EGL_SYNC_CL_EVENT_KHR ||
+          sync->Type == EGL_SYNC_REUSABLE_KHR))
+         drv->API.ClientWaitSyncKHR(drv, dpy, sync, 0, 0);
+
       *value = sync->SyncStatus;
       break;
    case EGL_SYNC_CONDITION_KHR: