drisw: hook up EXT_buffer_age

drisw only has a single drawable, which means the buffer age is always 1

Acked-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27554>
This commit is contained in:
Mike Blumenkrantz
2024-02-09 10:51:15 -05:00
committed by Marge Bot
parent 9eb4b86e76
commit 81ecb21d50
6 changed files with 43 additions and 2 deletions

View File

@@ -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);
};

View File

@@ -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;

View File

@@ -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))

View File

@@ -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

View File

@@ -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 = {

View File

@@ -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));