[Mesa-dev] [PATCH v4 3/5] egl/dri: Use __DRI2_DAMAGE extension for KHR_partial_update
Boris Brezillon
boris.brezillon at collabora.com
Tue Jun 25 16:37:47 UTC 2019
From: Harish Krupo <harish.krupo.kps at intel.com>
Use the DRI2 interface callback to pass the damage rects to
the driver.
Signed-off-by: Harish Krupo <harish.krupo.kps at intel.com>
Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
---
src/egl/drivers/dri2/egl_dri2.c | 55 ++++++++++++++++++++++++++++++---
src/egl/drivers/dri2/egl_dri2.h | 1 +
2 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 3c33b2cf27f8..fcafcfd73c63 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -452,6 +452,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_BUFFER_DAMAGE, 1, offsetof(struct dri2_egl_display, buffer_damage) },
{ __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) },
@@ -721,6 +722,9 @@ dri2_setup_screen(_EGLDisplay *disp)
if (dri2_dpy->flush_control)
disp->Extensions.KHR_context_flush_control = EGL_TRUE;
+
+ if (dri2_dpy->buffer_damage && dri2_dpy->buffer_damage->set_damage_region)
+ disp->Extensions.KHR_partial_update = EGL_TRUE;
}
void
@@ -1658,11 +1662,22 @@ static EGLBoolean
dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
_EGLContext *ctx = _eglGetCurrentContext();
+ EGLBoolean ret;
if (ctx && surf)
dri2_surf_update_fence_fd(ctx, disp, surf);
- return dri2_dpy->vtbl->swap_buffers(drv, disp, surf);
+ ret = dri2_dpy->vtbl->swap_buffers(drv, disp, surf);
+
+ /* SwapBuffers marks the end of the frame; reset the damage region for
+ * use again next time.
+ */
+ if (ret && dri2_dpy->buffer_damage &&
+ dri2_dpy->buffer_damage->set_damage_region)
+ dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
+
+ return ret;
}
static EGLBoolean
@@ -1671,12 +1686,23 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv, _EGLDisplay *disp,
const EGLint *rects, EGLint n_rects)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
_EGLContext *ctx = _eglGetCurrentContext();
+ EGLBoolean ret;
if (ctx && surf)
dri2_surf_update_fence_fd(ctx, disp, surf);
- return dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf,
- rects, n_rects);
+ ret = dri2_dpy->vtbl->swap_buffers_with_damage(drv, disp, surf,
+ rects, n_rects);
+
+ /* SwapBuffers marks the end of the frame; reset the damage region for
+ * use again next time.
+ */
+ if (ret && dri2_dpy->buffer_damage &&
+ dri2_dpy->buffer_damage->set_damage_region)
+ dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
+
+ return ret;
}
static EGLBoolean
@@ -1684,14 +1710,33 @@ dri2_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
EGLint numRects, const EGLint *rects)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- return dri2_dpy->vtbl->swap_buffers_region(drv, disp, surf, numRects, rects);
+ __DRIdrawable *dri_drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
+ EGLBoolean ret;
+
+ ret = dri2_dpy->vtbl->swap_buffers_region(drv, disp, surf, numRects, rects);
+
+ /* SwapBuffers marks the end of the frame; reset the damage region for
+ * use again next time.
+ */
+ if (ret && dri2_dpy->buffer_damage &&
+ dri2_dpy->buffer_damage->set_damage_region)
+ dri2_dpy->buffer_damage->set_damage_region(dri_drawable, 0, NULL);
+
+ return ret;
}
static EGLBoolean
dri2_set_damage_region(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
EGLint *rects, EGLint n_rects)
{
- return false;
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ __DRIdrawable *drawable = dri2_dpy->vtbl->get_dri_drawable(surf);
+
+ if (!dri2_dpy->buffer_damage || !dri2_dpy->buffer_damage->set_damage_region)
+ return EGL_FALSE;
+
+ dri2_dpy->buffer_damage->set_damage_region(drawable, n_rects, rects);
+ return EGL_TRUE;
}
static EGLBoolean
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index f9237dbe2559..00bce2285d3e 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -178,6 +178,7 @@ struct dri2_egl_display
const __DRInoErrorExtension *no_error;
const __DRI2configQueryExtension *config;
const __DRI2fenceExtension *fence;
+ const __DRI2bufferDamageExtension *buffer_damage;
const __DRI2blobExtension *blob;
const __DRI2rendererQueryExtension *rendererQuery;
const __DRI2interopExtension *interop;
--
2.20.1
More information about the mesa-dev
mailing list