From 28c325f8d3925d703a0cc5a3d3d3fa57b7f11fe4 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Wed, 4 Mar 2009 00:35:33 +0100 Subject: [PATCH] st/dri2: Hook up flush_frontbuffer Doesn't do anything because we can't tell the X server about any changes to the fake front buffer. --- src/gallium/state_trackers/dri2/dri_context.c | 4 +++- .../state_trackers/dri2/dri_drawable.c | 19 +++++++++++++++++++ .../state_trackers/dri2/dri_drawable.h | 5 +++++ src/gallium/state_trackers/dri2/dri_screen.c | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/dri2/dri_context.c b/src/gallium/state_trackers/dri2/dri_context.c index b8e92a76c02..92c26ac70fe 100644 --- a/src/gallium/state_trackers/dri2/dri_context.c +++ b/src/gallium/state_trackers/dri2/dri_context.c @@ -76,7 +76,8 @@ dri_create_context(const __GLcontextModes *visual, if (ctx->pipe == NULL) goto fail; - ctx->pipe->priv = ctx; /* I guess */ + /* used in dri_flush_frontbuffer */ + ctx->pipe->priv = ctx; ctx->st = st_create_context(ctx->pipe, visual, st_share); if (ctx->st == NULL) @@ -152,6 +153,7 @@ dri_make_current(__DRIcontextPrivate *cPriv, draw->stfb, read->stfb); + /* used in dri_flush_frontbuffer */ ctx->dPriv = driDrawPriv; if (driDrawPriv) diff --git a/src/gallium/state_trackers/dri2/dri_drawable.c b/src/gallium/state_trackers/dri2/dri_drawable.c index 5c8f3ba8662..8a00c6caf1a 100644 --- a/src/gallium/state_trackers/dri2/dri_drawable.c +++ b/src/gallium/state_trackers/dri2/dri_drawable.c @@ -44,6 +44,15 @@ #include "util/u_memory.h" +static void +dri_copy_to_front(__DRIdrawablePrivate *dPriv, + struct pipe_surface *from, + int x, int y, unsigned w, unsigned h) +{ + /* TODO send a message to the Xserver to copy to the real front buffer */ +} + + static struct pipe_surface * dri_surface_from_handle(struct pipe_screen *screen, unsigned handle, @@ -184,6 +193,16 @@ dri_get_buffers(__DRIdrawablePrivate *dPriv) } +void +dri_flush_frontbuffer(struct pipe_screen *screen, + struct pipe_surface *surf, + void *context_private) +{ + struct dri_context *ctx = (struct dri_context *)context_private; + dri_copy_to_front(ctx->dPriv, surf, 0, 0, surf->width, surf->height); +} + + void dri_swap_buffers(__DRIdrawablePrivate * dPriv) { diff --git a/src/gallium/state_trackers/dri2/dri_drawable.h b/src/gallium/state_trackers/dri2/dri_drawable.h index d40d09c9b5b..185c657b35a 100644 --- a/src/gallium/state_trackers/dri2/dri_drawable.h +++ b/src/gallium/state_trackers/dri2/dri_drawable.h @@ -65,6 +65,11 @@ dri_create_buffer(__DRIscreenPrivate *sPriv, const __GLcontextModes *visual, boolean isPixmap); +void +dri_flush_frontbuffer(struct pipe_screen *screen, + struct pipe_surface *surf, + void *context_private); + void dri_swap_buffers(__DRIdrawablePrivate * dPriv); diff --git a/src/gallium/state_trackers/dri2/dri_screen.c b/src/gallium/state_trackers/dri2/dri_screen.c index 57249a51118..ab5878a4bce 100644 --- a/src/gallium/state_trackers/dri2/dri_screen.c +++ b/src/gallium/state_trackers/dri2/dri_screen.c @@ -224,6 +224,9 @@ dri_init_screen2(__DRIscreenPrivate *sPriv) goto fail; } + /* We need to hook in here */ + screen->pipe_screen->flush_frontbuffer = dri_flush_frontbuffer; + driParseOptionInfo(&screen->optionCache, __driConfigOptions, __driNConfigOptions); -- 2.30.2