diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-08-18 12:39:33 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-18 12:39:33 +0800 |
| commit | 4de3d9b1987fddf8d95efe75aab592282b672a97 (patch) | |
| tree | 80d9001e1cbf06a53a2688281720f6eb127ecbbe /tools/gfx | |
| parent | 8a292cff17adbaaca92a8c0de9d41a77d2a13294 (diff) | |
Bail out of infinite timeouts in our posix synchapi emulation (#3129)
This can happen if vkd3d-proton triggered a VK_DEVICE_LOST
Diffstat (limited to 'tools/gfx')
| -rw-r--r-- | tools/gfx/d3d12/d3d12-posix-synchapi.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/tools/gfx/d3d12/d3d12-posix-synchapi.cpp b/tools/gfx/d3d12/d3d12-posix-synchapi.cpp index a46e96141..b979bb3cc 100644 --- a/tools/gfx/d3d12/d3d12-posix-synchapi.cpp +++ b/tools/gfx/d3d12/d3d12-posix-synchapi.cpp @@ -124,14 +124,19 @@ BOOL SetEvent(HANDLE h) } } -DWORD WaitForSingleObject(HANDLE h, DWORD ms) +DWORD WaitForSingleObject(const HANDLE h, const DWORD ms) { int fd = _handleToFD(h); bool manualReset = _handleToFlags(h) & CREATE_EVENT_MANUAL_RESET; pollfd pfd{fd, POLLIN, 0}; uint64_t x; int r = 0; - int nEvents = poll(&pfd, 1, ms); + // Implement unlimited waits as timing out with WAIT_FAILED after 5 + // seconds. It's probably something fishy with d3dvk-proton or our synchapi + // implementation + const bool isInfinite = ms == INFINITE; + const DWORD fiveSeconds = 5000; + int nEvents = poll(&pfd, 1, isInfinite ? fiveSeconds : ms); if(pfd.revents != POLLIN) { return WAIT_FAILED; @@ -142,7 +147,7 @@ DWORD WaitForSingleObject(HANDLE h, DWORD ms) } if (nEvents == 0) { - return WAIT_TIMEOUT; + return isInfinite ? WAIT_FAILED : WAIT_TIMEOUT; } if(manualReset) { @@ -155,7 +160,7 @@ DWORD WaitForSingleObject(HANDLE h, DWORD ms) } if(r == -1 && errno == EAGAIN) { - return WAIT_TIMEOUT; + return isInfinite ? WAIT_FAILED : WAIT_TIMEOUT; } return WAIT_FAILED; } @@ -164,12 +169,19 @@ DWORD WaitForMultipleObjects( DWORD n, const HANDLE *hs, BOOL bWaitAll, - DWORD dwMilliseconds) + DWORD requestedMs) { if(n == 0) { return bWaitAll ? WAIT_OBJECT_0 : WAIT_FAILED; } + + // Bail out of infinite waits after 5 seconds as it's probably a + // driver/vkd3d-proton/synchapi bug + const bool isInfinite = requestedMs == INFINITE; + const DWORD fiveSeconds = 5000; + const auto dwMilliseconds = isInfinite ? fiveSeconds : requestedMs; + DWORD res; int fds[n]; int flagss[n]; @@ -281,7 +293,7 @@ DWORD WaitForMultipleObjects( // If we got here without seeing enough events, we must have timed out if(nSeenEvents < n) { - res = WAIT_TIMEOUT; + res = isInfinite ? WAIT_FAILED : WAIT_TIMEOUT; goto end; } @@ -415,7 +427,7 @@ DWORD WaitForMultipleObjects( } if(nEvents == 0) { - res = WAIT_TIMEOUT; + res = isInfinite ? WAIT_FAILED : WAIT_TIMEOUT; goto end; } // Try reads until we get one |
