egl: Add EGL_CHROMIUM_sync_control extension.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 6 May 2014 19:10:57 +0000 (12:10 -0700)
committerChad Versace <chad.versace@linux.intel.com>
Tue, 20 May 2014 22:19:48 +0000 (15:19 -0700)
Chromium defined a new GL extension (that isn't registered with Khronos).
We need to add an EGL extension for it, so we can migrate ChromeOS on
Intel systems to use EGL instead of GLX.

http://git.chromium.org/gitweb/?p=chromium/src/third_party/khronos.git;a=commitdiff;h=27cbfdab35c601f70aa150581ad1448d0401f447

The EGL_CHROMIUM_sync_control extension is similar to the GLX extension
OML_sync_control, but only defines one function,
eglGetSyncValuesCHROMIUM, which is equivalent to glXGetSyncValuesOML.

http://www.opengl.org/registry/specs/OML/glx_sync_control.txt

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Cc: Jamey Sharp <jamey@minilop.net>
Cc: Ian Romanick <idr@freedesktop.org>
Cc: Stéphane Marchesin <stephane.marchesin@gmail.com>
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/dri2/egl_dri2.h
src/egl/drivers/dri2/egl_dri2_fallbacks.h
src/egl/drivers/dri2/platform_android.c
src/egl/drivers/dri2/platform_drm.c
src/egl/drivers/dri2/platform_wayland.c
src/egl/drivers/dri2/platform_x11.c
src/egl/main/eglapi.c
src/egl/main/eglapi.h
src/egl/main/egldisplay.h
src/egl/main/eglmisc.c

index a5f71edb98406b776d741158683fc85dcd04b8fc..f7f2da254e2c1e35e57568b013bc918b488d1d23 100644 (file)
@@ -1389,6 +1389,15 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
 }
 #endif
 
+static EGLBoolean
+dri2_get_sync_values_chromium(_EGLDisplay *dpy, _EGLSurface *surf,
+                              EGLuint64KHR *ust, EGLuint64KHR *msc,
+                              EGLuint64KHR *sbc)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
+   return dri2_dpy->vtbl->get_sync_values(dpy, surf, ust, msc, sbc);
+}
+
 /**
  * Set the error code after a call to
  * dri2_egl_image::dri_image::createImageFromTexture.
@@ -2182,6 +2191,7 @@ _eglBuiltInDriverDRI2(const char *args)
    dri2_drv->base.API.UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl;
    dri2_drv->base.API.QueryWaylandBufferWL = dri2_query_wayland_buffer_wl;
 #endif
+   dri2_drv->base.API.GetSyncValuesCHROMIUM = dri2_get_sync_values_chromium;
 
    dri2_drv->base.Name = "DRI2";
    dri2_drv->base.Unload = dri2_unload;
index 44d6d74b948b42f4ee65b45331298a04061423fa..0dd9d69d08e08bd814f9c75b2c3784d15a082147 100644 (file)
@@ -138,6 +138,10 @@ struct dri2_egl_display_vtbl {
 
    struct wl_buffer* (*create_wayland_buffer_from_image)(
                         _EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img);
+
+   EGLBoolean (*get_sync_values)(_EGLDisplay *display, _EGLSurface *surface,
+                                 EGLuint64KHR *ust, EGLuint64KHR *msc,
+                                 EGLuint64KHR *sbc);
 };
 
 struct dri2_egl_display
index a5cf344f5e8fd7b2de68ed0728c6ca5641dbd809..9cba0010ba79f2975acd36e0851965bcccfbc79d 100644 (file)
@@ -98,3 +98,11 @@ dri2_fallback_create_wayland_buffer_from_image(_EGLDriver *drv,
 {
    return NULL;
 }
+
+static inline EGLBoolean
+dri2_fallback_get_sync_values(_EGLDisplay *dpy, _EGLSurface *surf,
+                              EGLuint64KHR *ust, EGLuint64KHR *msc,
+                              EGLuint64KHR *sbc)
+{
+   return EGL_FALSE;
+}
index 7b1db7677ce9735ba5f6ad3972a055afab4f8f04..71948bd88fe5aa0c40efed011f351c818e061631 100644 (file)
@@ -650,6 +650,7 @@ static struct dri2_egl_display_vtbl droid_display_vtbl = {
    .copy_buffers = dri2_fallback_copy_buffers,
    .query_buffer_age = dri2_fallback_query_buffer_age,
    .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image,
+   .get_sync_values = dri2_fallback_get_sync_values,
 };
 
 EGLBoolean
index 9a7633a070a2f2b0a78197dbbfbf805842cf8c15..52d8b49aa9e56f92cb220201b98b495c5815adcd 100644 (file)
@@ -472,6 +472,7 @@ static struct dri2_egl_display_vtbl dri2_drm_display_vtbl = {
    .copy_buffers = dri2_fallback_copy_buffers,
    .query_buffer_age = dri2_drm_query_buffer_age,
    .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image,
+   .get_sync_values = dri2_fallback_get_sync_values,
 };
 
 EGLBoolean
index 37dcf19f9bec6e9fc812547e4cd606cd371bd3f7..537d26e97b797bab7b92b8cbb8382c2c4adfb487 100644 (file)
@@ -964,6 +964,7 @@ static struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
    .copy_buffers = dri2_fallback_copy_buffers,
    .query_buffer_age = dri2_wl_query_buffer_age,
    .create_wayland_buffer_from_image = dri2_wl_create_wayland_buffer_from_image,
+   .get_sync_values = dri2_fallback_get_sync_values,
 };
 
 EGLBoolean
index 7b585a21971d8f6c6564e027a83b600d6339a2b6..874bcc48fe686cdebeeca197238ce33ea99742b7 100644 (file)
@@ -1008,6 +1008,32 @@ dri2_x11_swrast_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
    return NULL;
 }
 
+static EGLBoolean
+dri2_x11_get_sync_values(_EGLDisplay *display, _EGLSurface *surface,
+                         EGLuint64KHR *ust, EGLuint64KHR *msc,
+                         EGLuint64KHR *sbc)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(display);
+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
+   xcb_dri2_get_msc_cookie_t cookie;
+   xcb_dri2_get_msc_reply_t *reply;
+
+   cookie = xcb_dri2_get_msc(dri2_dpy->conn, dri2_surf->drawable);
+   reply = xcb_dri2_get_msc_reply(dri2_dpy->conn, cookie, NULL);
+
+   if (!reply) {
+      _eglError(EGL_BAD_ACCESS, __func__);
+      return EGL_FALSE;
+   }
+
+   *ust = ((EGLuint64KHR) reply->ust_hi << 32) | reply->ust_lo;
+   *msc = ((EGLuint64KHR) reply->msc_hi << 32) | reply->msc_lo;
+   *sbc = ((EGLuint64KHR) reply->sbc_hi << 32) | reply->sbc_lo;
+   free(reply);
+
+   return EGL_TRUE;
+}
+
 static struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = {
    .authenticate = NULL,
    .create_window_surface = dri2_x11_create_window_surface,
@@ -1022,6 +1048,7 @@ static struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = {
    .copy_buffers = dri2_x11_copy_buffers,
    .query_buffer_age = dri2_fallback_query_buffer_age,
    .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image,
+   .get_sync_values = dri2_fallback_get_sync_values,
 };
 
 static struct dri2_egl_display_vtbl dri2_x11_display_vtbl = {
@@ -1039,6 +1066,7 @@ static struct dri2_egl_display_vtbl dri2_x11_display_vtbl = {
    .copy_buffers = dri2_x11_copy_buffers,
    .query_buffer_age = dri2_fallback_query_buffer_age,
    .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image,
+   .get_sync_values = dri2_x11_get_sync_values,
 };
 
 static EGLBoolean
@@ -1243,6 +1271,7 @@ dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
    disp->Extensions.NOK_swap_region = EGL_TRUE;
    disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE;
    disp->Extensions.NV_post_sub_buffer = EGL_TRUE;
+   disp->Extensions.CHROMIUM_sync_control = EGL_TRUE;
 
 #ifdef HAVE_WAYLAND_PLATFORM
    disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
index 219d8e61715551061187bb334e93ad72ed7d9cfa..27d08027924961571e74fa45b0450344cc1a5560 100644 (file)
@@ -1086,6 +1086,7 @@ eglGetProcAddress(const char *procname)
       { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT },
       { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT },
       { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT },
+      { "eglGetSyncValuesCHROMIUM", (_EGLProc) eglGetSyncValuesCHROMIUM },
       { NULL, NULL }
    };
    EGLint i;
@@ -1751,3 +1752,25 @@ eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface,
 
    RETURN_EGL_EVAL(disp, ret);
 }
+
+EGLBoolean EGLAPIENTRY
+eglGetSyncValuesCHROMIUM(EGLDisplay display, EGLSurface surface,
+                         EGLuint64KHR *ust, EGLuint64KHR *msc,
+                         EGLuint64KHR *sbc)
+{
+   _EGLDisplay *disp = _eglLockDisplay(display);
+   _EGLSurface *surf = _eglLookupSurface(surface, disp);
+   _EGLDriver *drv;
+   EGLBoolean ret;
+
+   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
+   if (!disp->Extensions.CHROMIUM_sync_control)
+      RETURN_EGL_EVAL(disp, EGL_FALSE);
+
+   if (!ust || !msc || !sbc)
+      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
+
+   ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
+
+   RETURN_EGL_EVAL(disp, ret);
+}
index f20ce5b701b383cd6c41f5f7db236d1edceb538d..cb01cab0c001bad3772e349e73430c4eb86727f9 100644 (file)
@@ -139,6 +139,8 @@ typedef EGLint (*QueryBufferAge_t)(_EGLDriver *drv,
 typedef EGLBoolean (*SwapBuffersWithDamageEXT_t) (_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface, const EGLint *rects, EGLint n_rects);
 #endif
 
+typedef EGLBoolean (*GetSyncValuesCHROMIUM_t) (_EGLDisplay *dpy, _EGLSurface *surface, EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc);
+
 /**
  * The API dispatcher jumps through these functions
  */
@@ -225,6 +227,7 @@ struct _egl_api
    PostSubBufferNV_t PostSubBufferNV;
 
    QueryBufferAge_t QueryBufferAge;
+   GetSyncValuesCHROMIUM_t GetSyncValuesCHROMIUM;
 };
 
 #endif /* EGLAPI_INCLUDED */
index 970c21a9289a3e6c4c4d1bf077f2cf94f1b05121..13b95327bc15ddc6226046b1944bab6b803000a0 100644 (file)
@@ -113,6 +113,8 @@ struct _egl_extensions
 
    EGLBoolean ANDROID_image_native_buffer;
 
+   EGLBoolean CHROMIUM_sync_control;
+
    EGLBoolean NV_post_sub_buffer;
 
    EGLBoolean EXT_create_context_robustness;
index 65669d8830fb8448349672419d72a422a3a40b15..388e4b51b7a469c4c1857dad4b72c32c2a114d42 100644 (file)
@@ -117,6 +117,8 @@ _eglUpdateExtensionsString(_EGLDisplay *dpy)
 
    _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
 
+   _EGL_CHECK_EXTENSION(CHROMIUM_sync_control);
+
    _EGL_CHECK_EXTENSION(EXT_create_context_robustness);
    _EGL_CHECK_EXTENSION(EXT_buffer_age);
    _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);