diff options
author | Brendan King <[email protected]> | 2017-02-17 15:12:21 +0000 |
---|---|---|
committer | Eric Engestrom <[email protected]> | 2017-02-28 10:11:42 +0000 |
commit | 884f65e1856733697a894c86f94803343cfa9a21 (patch) | |
tree | 3130a3c25d6a0a3ed26ae16d706da7791458fa97 /src | |
parent | 936f5407a7da0449926a4f89abd222503ba43eb4 (diff) |
egl/dri3: implement query surface hook
This is a DRI3 version of a change made for DRI2
(4d6d4f939e0af4252e0b, "egl/dri2: implement query surface hook"),
that fixed failures in dEQP-EGL.functional.resize.surface_size.grow
and dEQP-EGL.functional.resize.surface_size.shrink.
Cc: Tapani Pälli <[email protected]>
Cc: Mark Janes <[email protected]>
Cc: Chad Versace <[email protected]>
Signed-off-by: Brendan King <[email protected]>
Reviewed-by: Tapani Pälli <[email protected]>
Cc: "17.0" <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/egl/drivers/dri2/platform_x11_dri3.c | 20 | ||||
-rw-r--r-- | src/loader/loader_dri3_helper.c | 23 | ||||
-rw-r--r-- | src/loader/loader_dri3_helper.h | 2 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c index c4747144d1e..c4a54431cce 100644 --- a/src/egl/drivers/dri2/platform_x11_dri3.c +++ b/src/egl/drivers/dri2/platform_x11_dri3.c @@ -419,6 +419,25 @@ dri3_query_buffer_age(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) return loader_dri3_query_buffer_age(&dri3_surf->loader_drawable); } +static EGLBoolean +dri3_query_surface(_EGLDriver *drv, _EGLDisplay *dpy, + _EGLSurface *surf, EGLint attribute, + EGLint *value) +{ + struct dri3_egl_surface *dri3_surf = dri3_egl_surface(surf); + + switch (attribute) { + case EGL_WIDTH: + case EGL_HEIGHT: + loader_dri3_update_drawable_geometry(&dri3_surf->loader_drawable); + break; + default: + break; + } + + return _eglQuerySurface(drv, dpy, surf, attribute, value); +} + static __DRIdrawable * dri3_get_dri_drawable(_EGLSurface *surf) { @@ -441,6 +460,7 @@ struct dri2_egl_display_vtbl dri3_x11_display_vtbl = { .post_sub_buffer = dri2_fallback_post_sub_buffer, .copy_buffers = dri3_copy_buffers, .query_buffer_age = dri3_query_buffer_age, + .query_surface = dri3_query_surface, .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image, .get_sync_values = dri3_get_sync_values, .get_dri_drawable = dri3_get_dri_drawable, diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 6e5d1b8843e..493a7f5218c 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -1408,3 +1408,26 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable, return true; } + +/** loader_dri3_update_drawable_geometry + * + * Get the current drawable geometry. + */ +void +loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw) +{ + xcb_get_geometry_cookie_t geom_cookie; + xcb_get_geometry_reply_t *geom_reply; + + geom_cookie = xcb_get_geometry(draw->conn, draw->drawable); + + geom_reply = xcb_get_geometry_reply(draw->conn, geom_cookie, NULL); + + if (geom_reply) { + draw->width = geom_reply->width; + draw->height = geom_reply->height; + draw->vtable->set_drawable_size(draw, draw->width, draw->height); + + free(geom_reply); + } +} diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h index 1d1f15ebb9a..a865e463559 100644 --- a/src/loader/loader_dri3_helper.h +++ b/src/loader/loader_dri3_helper.h @@ -239,4 +239,6 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable, uint32_t buffer_mask, struct __DRIimageList *buffers); +void +loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw); #endif |