gallium/st: Add a method to flush outstanding swapbuffers

Add a state tracker interface method to flush outstanding swapbuffers, and
add a call to it from the mesa state tracker during glFinish().
This doesn't strictly mean the outstanding swapbuffers have actually finished
executing but is sufficient for glFinish()
to be able to be used as a replacement for glXWaitGL().

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
Thomas Hellstrom 2017-06-20 18:36:08 +02:00
parent ad5136ac82
commit 91c93dec98
4 changed files with 29 additions and 0 deletions

View file

@ -366,6 +366,8 @@ struct st_framebuffer_iface
const enum st_attachment_type *statts,
unsigned count,
struct pipe_resource **out);
boolean (*flush_swapbuffers) (struct st_context_iface *stctx,
struct st_framebuffer_iface *stfbi);
};
/**

View file

@ -73,6 +73,8 @@ void st_finish( struct st_context *st )
PIPE_TIMEOUT_INFINITE);
st->pipe->screen->fence_reference(st->pipe->screen, &fence, NULL);
}
st_manager_flush_swapbuffers();
}

View file

@ -1064,6 +1064,28 @@ st_manager_validate_framebuffers(struct st_context *st)
st_context_validate(st, stdraw, stread);
}
/**
* Flush any outstanding swapbuffers on the current draw framebuffer.
*/
void
st_manager_flush_swapbuffers(void)
{
GET_CURRENT_CONTEXT(ctx);
struct st_context *st = (ctx) ? ctx->st : NULL;
struct st_framebuffer *stfb;
if (!st)
return;
stfb = st_ws_framebuffer(ctx->DrawBuffer);
if (!stfb || !stfb->iface->flush_swapbuffers)
return;
stfb->iface->flush_swapbuffers(&st->iface, stfb->iface);
}
/**
* Add a color renderbuffer on demand. The FBO must correspond to a window,
* not a user-created FBO.

View file

@ -53,4 +53,7 @@ st_framebuffer_reference(struct st_framebuffer **ptr,
void
st_framebuffer_interface_destroy(struct st_framebuffer_interface *stfbi);
void
st_manager_flush_swapbuffers(void);
#endif /* ST_MANAGER_H */