From d5ba75f8881f0869dc16f71f7395514c0a35b6e2 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Tue, 20 Jun 2017 19:24:34 +0200 Subject: [PATCH] st/dri2 Plumb the flush_swapbuffer functionality through to dri3 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Implement the state tracker manager drawable interface flush_swapbuffer method by plumbing it through to dri3 if available. Signed-off-by: Thomas Hellstrom Reviewed-by: Marek Olšák Reviewed-by: Brian Paul Reviewed-by: Sinclair Yeh --- src/gallium/state_trackers/dri/dri2.c | 16 ++++++++++++++++ src/gallium/state_trackers/dri/dri_drawable.c | 18 ++++++++++++++++++ src/gallium/state_trackers/dri/dri_drawable.h | 2 ++ 3 files changed, 36 insertions(+) diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 0f71adc7689..1171e7386d7 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -861,6 +861,21 @@ dri2_flush_frontbuffer(struct dri_context *ctx, } } +/** + * The struct dri_drawable flush_swapbuffers callback + */ +static void +dri2_flush_swapbuffers(struct dri_context *ctx, + struct dri_drawable *drawable) +{ + __DRIdrawable *dri_drawable = drawable->dPriv; + const __DRIimageLoaderExtension *image = drawable->sPriv->image.loader; + + if (image && image->base.version >= 3 && image->flushSwapBuffers) { + image->flushSwapBuffers(dri_drawable, dri_drawable->loaderPrivate); + } +} + static void dri2_update_tex_buffer(struct dri_drawable *drawable, struct dri_context *ctx, @@ -2218,6 +2233,7 @@ dri2_create_buffer(__DRIscreen * sPriv, drawable->allocate_textures = dri2_allocate_textures; drawable->flush_frontbuffer = dri2_flush_frontbuffer; drawable->update_tex_buffer = dri2_update_tex_buffer; + drawable->flush_swapbuffers = dri2_flush_swapbuffers; return TRUE; } diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 9e0dd6bcfb3..75a8197d330 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -122,6 +122,23 @@ dri_st_framebuffer_flush_front(struct st_context_iface *stctx, return TRUE; } +/** + * The state tracker framebuffer interface flush_swapbuffers callback + */ +static boolean +dri_st_framebuffer_flush_swapbuffers(struct st_context_iface *stctx, + struct st_framebuffer_iface *stfbi) +{ + struct dri_context *ctx = (struct dri_context *)stctx->st_manager_private; + struct dri_drawable *drawable = + (struct dri_drawable *) stfbi->st_manager_private; + + if (drawable->flush_swapbuffers) + drawable->flush_swapbuffers(ctx, drawable); + + return TRUE; +} + /** * This is called when we need to set up GL rendering to a new X window. */ @@ -146,6 +163,7 @@ dri_create_buffer(__DRIscreen * sPriv, drawable->base.visual = &drawable->stvis; drawable->base.flush_front = dri_st_framebuffer_flush_front; drawable->base.validate = dri_st_framebuffer_validate; + drawable->base.flush_swapbuffers = dri_st_framebuffer_flush_swapbuffers; drawable->base.st_manager_private = (void *) drawable; drawable->screen = screen; diff --git a/src/gallium/state_trackers/dri/dri_drawable.h b/src/gallium/state_trackers/dri/dri_drawable.h index 1f9842ea541..7c45004ba64 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.h +++ b/src/gallium/state_trackers/dri/dri_drawable.h @@ -85,6 +85,8 @@ struct dri_drawable void (*update_tex_buffer)(struct dri_drawable *drawable, struct dri_context *ctx, struct pipe_resource *res); + void (*flush_swapbuffers)(struct dri_context *ctx, + struct dri_drawable *drawable); }; static inline struct dri_drawable * -- 2.30.2