[Mesa-dev] [PATCH] egl: syncronize surface information with driver RFC

Tapani Pälli tapani.palli at intel.com
Mon Dec 19 12:36:42 UTC 2016


This makes sure that the values we return are in sync what the
driver currently has.

Together with dEQP change bug #98327 this fixes following test:

   dEQP-EGL.functional.resize.surface_size.grow

v2: implement callback also for dri3
v3: make optional for dri2 drivers, only x11 dri2 seems
    to require this right now

Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98327
---
 src/egl/drivers/dri2/egl_dri2.c     | 12 ++++++++++++
 src/egl/drivers/dri2/egl_dri2.h     |  2 ++
 src/egl/drivers/dri2/platform_x11.c | 31 +++++++++++++++++++++++++++++++
 src/egl/main/eglapi.h               |  2 ++
 src/egl/main/eglfallbacks.c         |  1 +
 src/egl/main/eglsurface.c           |  3 +++
 6 files changed, 51 insertions(+)

diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 52fbdff..112c6ad 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1264,6 +1264,17 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
    return dri2_dpy->vtbl->destroy_surface(drv, dpy, surf);
 }
 
+static EGLBoolean
+dri2_sync_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
+
+   if (dri2_dpy->vtbl->sync_surface)
+      return dri2_dpy->vtbl->sync_surface(drv, dpy, surf);
+
+   return EGL_TRUE;
+}
+
 /**
  * Called via eglMakeCurrent(), drv->API.MakeCurrent().
  */
@@ -2942,6 +2953,7 @@ _eglBuiltInDriverDRI2(const char *args)
    dri2_drv->base.API.CreatePixmapSurface = dri2_create_pixmap_surface;
    dri2_drv->base.API.CreatePbufferSurface = dri2_create_pbuffer_surface;
    dri2_drv->base.API.DestroySurface = dri2_destroy_surface;
+   dri2_drv->base.API.SyncSurface = dri2_sync_surface;
    dri2_drv->base.API.GetProcAddress = dri2_get_proc_address;
    dri2_drv->base.API.WaitClient = dri2_wait_client;
    dri2_drv->base.API.WaitNative = dri2_wait_native;
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index eac58f3..d5cc9b8 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -110,6 +110,8 @@ struct dri2_egl_display_vtbl {
 
    EGLBoolean (*destroy_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
                                  _EGLSurface *surface);
+   EGLBoolean (*sync_surface)(_EGLDriver *drv, _EGLDisplay *dpy,
+                              _EGLSurface *surface);
 
    EGLBoolean (*swap_interval)(_EGLDriver *drv, _EGLDisplay *dpy,
                                _EGLSurface *surf, EGLint interval);
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
index db7d3b9..ecbd8de 100644
--- a/src/egl/drivers/dri2/platform_x11.c
+++ b/src/egl/drivers/dri2/platform_x11.c
@@ -395,6 +395,36 @@ dri2_x11_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
 }
 
 /**
+ * Syncronize surface geometry with server
+ */
+static EGLBoolean
+dri2_x11_sync_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
+   xcb_get_geometry_cookie_t cookie;
+   xcb_get_geometry_reply_t *reply;
+   EGLBoolean result = EGL_TRUE;
+   xcb_generic_error_t *error;
+
+   cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);
+   reply = xcb_get_geometry_reply (dri2_dpy->conn, cookie, &error);
+   if (reply == NULL)
+      return EGL_FALSE;
+
+   if (error != NULL) {
+      _eglLog(_EGL_WARNING, "error in xcb_get_geometry");
+      result = EGL_FALSE;
+      free(error);
+   } else {
+      surf->Width = reply->width;
+      surf->Height = reply->height;
+   }
+   free(reply);
+   return result;
+}
+
+/**
  * Process list of buffer received from the server
  *
  * Processes the list of buffers received in a reply from the server to either
@@ -1124,6 +1154,7 @@ static struct dri2_egl_display_vtbl dri2_x11_display_vtbl = {
    .create_pixmap_surface = dri2_x11_create_pixmap_surface,
    .create_pbuffer_surface = dri2_x11_create_pbuffer_surface,
    .destroy_surface = dri2_x11_destroy_surface,
+   .sync_surface = dri2_x11_sync_surface,
    .create_image = dri2_x11_create_image_khr,
    .swap_interval = dri2_x11_swap_interval,
    .swap_buffers = dri2_x11_swap_buffers,
diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
index 710c5d8..5152b93 100644
--- a/src/egl/main/eglapi.h
+++ b/src/egl/main/eglapi.h
@@ -94,6 +94,8 @@ struct _egl_api
                                         const EGLint *attrib_list);
    EGLBoolean (*DestroySurface)(_EGLDriver *drv, _EGLDisplay *dpy,
                                 _EGLSurface *surface);
+   EGLBoolean (*SyncSurface)(_EGLDriver *drv, _EGLDisplay *dpy,
+                              _EGLSurface *surface);
    EGLBoolean (*QuerySurface)(_EGLDriver *drv, _EGLDisplay *dpy,
                               _EGLSurface *surface, EGLint attribute,
                               EGLint *value);
diff --git a/src/egl/main/eglfallbacks.c b/src/egl/main/eglfallbacks.c
index 017d337..53b42b8 100644
--- a/src/egl/main/eglfallbacks.c
+++ b/src/egl/main/eglfallbacks.c
@@ -70,6 +70,7 @@ _eglInitDriverFallbacks(_EGLDriver *drv)
    drv->API.CreatePbufferFromClientBuffer =
       (void*) _eglReturnFalse;
    drv->API.DestroySurface = (void*) _eglReturnFalse;
+   drv->API.SyncSurface = NULL;
    drv->API.QuerySurface = _eglQuerySurface;
    drv->API.SurfaceAttrib = _eglSurfaceAttrib;
 
diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c
index 04f42ca..e8f9f40 100644
--- a/src/egl/main/eglsurface.c
+++ b/src/egl/main/eglsurface.c
@@ -338,6 +338,9 @@ EGLBoolean
 _eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
                  EGLint attribute, EGLint *value)
 {
+   /* Syncronize surface information with the driver. */
+   drv->API.SyncSurface(drv, dpy, surface);
+
    switch (attribute) {
    case EGL_WIDTH:
       *value = surface->Width;
-- 
2.9.3



More information about the mesa-dev mailing list