diff options
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 16 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_drawable.c | 18 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_drawable.h | 2 |
3 files changed, 36 insertions, 0 deletions
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 @@ -123,6 +123,23 @@ dri_st_framebuffer_flush_front(struct st_context_iface *stctx, } /** + * 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. */ boolean @@ -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 * |