mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 17:20:21 +01:00
gallium: add timeout parameter to fence_finish
This is a follow-up to the ARB_sync patch for st/mesa and completes the ARB_sync implementation.
This commit is contained in:
parent
5257a6dbc6
commit
b39bccbd4e
29 changed files with 71 additions and 36 deletions
|
|
@ -159,7 +159,8 @@ struct pipe_winsys
|
|||
*/
|
||||
int (*fence_finish)( struct pipe_winsys *ws,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flag );
|
||||
unsigned flags,
|
||||
uint64_t timeout );
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@ cell_fence_init(struct cell_fence *fence)
|
|||
|
||||
boolean
|
||||
cell_fence_signalled(const struct cell_context *cell,
|
||||
const struct cell_fence *fence)
|
||||
const struct cell_fence *fence,
|
||||
unsigned flags)
|
||||
{
|
||||
uint i;
|
||||
for (i = 0; i < cell->num_spus; i++) {
|
||||
|
|
@ -61,7 +62,9 @@ cell_fence_signalled(const struct cell_context *cell,
|
|||
|
||||
void
|
||||
cell_fence_finish(const struct cell_context *cell,
|
||||
const struct cell_fence *fence)
|
||||
const struct cell_fence *fence,
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
while (!cell_fence_signalled(cell, fence)) {
|
||||
usleep(10);
|
||||
|
|
|
|||
|
|
@ -36,12 +36,15 @@ cell_fence_init(struct cell_fence *fence);
|
|||
|
||||
extern boolean
|
||||
cell_fence_signalled(const struct cell_context *cell,
|
||||
const struct cell_fence *fence);
|
||||
const struct cell_fence *fence,
|
||||
unsigned flags);
|
||||
|
||||
|
||||
extern void
|
||||
cell_fence_finish(const struct cell_context *cell,
|
||||
const struct cell_fence *fence);
|
||||
const struct cell_fence *fence,
|
||||
unsigned flags,
|
||||
uint64_t timeout);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -292,14 +292,16 @@ galahad_screen_fence_signalled(struct pipe_screen *_screen,
|
|||
static int
|
||||
galahad_screen_fence_finish(struct pipe_screen *_screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct galahad_screen *glhd_screen = galahad_screen(_screen);
|
||||
struct pipe_screen *screen = glhd_screen->screen;
|
||||
|
||||
return screen->fence_finish(screen,
|
||||
fence,
|
||||
flags);
|
||||
flags,
|
||||
timeout);
|
||||
}
|
||||
|
||||
struct pipe_screen *
|
||||
|
|
|
|||
|
|
@ -331,7 +331,8 @@ i915_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
i915_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct i915_screen *is = i915_screen(screen);
|
||||
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ brw_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
brw_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -258,14 +258,16 @@ identity_screen_fence_signalled(struct pipe_screen *_screen,
|
|||
static int
|
||||
identity_screen_fence_finish(struct pipe_screen *_screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct identity_screen *id_screen = identity_screen(_screen);
|
||||
struct pipe_screen *screen = id_screen->screen;
|
||||
|
||||
return screen->fence_finish(screen,
|
||||
fence,
|
||||
flags);
|
||||
flags,
|
||||
timeout);
|
||||
}
|
||||
|
||||
struct pipe_screen *
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ llvmpipe_finish( struct pipe_context *pipe,
|
|||
struct pipe_fence_handle *fence = NULL;
|
||||
llvmpipe_flush(pipe, 0, &fence, reason);
|
||||
if (fence) {
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0, PIPE_TIMEOUT_INFINITE);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -365,7 +365,8 @@ llvmpipe_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
llvmpipe_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence_handle,
|
||||
unsigned flag)
|
||||
unsigned flag,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct lp_fence *f = (struct lp_fence *) fence_handle;
|
||||
|
||||
|
|
|
|||
|
|
@ -165,7 +165,8 @@ nouveau_screen_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
nouveau_screen_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *pfence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
return !nouveau_fence_wait(nouveau_fence(pfence));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -434,7 +434,8 @@ static int r300_fence_signalled(struct pipe_screen *screen,
|
|||
|
||||
static int r300_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct r300_winsys_screen *rws = r300_screen(screen)->rws;
|
||||
struct r300_winsys_bo *rfence = (struct r300_winsys_bo*)fence;
|
||||
|
|
|
|||
|
|
@ -256,14 +256,16 @@ rbug_screen_fence_signalled(struct pipe_screen *_screen,
|
|||
static int
|
||||
rbug_screen_fence_finish(struct pipe_screen *_screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct rbug_screen *rb_screen = rbug_screen(_screen);
|
||||
struct pipe_screen *screen = rb_screen->screen;
|
||||
|
||||
return screen->fence_finish(screen,
|
||||
fence,
|
||||
flags);
|
||||
flags,
|
||||
timeout);
|
||||
}
|
||||
|
||||
boolean
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ softpipe_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
softpipe_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
assert(!fence);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -162,7 +162,8 @@ softpipe_flush_resource(struct pipe_context *pipe,
|
|||
* This is for illustrative purposes only, as softpipe does not
|
||||
* have fences.
|
||||
*/
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -241,7 +241,8 @@ void svga_context_flush( struct svga_context *svga,
|
|||
|
||||
if (SVGA_DEBUG & DEBUG_SYNC) {
|
||||
if (fence)
|
||||
svga->pipe.screen->fence_finish( svga->pipe.screen, fence, 0);
|
||||
svga->pipe.screen->fence_finish( svga->pipe.screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
}
|
||||
|
||||
if(pfence)
|
||||
|
|
|
|||
|
|
@ -425,7 +425,8 @@ svga_fence_signalled(struct pipe_screen *screen,
|
|||
static int
|
||||
svga_fence_finish(struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flag)
|
||||
unsigned flag,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct svga_winsys_screen *sws = svga_screen(screen)->sws;
|
||||
|
||||
|
|
|
|||
|
|
@ -421,7 +421,8 @@ trace_screen_fence_signalled(struct pipe_screen *_screen,
|
|||
static int
|
||||
trace_screen_fence_finish(struct pipe_screen *_screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags)
|
||||
unsigned flags,
|
||||
uint64_t timeout)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(_screen);
|
||||
struct pipe_screen *screen = tr_scr->screen;
|
||||
|
|
@ -432,8 +433,9 @@ trace_screen_fence_finish(struct pipe_screen *_screen,
|
|||
trace_dump_arg(ptr, screen);
|
||||
trace_dump_arg(ptr, fence);
|
||||
trace_dump_arg(uint, flags);
|
||||
trace_dump_arg(uint, timeout);
|
||||
|
||||
result = screen->fence_finish(screen, fence, flags);
|
||||
result = screen->fence_finish(screen, fence, flags, timeout);
|
||||
|
||||
trace_dump_ret(int, result);
|
||||
|
||||
|
|
|
|||
|
|
@ -426,6 +426,8 @@ enum pipe_transfer_usage {
|
|||
#define PIPE_SWIZZLE_ONE 5
|
||||
|
||||
|
||||
#define PIPE_TIMEOUT_INFINITE 0xffffffffffffffffull
|
||||
|
||||
/**
|
||||
* Implementation capabilities/limits which are queried through
|
||||
* pipe_screen::get_param() and pipe_screen::get_paramf().
|
||||
|
|
|
|||
|
|
@ -193,11 +193,13 @@ struct pipe_screen {
|
|||
/**
|
||||
* Wait for the fence to finish.
|
||||
* \param flags driver-specific meaning
|
||||
* \param timeout in nanoseconds
|
||||
* \return zero on success.
|
||||
*/
|
||||
int (*fence_finish)( struct pipe_screen *screen,
|
||||
struct pipe_fence_handle *fence,
|
||||
unsigned flags );
|
||||
unsigned flags,
|
||||
uint64_t timeout );
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -689,7 +689,7 @@ egl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
|
|||
gctx->stctxi->flush(gctx->stctxi,
|
||||
PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
if (fence) {
|
||||
screen->fence_finish(screen, fence, 0);
|
||||
screen->fence_finish(screen, fence, 0, PIPE_TIMEOUT_INFINITE);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ egl_g3d_wait_fence_sync(struct egl_g3d_sync *gsync, EGLTimeKHR timeout)
|
|||
|
||||
_eglUnlockMutex(&dpy->Mutex);
|
||||
/* no timed finish? */
|
||||
screen->fence_finish(screen, fence, 0x0);
|
||||
screen->fence_finish(screen, fence, 0x0, PIPE_TIMEOUT_INFINITE);
|
||||
ret = EGL_CONDITION_SATISFIED_KHR;
|
||||
_eglLockMutex(&dpy->Mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ resource_surface_throttle(struct resource_surface *rsurf)
|
|||
struct pipe_fence_handle *fence = swap_fences_pop_front(rsurf);
|
||||
|
||||
if (fence) {
|
||||
(void) screen->fence_finish(screen, fence, 0);
|
||||
(void) screen->fence_finish(screen, fence, 0, PIPE_TIMEOUT_INFINITE);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1227,7 +1227,8 @@ void XMesaFlush( XMesaContext c )
|
|||
|
||||
c->st->flush(c->st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
if (fence) {
|
||||
xmdpy->screen->fence_finish(xmdpy->screen, fence, 0);
|
||||
xmdpy->screen->fence_finish(xmdpy->screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
xmdpy->screen->fence_reference(xmdpy->screen, &fence, NULL);
|
||||
}
|
||||
XFlush( c->xm_visual->display );
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ void vegaFinish(void)
|
|||
|
||||
pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
if (fence) {
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -362,7 +362,8 @@ dri2_copy_region(DrawablePtr pDraw, RegionPtr pRegion,
|
|||
|
||||
if (extents->x1 == 0 && extents->y1 == 0 &&
|
||||
extents->x2 == pDraw->width && extents->y2 == pDraw->height) {
|
||||
ms->screen->fence_finish(ms->screen, dst_priv->fence, 0);
|
||||
ms->screen->fence_finish(ms->screen, dst_priv->fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
ms->screen->fence_reference(ms->screen, &dst_priv->fence, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -334,7 +334,8 @@ drv_cleanup_fences(ScrnInfoPtr pScrn)
|
|||
|
||||
for (i = 0; i < XORG_NR_FENCES; i++) {
|
||||
if (ms->fence[i]) {
|
||||
ms->screen->fence_finish(ms->screen, ms->fence[i], 0);
|
||||
ms->screen->fence_finish(ms->screen, ms->fence[i], 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
ms->screen->fence_reference(ms->screen, &ms->fence[i], NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -555,7 +556,8 @@ void xorg_flush(ScreenPtr pScreen)
|
|||
if (ms->dirtyThrottling) {
|
||||
if (ms->fence[0])
|
||||
ms->ctx->screen->fence_finish(ms->ctx->screen,
|
||||
ms->fence[0], 0);
|
||||
ms->fence[0], 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
|
||||
/* The amount of rendering generated by a block handler can be
|
||||
* quite small. Let us get a fair way ahead of hardware before
|
||||
|
|
|
|||
|
|
@ -1084,7 +1084,8 @@ void xorg_exa_finish(struct exa_context *exa)
|
|||
|
||||
xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, &fence);
|
||||
|
||||
exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0);
|
||||
exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,8 @@ void st_finish( struct st_context *st )
|
|||
st_flush(st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
|
||||
if(fence) {
|
||||
st->pipe->screen->fence_finish(st->pipe->screen, fence, 0);
|
||||
st->pipe->screen->fence_finish(st->pipe->screen, fence, 0,
|
||||
PIPE_TIMEOUT_INFINITE);
|
||||
st->pipe->screen->fence_reference(st->pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,8 +96,8 @@ static void st_client_wait_sync(struct gl_context *ctx,
|
|||
/* We don't care about GL_SYNC_FLUSH_COMMANDS_BIT, because flush is
|
||||
* already called when creating a fence. */
|
||||
|
||||
if (so->fence) {
|
||||
screen->fence_finish(screen, so->fence, 0);
|
||||
if (so->fence &&
|
||||
screen->fence_finish(screen, so->fence, 0, timeout) == 0) {
|
||||
screen->fence_reference(screen, &so->fence, NULL);
|
||||
so->b.StatusFlag = GL_TRUE;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue