On Die, 2012-01-31 at 17:02 +0000, Simon Farnsworth wrote: > Instead of busywaiting for the GPU to finish a fence, use the new kernel > interface to wait for fence completion. > > If the new kernel interface is unavailable, fall back to busywaiting. > > Signed-off-by: Simon Farnsworth <[email protected]> [...] > diff --git a/src/gallium/drivers/r600/r600_pipe.c > b/src/gallium/drivers/r600/r600_pipe.c > index c38fbc5..12c5bf5 100644 > --- a/src/gallium/drivers/r600/r600_pipe.c > +++ b/src/gallium/drivers/r600/r600_pipe.c > @@ -605,13 +604,10 @@ static boolean r600_fence_finish(struct pipe_screen > *pscreen, > } > > while (rscreen->fences.data[rfence->index] == 0) { > - if (++spins % 256) > - continue; > -#ifdef PIPE_OS_UNIX > - sched_yield(); > -#else > - os_time_sleep(10); > -#endif > + rscreen->ws->buffer_wait_fence(rscreen->fences.bo->buf, > + rfence->index << 2, > + 0, > + timeout); > if (timeout != PIPE_TIMEOUT_INFINITE && > os_time_get() - start_time >= timeout) { > return FALSE;
Maybe add something like if (rscreen->fences.data[rfence->index]) return TRUE; before the timeout check? Otherwise there may be a false negative if the fence signalled just before the timeout. > diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c > b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c > index 143dcf9..487fc58 100644 > --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c > +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c > @@ -892,4 +922,9 @@ void radeon_bomgr_init_functions(struct radeon_drm_winsys > *ws) > ws->base.buffer_from_handle = radeon_winsys_bo_from_handle; > ws->base.buffer_get_handle = radeon_winsys_bo_get_handle; > ws->base.buffer_get_virtual_address = radeon_winsys_bo_va; > + if (ws->info.drm_major > 2 || > + (ws->info.drm_major == 2 && ws->info.drm_minor >= 15)) > + ws->base.buffer_wait_fence = radeon_winsys_bo_wait_fence; > + else > + ws->base.buffer_wait_fence = radeon_winsys_bo_wait_fence_nokernel; > } We have no idea what kind of API a hypothetical major version > 2 might have, so I think it's better to only check for (ws->info.drm_minor >= 15) here. The rest looks good to me. -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Debian, X and DRI developer _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
