r300g: handle timeout parameter in fence_finish
authorMarek Olšák <maraeo@gmail.com>
Sat, 5 Mar 2011 20:46:06 +0000 (21:46 +0100)
committerMarek Olšák <maraeo@gmail.com>
Tue, 8 Mar 2011 22:52:37 +0000 (23:52 +0100)
src/gallium/drivers/r300/r300_screen.c

index 18ed0356cae7312a93e4f1e0eb47f83040fe7a9d..a929a2e282b6cfca407a43ca8ab44a7b61d9c46b 100644 (file)
@@ -24,6 +24,7 @@
 #include "util/u_format.h"
 #include "util/u_format_s3tc.h"
 #include "util/u_memory.h"
+#include "os/os_time.h"
 
 #include "r300_context.h"
 #include "r300_texture.h"
@@ -440,6 +441,22 @@ static int r300_fence_finish(struct pipe_screen *screen,
     struct r300_winsys_screen *rws = r300_screen(screen)->rws;
     struct r300_winsys_bo *rfence = (struct r300_winsys_bo*)fence;
 
+    if (timeout != PIPE_TIMEOUT_INFINITE) {
+        int64_t start_time = os_time_get();
+
+        /* Convert to microseconds. */
+        timeout /= 1000;
+
+        /* Wait in a loop. */
+        while (rws->buffer_is_busy(rfence)) {
+            if (os_time_get() - start_time >= timeout) {
+                return 1;
+            }
+            os_time_sleep(10);
+        }
+        return 0;
+    }
+
     rws->buffer_wait(rfence);
     return 0; /* 0 == success */
 }