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:
Marek Olšák 2011-03-05 21:23:54 +01:00
parent 5257a6dbc6
commit b39bccbd4e
29 changed files with 71 additions and 36 deletions

View file

@ -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 );
};

View file

@ -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);

View file

@ -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);

View file

@ -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 *

View file

@ -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);

View file

@ -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;
}

View file

@ -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 *

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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));
}

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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 {

View file

@ -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)

View file

@ -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;

View file

@ -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);

View file

@ -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().

View file

@ -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 );
};

View file

@ -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);
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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 );

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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;
}