This passes 33/37 deqp tests related to partial_update, 4 are not supported. Tests not supported: dEQP-EGL.functional.negative_partial_update.not_postable_surface dEQP-EGL.functional.negative_partial_update.not_current_surface dEQP-EGL.functional.negative_partial_update.buffer_preserved dEQP-EGL.functional.negative_partial_update.not_current_surface2 Reason: No matching egl config found.
v2: Remove unnecessary return statement. Keep function names consistent. (Emil Velikov) Add not supported list to commit message. (Eric Engestrom) Signed-off-by: Harish Krupo <harish.krupo....@intel.com> --- src/egl/drivers/dri2/platform_wayland.c | 67 ++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index b38eb1c335..daa148380b 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -809,15 +809,38 @@ try_damage_buffer(struct dri2_egl_surface *dri2_surf, } return EGL_TRUE; } + /** - * Called via eglSwapBuffers(), drv->API.SwapBuffers(). + * Called via eglSetDamageRegionKHR(), drv->API.SetDamageRegion(). */ static EGLBoolean -dri2_wl_swap_buffers_with_damage(_EGLDriver *drv, - _EGLDisplay *disp, - _EGLSurface *draw, - const EGLint *rects, - EGLint n_rects) +dri2_wl_set_damage_region(_EGLDriver *drv, + _EGLDisplay *dpy, + _EGLSurface *surf, + const EGLint *rects, + EGLint n_rects) +{ + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + + /* The spec doesn't mention what should be returned in case of + * failure in setting the damage buffer with the window system, so + * setting the damage to maximum surface area + */ + if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects)) { + wl_surface_damage(dri2_surf->wl_surface_wrapper, + 0, 0, INT32_MAX, INT32_MAX); + } + + return EGL_TRUE; +} + +static EGLBoolean +dri2_wl_swap_buffers_common(_EGLDriver *drv, + _EGLDisplay *disp, + _EGLSurface *draw, + const EGLint *rects, + EGLint n_rects, + EGLBoolean with_damage) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); @@ -875,7 +898,17 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv, /* If the compositor doesn't support damage_buffer, we deliberately * ignore the damage region and post maximum damage, due to * https://bugs.freedesktop.org/78190 */ - if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects)) + + if (!with_damage) { + + /* If called from swapBuffers, check if the damage region + * is already set, if not set to full damage + */ + if (!dri2_surf->base.SetDamageRegionCalled) + wl_surface_damage(dri2_surf->wl_surface_wrapper, + 0, 0, INT32_MAX, INT32_MAX); + } + else if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects)) wl_surface_damage(dri2_surf->wl_surface_wrapper, 0, 0, INT32_MAX, INT32_MAX); @@ -911,6 +944,20 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv, return EGL_TRUE; } +/** + * Called via eglSwapBuffers(), drv->API.SwapBuffers(). + */ +static EGLBoolean +dri2_wl_swap_buffers_with_damage(_EGLDriver *drv, + _EGLDisplay *disp, + _EGLSurface *draw, + const EGLint *rects, + EGLint n_rects) +{ + return dri2_wl_swap_buffers_common(drv, disp, draw, + rects, n_rects, EGL_TRUE); +} + static EGLint dri2_wl_query_buffer_age(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface) @@ -928,7 +975,8 @@ dri2_wl_query_buffer_age(_EGLDriver *drv, static EGLBoolean dri2_wl_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) { - return dri2_wl_swap_buffers_with_damage(drv, disp, draw, NULL, 0); + return dri2_wl_swap_buffers_common(drv, disp, draw, + NULL, 0, EGL_FALSE); } static struct wl_buffer * @@ -1166,7 +1214,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = { .swap_buffers = dri2_wl_swap_buffers, .swap_buffers_with_damage = dri2_wl_swap_buffers_with_damage, .swap_buffers_region = dri2_fallback_swap_buffers_region, - .set_damage_region = dri2_fallback_set_damage_region, + .set_damage_region = dri2_wl_set_damage_region, .post_sub_buffer = dri2_fallback_post_sub_buffer, .copy_buffers = dri2_fallback_copy_buffers, .query_buffer_age = dri2_wl_query_buffer_age, @@ -1378,6 +1426,7 @@ dri2_initialize_wayland_drm(_EGLDriver *drv, _EGLDisplay *disp) disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE; + disp->Extensions.KHR_partial_update = EGL_TRUE; /* Fill vtbl last to prevent accidentally calling virtual function during * initialization. -- 2.14.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev