st/dri: update dri2 drawables when viewport is changed

Fixes gnome-shell on nouveau, as well as window resize with various
other applications.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Ben Skeggs 2010-01-11 11:41:47 +10:00 committed by Jakob Bornecrantz
parent e88294328c
commit 116a02be22
5 changed files with 19 additions and 2 deletions

View file

@ -266,6 +266,11 @@ struct pipe_screen {
void (*video_surface_destroy)( struct pipe_video_surface *vsfc );
/**
* Do any special operations to ensure buffer size is correct
*/
void (*update_buffer)( struct pipe_screen *ws,
void *context_private );
/**
* Do any special operations to ensure frontbuffer contents are

View file

@ -271,6 +271,14 @@ void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
dri2_set_tex_buffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
}
void
dri_update_buffer(struct pipe_screen *screen, void *context_private)
{
struct dri_context *ctx = (struct dri_context *)context_private;
dri_get_buffers(ctx->dPriv);
}
void
dri_flush_frontbuffer(struct pipe_screen *screen,
struct pipe_surface *surf, void *context_private)

View file

@ -80,6 +80,9 @@ dri_create_buffer(__DRIscreenPrivate * sPriv,
__DRIdrawablePrivate * dPriv,
const __GLcontextModes * visual, boolean isPixmap);
void
dri_update_buffer(struct pipe_screen *screen, void *context_private);
void
dri_flush_frontbuffer(struct pipe_screen *screen,
struct pipe_surface *surf, void *context_private);

View file

@ -310,6 +310,7 @@ dri_init_screen2(__DRIscreenPrivate * sPriv)
}
/* We need to hook in here */
screen->pipe_screen->update_buffer = dri_update_buffer;
screen->pipe_screen->flush_frontbuffer = dri_flush_frontbuffer;
driParseOptionInfo(&screen->optionCache,

View file

@ -40,8 +40,8 @@ static void st_viewport(GLcontext * ctx, GLint x, GLint y,
{
struct st_context *st = ctx->st;
if (st->pipe->winsys && st->pipe->winsys->update_buffer)
st->pipe->winsys->update_buffer( st->pipe->winsys,
if (st->pipe->screen && st->pipe->screen->update_buffer)
st->pipe->screen->update_buffer( st->pipe->screen,
st->pipe->priv );
}