diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index a428e3c98fb..bd91e4ab344 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -913,7 +913,7 @@ struct __DRIframebufferRec { * extension. Version 1 is required by the X server, and version 3 is used. */ #define __DRI_SWRAST "DRI_SWRast" -#define __DRI_SWRAST_VERSION 4 +#define __DRI_SWRAST_VERSION 5 struct __DRIswrastExtensionRec { __DRIextension base; @@ -960,6 +960,10 @@ struct __DRIswrastExtensionRec { const __DRIextension **driver_extensions, const __DRIconfig ***driver_configs, void *loaderPrivate); + /** + * \since version 5 + */ + int (*queryBufferAge)(__DRIdrawable *drawable); }; diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 5f1eb2e1cb0..2ec2aab1177 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -2636,6 +2636,16 @@ dri2_wl_swrast_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw) return EGL_TRUE; } +static EGLint +dri2_wl_swrast_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surface) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface); + + assert(dri2_dpy->swrast); + return dri2_dpy->swrast->queryBufferAge(dri2_surf->dri_drawable); +} + static void shm_handle_format(void *data, struct wl_shm *shm, uint32_t format) { @@ -2692,6 +2702,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_swrast_display_vtbl = { .create_image = dri2_create_image_khr, .swap_buffers = dri2_wl_swrast_swap_buffers, .get_dri_drawable = dri2_surface_get_dri_drawable, + .query_buffer_age = dri2_wl_swrast_query_buffer_age, }; static const __DRIswrastLoaderExtension swrast_loader_extension = { @@ -2812,6 +2823,7 @@ dri2_initialize_wayland_swrast(_EGLDisplay *disp) if (disp->Options.Zink && dri2_dpy->fd_render_gpu >= 0 && (dri2_dpy->wl_dmabuf || dri2_dpy->wl_drm)) dri2_set_WL_bind_wayland_display(disp); + disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE; disp->Extensions.EXT_present_opaque = EGL_TRUE; diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 6a73a9289ff..af6f49d764c 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -1321,6 +1321,16 @@ dri2_kopper_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surf) return 0; } +static EGLint +dri2_swrast_query_buffer_age(_EGLDisplay *disp, _EGLSurface *surf) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + + assert(dri2_dpy->swrast); + return dri2_dpy->swrast->queryBufferAge(dri2_surf->dri_drawable); +} + static const struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = { .authenticate = NULL, .create_window_surface = dri2_x11_create_window_surface, @@ -1332,6 +1342,7 @@ static const struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = { .swap_buffers_region = dri2_x11_swap_buffers_region, .post_sub_buffer = dri2_x11_post_sub_buffer, .copy_buffers = dri2_x11_copy_buffers, + .query_buffer_age = dri2_swrast_query_buffer_age, /* XXX: should really implement this since X11 has pixmaps */ .query_surface = dri2_query_surface, .get_msc_rate = dri2_x11_get_msc_rate, @@ -1549,12 +1560,12 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp) disp->Extensions.KHR_image_pixmap = EGL_TRUE; disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; - disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE; if (dri2_dpy->multibuffers_available) dri2_set_WL_bind_wayland_display(disp); } + disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.ANGLE_sync_control_rate = EGL_TRUE; if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp, !disp->Options.Zink)) diff --git a/src/gallium/frontends/dri/dri_drawable.h b/src/gallium/frontends/dri/dri_drawable.h index d759fcfbb64..fc767f6bdb6 100644 --- a/src/gallium/frontends/dri/dri_drawable.h +++ b/src/gallium/frontends/dri/dri_drawable.h @@ -84,6 +84,9 @@ struct dri_drawable unsigned int lastStamp; int w, h; + /* generic for swrast */ + unsigned buffer_age; + /* kopper */ struct kopper_loader_info info; __DRIimage *image; //texture_from_pixmap diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 201fc7f63d4..fc84abe16b8 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -751,6 +751,7 @@ driCreateNewDrawable(__DRIscreen *psp, struct dri_screen *screen = dri_screen(psp); struct dri_drawable *drawable = screen->create_drawable(screen, &config->modes, GL_FALSE, data); + drawable->buffer_age = 0; return opaque_dri_drawable(drawable); } @@ -855,6 +856,13 @@ driSwapBuffers(__DRIdrawable *pdp) drawable->swap_buffers(drawable); } +static int +driSWRastQueryBufferAge(__DRIdrawable *pdp) +{ + struct dri_drawable *drawable = dri_drawable(pdp); + return drawable->buffer_age; +} + /** Core interface */ const __DRIcoreExtension driCoreExtension = { .base = { __DRI_CORE, 2 }, @@ -915,6 +923,7 @@ const __DRIswrastExtension driSWRastExtension = { .createNewContextForAPI = driCreateNewContextForAPI, .createContextAttribs = driCreateContextAttribs, .createNewScreen2 = driSWRastCreateNewScreen2, + .queryBufferAge = driSWRastQueryBufferAge, }; const __DRI2configQueryExtension dri2ConfigQueryExtension = { diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 7c6a75a228b..460014baf1c 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -256,6 +256,7 @@ drisw_swap_buffers(struct dri_drawable *drawable) fence, OS_TIMEOUT_INFINITE); screen->base.screen->fence_reference(screen->base.screen, &fence, NULL); drisw_copy_to_front(ctx->st->pipe, drawable, ptex); + drawable->buffer_age = 1; /* TODO: remove this if the framebuffer state doesn't change. */ st_context_invalidate_state(ctx->st, ST_INVALIDATE_FB_STATE); @@ -370,6 +371,7 @@ drisw_allocate_textures(struct dri_context *stctx, pipe_resource_reference(&drawable->textures[i], NULL); pipe_resource_reference(&drawable->msaa_textures[i], NULL); } + drawable->buffer_age = 0; } memset(&templ, 0, sizeof(templ));