radeonsi: try flushing unflushed fences in si_fence_finish even when timeout == 0
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 22 Nov 2017 16:52:43 +0000 (17:52 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Sun, 26 Nov 2017 15:53:00 +0000 (16:53 +0100)
Under certain conditions, waiting on a GL sync objects should act like
a flush, regardless of the timeout.

Portal 2, CS:GO, and presumably other Source engine games rely on this
behavior and hang during loading without this fix.

Fixes: bc65dcab3bc4 ("radeonsi: avoid syncing the driver thread in si_fence_finish")
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Tested-by: Kai Wasserbäch <kai@dev.carbon-project.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103902
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103904

src/gallium/drivers/radeonsi/si_fence.c

index 9d6bcfe102745f6d1e7e2d9129bee8428f8ce4d0..b835ed649eeace21ac18da0e4dd5af23573991ce 100644 (file)
@@ -191,9 +191,6 @@ static boolean si_fence_finish(struct pipe_screen *screen,
        int64_t abs_timeout = os_time_get_absolute_timeout(timeout);
 
        if (!util_queue_fence_is_signalled(&rfence->ready)) {
-               if (!timeout)
-                       return false;
-
                if (rfence->tc_token) {
                        /* Ensure that si_flush_from_st will be called for
                         * this fence, but only if we're in the API thread
@@ -207,6 +204,9 @@ static boolean si_fence_finish(struct pipe_screen *screen,
                                               timeout == 0);
                }
 
+               if (!timeout)
+                       return false;
+
                if (timeout == PIPE_TIMEOUT_INFINITE) {
                        util_queue_fence_wait(&rfence->ready);
                } else {