Use the DRI2 interface callback to pass the damage rects to the driver. Signed-off-by: Harish Krupo <harish.krupo....@intel.com> --- src/egl/drivers/dri2/egl_dri2.c | 46 ++++++++++++++++++++++++++++++--- src/egl/drivers/dri2/egl_dri2.h | 1 + 2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 8f1e78186b..0659976d9a 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -455,6 +455,7 @@ static const struct dri2_extension_match optional_core_extensions[] = { { __DRI2_NO_ERROR, 1, offsetof(struct dri2_egl_display, no_error) }, { __DRI2_CONFIG_QUERY, 1, offsetof(struct dri2_egl_display, config) }, { __DRI2_FENCE, 1, offsetof(struct dri2_egl_display, fence) }, + { __DRI2_DAMAGE, 1, offsetof(struct dri2_egl_display, damage_extension) }, { __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_egl_display, rendererQuery) }, { __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) }, { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) }, @@ -891,6 +892,9 @@ dri2_setup_extensions(_EGLDisplay *disp) (dri2_dpy->image && dri2_dpy->image->base.version >= 15); #endif + if (dri2_dpy->damage_extension) + disp->Extensions.KHR_partial_update = true; + dri2_bind_extensions(dri2_dpy, optional_core_extensions, extensions, true); return EGL_TRUE; } @@ -1659,10 +1663,20 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); _EGLContext *ctx = _eglGetCurrentContext(); + __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context; + int ret; if (ctx && surf) dri2_surf_update_fence_fd(ctx, dpy, surf); - return dri2_dpy->vtbl->swap_buffers(drv, dpy, surf); + ret = dri2_dpy->vtbl->swap_buffers(drv, dpy, surf); + + /* Successfully swapped the buffer. + * This marks the end of frame boundary. + * Set the damage rects back to full again. + */ + if (ret && dri2_dpy->damage_extension) + dri2_dpy->damage_extension->set_damage_region(dri_ctx, 0, NULL); + return ret; } static EGLBoolean @@ -1672,11 +1686,20 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv, _EGLDisplay *dpy, { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); _EGLContext *ctx = _eglGetCurrentContext(); + __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context; + int ret; if (ctx && surf) dri2_surf_update_fence_fd(ctx, dpy, surf); - return dri2_dpy->vtbl->swap_buffers_with_damage(drv, dpy, surf, + ret = dri2_dpy->vtbl->swap_buffers_with_damage(drv, dpy, surf, rects, n_rects); + /* Successfully swapped the buffer. + * This marks the end of frame boundary. + * Set the damage rects back to full again. + */ + if (ret && dri2_dpy->damage_extension) + dri2_dpy->damage_extension->set_damage_region(dri_ctx, 0, NULL); + return ret; } static EGLBoolean @@ -1684,7 +1707,16 @@ dri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint numRects, const EGLint *rects) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); - return dri2_dpy->vtbl->swap_buffers_region(drv, dpy, surf, numRects, rects); + _EGLContext *ctx = _eglGetCurrentContext(); + __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context; + int ret = dri2_dpy->vtbl->swap_buffers_region(drv, dpy, surf, numRects, rects); + /* Successfully swapped the buffer. + * This marks the end of frame boundary. + * Set the damage rects back to full again. + */ + if (ret && dri2_dpy->damage_extension) + dri2_dpy->damage_extension->set_damage_region(dri_ctx, 0, NULL); + return ret; } static EGLBoolean @@ -1692,7 +1724,13 @@ dri2_set_damage_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint *rects, EGLint n_rects) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); - return false; + + _EGLContext *ctx = _eglGetCurrentContext(); + __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context; + if (dri2_dpy->damage_extension) + return dri2_dpy->damage_extension->set_damage_region(dri_ctx, n_rects, rects); + else + return false; } static EGLBoolean diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index c7ea212946..8efa33da6d 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -171,6 +171,7 @@ struct dri2_egl_display const __DRInoErrorExtension *no_error; const __DRI2configQueryExtension *config; const __DRI2fenceExtension *fence; + const __DRI2damageExtension *damage_extension; const __DRI2blobExtension *blob; const __DRI2rendererQueryExtension *rendererQuery; const __DRI2interopExtension *interop; -- 2.18.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev