This is part of the EGL spec, and is useful for a tiled renderer to avoid the memory bandwidth cost of storing the depth/stencil buffers. Reviewed-by: Jose Fonseca <jfonseca@vmware.com>tags/10.5-branchpoint
@@ -279,6 +279,7 @@ struct __DRItexBufferExtensionRec { | |||
#define __DRI2_FLUSH_DRAWABLE (1 << 0) /* the drawable should be flushed. */ | |||
#define __DRI2_FLUSH_CONTEXT (1 << 1) /* glFlush should be called */ | |||
#define __DRI2_FLUSH_INVALIDATE_ANCILLARY (1 << 2) | |||
enum __DRI2throttleReason { | |||
__DRI2_THROTTLE_SWAPBUFFER, |
@@ -1087,6 +1087,42 @@ dri2_swap_interval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, | |||
return dri2_dpy->vtbl->swap_interval(drv, dpy, surf, interval); | |||
} | |||
/** | |||
* Asks the client API to flush any rendering to the drawable so that we can | |||
* do our swapbuffers. | |||
*/ | |||
void | |||
dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw) | |||
{ | |||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); | |||
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); | |||
if (dri2_dpy->flush) { | |||
if (dri2_dpy->flush->base.version >= 4) { | |||
/* We know there's a current context because: | |||
* | |||
* "If surface is not bound to the calling thread’s current | |||
* context, an EGL_BAD_SURFACE error is generated." | |||
*/ | |||
_EGLContext *ctx = _eglGetCurrentContext(); | |||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); | |||
/* From the EGL 1.4 spec (page 52): | |||
* | |||
* "The contents of ancillary buffers are always undefined | |||
* after calling eglSwapBuffers." | |||
*/ | |||
dri2_dpy->flush->flush_with_flags(dri2_ctx->dri_context, | |||
dri2_surf->dri_drawable, | |||
__DRI2_FLUSH_DRAWABLE | | |||
__DRI2_FLUSH_INVALIDATE_ANCILLARY, | |||
__DRI2_THROTTLE_SWAPBUFFER); | |||
} else { | |||
dri2_dpy->flush->flush(dri2_surf->dri_drawable); | |||
} | |||
} | |||
} | |||
static EGLBoolean | |||
dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) | |||
{ |
@@ -332,4 +332,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp); | |||
EGLBoolean | |||
dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp); | |||
void | |||
dri2_flush_drawable_for_swapbuffers(_EGLDisplay *disp, _EGLSurface *draw); | |||
#endif /* EGL_DRI2_INCLUDED */ |
@@ -311,7 +311,7 @@ droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) | |||
dri2_drv->glFlush(); | |||
} | |||
(*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); | |||
dri2_flush_drawable_for_swapbuffers(disp, draw); | |||
if (dri2_surf->buffer) | |||
droid_window_enqueue_buffer(dri2_surf); |
@@ -431,7 +431,7 @@ dri2_drm_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) | |||
dri2_surf->back = NULL; | |||
} | |||
(*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); | |||
dri2_flush_drawable_for_swapbuffers(disp, draw); | |||
(*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); | |||
} | |||
@@ -649,17 +649,7 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv, | |||
} | |||
} | |||
if (dri2_dpy->flush->base.version >= 4) { | |||
ctx = _eglGetCurrentContext(); | |||
dri2_ctx = dri2_egl_context(ctx); | |||
(*dri2_dpy->flush->flush_with_flags)(dri2_ctx->dri_context, | |||
dri2_surf->dri_drawable, | |||
__DRI2_FLUSH_DRAWABLE, | |||
__DRI2_THROTTLE_SWAPBUFFER); | |||
} else { | |||
(*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); | |||
} | |||
dri2_flush_drawable_for_swapbuffers(disp, draw); | |||
(*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); | |||
wl_surface_commit(dri2_surf->wl_win->surface); |
@@ -771,8 +771,7 @@ dri2_x11_swap_buffers_msc(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw, | |||
if (draw->SwapBehavior == EGL_BUFFER_PRESERVED || !dri2_dpy->swap_available) | |||
return dri2_copy_region(drv, disp, draw, dri2_surf->region) ? 0 : -1; | |||
if (dri2_dpy->flush) | |||
(*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); | |||
dri2_flush_drawable_for_swapbuffers(disp, draw); | |||
cookie = xcb_dri2_swap_buffers_unchecked(dri2_dpy->conn, dri2_surf->drawable, | |||
msc_hi, msc_lo, divisor_hi, divisor_lo, remainder_hi, remainder_lo); |