diff --git a/filament/backend/src/metal/MetalHandles.mm b/filament/backend/src/metal/MetalHandles.mm index c7549f8c8f..14dc78e212 100644 --- a/filament/backend/src/metal/MetalHandles.mm +++ b/filament/backend/src/metal/MetalHandles.mm @@ -849,12 +849,13 @@ void MetalFence::onSignal(MetalFenceSignalBlock block) { FenceStatus MetalFence::wait(uint64_t timeoutNs) { if (@available(macOS 10.14, iOS 12, *)) { + using ns = std::chrono::nanoseconds; std::unique_lock guard(state->mutex); - timeoutNs = std::min(timeoutNs, (uint64_t) std::chrono::nanoseconds::max().count()); while (state->status == FenceStatus::TIMEOUT_EXPIRED) { - if (timeoutNs == 0 || - state->cv.wait_for(guard, std::chrono::nanoseconds(timeoutNs)) == - std::cv_status::timeout) { + if (timeoutNs == FENCE_WAIT_FOR_EVER) { + state->cv.wait(guard); + } else if (timeoutNs == 0 || + state->cv.wait_for(guard, ns(timeoutNs)) == std::cv_status::timeout) { return FenceStatus::TIMEOUT_EXPIRED; } } diff --git a/filament/src/Fence.cpp b/filament/src/Fence.cpp index f46da9b764..87098f44d1 100644 --- a/filament/src/Fence.cpp +++ b/filament/src/Fence.cpp @@ -71,8 +71,6 @@ FenceStatus FFence::waitAndDestroy(FFence* fence, Mode mode) noexcept { UTILS_NOINLINE FenceStatus FFence::wait(Mode mode, uint64_t timeout) noexcept { ASSERT_PRECONDITION(UTILS_HAS_THREADING || timeout == 0, "Non-zero timeout requires threads."); - const bool waitForever = timeout == FENCE_WAIT_FOR_EVER; - timeout = std::min(timeout, (uint64_t) ns::max().count()); FEngine& engine = mEngine; @@ -98,7 +96,7 @@ FenceStatus FFence::wait(Mode mode, uint64_t timeout) noexcept { } engine.pumpPlatformEvents(); const auto elapsed = std::chrono::system_clock::now() - startTime; - if (!waitForever && elapsed >= ns(timeout)) { + if (timeout != FENCE_WAIT_FOR_EVER && elapsed >= ns(timeout)) { break; } }