mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-13 17:30:32 +01:00
egl/dri: Use __DRI2_BUFFER_DAMAGE extension for KHR_partial_update
Use the DRI2 interface callback to pass the damage rects to the driver. Signed-off-by: Harish Krupo <harishkrupo@gmail.com> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Reviewed-by: Qiang Yu <yuq825@gmail.com> Tested-by: Qiang Yu <yuq825@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
bd08a83b09
commit
a4a8ebe156
2 changed files with 51 additions and 5 deletions
|
|
@ -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
|
||||
|
|
@ -1661,11 +1665,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
|
||||
|
|
@ -1674,12 +1689,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
|
||||
|
|
@ -1687,14 +1713,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
|
||||
|
|
|
|||
|
|
@ -181,6 +181,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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue