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:
@@ -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);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user