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:
@@ -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
|
||||
|
||||
@@ -267,6 +267,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)
|
||||
|
||||
@@ -80,6 +80,9 @@ dri_create_buffer(__DRIscreen * sPriv,
|
||||
__DRIdrawable * 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);
|
||||
|
||||
@@ -308,6 +308,7 @@ dri_init_screen2(__DRIscreen * 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,
|
||||
|
||||
@@ -42,8 +42,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 );
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user