X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fnouveau%2Fnouveau_fence.c;h=d3a3406095236b28495e7591585fa237332f4116;hb=ba093a099af13a630c255b34dc5d315760248e5f;hp=21cf2b9ae5e64ae0f75e3e3f1253386f62cf6347;hpb=4f6cd5fad03757e371b66049dcd42855e4853c14;p=mesa.git diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c index 21cf2b9ae5e..d3a34060952 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.c +++ b/src/gallium/drivers/nouveau/nouveau_fence.c @@ -23,6 +23,7 @@ #include "nouveau_screen.h" #include "nouveau_winsys.h" #include "nouveau_fence.h" +#include "os/os_time.h" #ifdef PIPE_OS_UNIX #include @@ -182,10 +183,11 @@ nouveau_fence_signalled(struct nouveau_fence *fence) } bool -nouveau_fence_wait(struct nouveau_fence *fence) +nouveau_fence_wait(struct nouveau_fence *fence, struct pipe_debug_callback *debug) { struct nouveau_screen *screen = fence->screen; uint32_t spins = 0; + int64_t start = 0; /* wtf, someone is waiting on a fence in flush_notify handler? */ assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); @@ -206,11 +208,19 @@ nouveau_fence_wait(struct nouveau_fence *fence) if (fence == screen->fence.current) nouveau_fence_next(screen); + if (debug && debug->debug_message) + start = os_time_get_nano(); + do { nouveau_fence_update(screen, false); - if (fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) + if (fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) { + if (debug && debug->debug_message) + pipe_debug_message(debug, PERF_INFO, + "stalled %.3f ms waiting for fence", + (os_time_get_nano() - start) / 1000000.f); return true; + } if (!spins) NOUVEAU_DRV_STAT(screen, any_non_kernel_fence_sync_count, 1); spins++;