static boolean r300_fence_finish(struct pipe_screen *screen, struct pipe_fence_handle *fence, uint64_t timeout) { struct radeon_winsys *rws = r300_screen(screen)->rws; struct pb_buffer *rfence = (struct pb_buffer*)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, RADEON_USAGE_READWRITE)) { if (os_time_get() - start_time >= timeout) { return FALSE; } os_time_sleep(10); } return TRUE; } rws->buffer_wait(rfence, RADEON_USAGE_READWRITE); return TRUE; }
static PIPE_THREAD_ROUTINE(thread_function, thread_data) { int thread_id = *((int *) thread_data); printf("thread %d starting\n", thread_id); os_time_sleep(thread_id * 1000 * 1000); printf("thread %d before barrier\n", thread_id); pipe_barrier_wait(&barrier); printf("thread %d exiting\n", thread_id); return NULL; }
static int thread_function(void *thread_data) { int thread_id = *((int *) thread_data); LOG("thread %d starting\n", thread_id); os_time_sleep(thread_id * 100 * 1000); LOG("thread %d before barrier\n", thread_id); CHECK(p_atomic_read(&proceeded) == 0); p_atomic_inc(&waiting); pipe_barrier_wait(&barrier); CHECK(p_atomic_read(&waiting) == NUM_THREADS); p_atomic_inc(&proceeded); LOG("thread %d exiting\n", thread_id); return 0; }
/** * This is called just before issuing the buffer swap/present. * We query the current time and determine if we should sleep before * issuing the swap/present. * This is a bit of a hack and is certainly not very accurate but it * basically works. * This is for the WGL_ARB_swap_interval extension. */ static void wait_swap_interval(struct stw_framebuffer *fb) { /* Note: all time variables here are in units of microseconds */ int64_t cur_time = os_time_get_nano() / 1000; if (fb->prev_swap_time != 0) { /* Compute time since previous swap */ int64_t delta = cur_time - fb->prev_swap_time; int64_t min_swap_period = 1.0e6 / stw_dev->refresh_rate * stw_dev->swap_interval; /* if time since last swap is less than wait period, wait */ if (delta < min_swap_period) { float fudge = 1.75f; /* emperical fudge factor */ int64_t wait = (min_swap_period - delta) * fudge; os_time_sleep(wait); } } fb->prev_swap_time = cur_time; }
static bool virgl_fence_wait(struct virgl_winsys *vws, struct pipe_fence_handle *fence, uint64_t timeout) { struct virgl_vtest_winsys *vdws = virgl_vtest_winsys(vws); struct virgl_hw_res *res = virgl_hw_res(fence); if (timeout == 0) return virgl_vtest_resource_is_busy(vdws, res); if (timeout != PIPE_TIMEOUT_INFINITE) { int64_t start_time = os_time_get(); timeout /= 1000; while (virgl_vtest_resource_is_busy(vdws, res)) { if (os_time_get() - start_time >= timeout) return FALSE; os_time_sleep(10); } return TRUE; } virgl_vtest_resource_wait(vws, res); return TRUE; }