break;
}
- if (cs->ws->thread && (flags & RADEON_FLUSH_ASYNC)) {
+ if (cs->ws->thread) {
cs->flush_started = 1;
radeon_drm_ws_queue_cs(cs->ws, cs);
+ if (!(flags & RADEON_FLUSH_ASYNC))
+ radeon_drm_cs_sync_flush(rcs);
} else {
- pipe_mutex_lock(cs->ws->cs_stack_lock);
- if (cs->ws->thread) {
- while (p_atomic_read(&cs->ws->ncs)) {
- pipe_condvar_wait(cs->ws->cs_queue_empty, cs->ws->cs_stack_lock);
- }
- }
- pipe_mutex_unlock(cs->ws->cs_stack_lock);
radeon_drm_cs_emit_ioctl_oneshot(cs, cs->cst);
}
} else {
pipe_thread_wait(ws->thread);
}
pipe_semaphore_destroy(&ws->cs_queued);
- pipe_condvar_destroy(ws->cs_queue_empty);
pipe_mutex_destroy(ws->hyperz_owner_mutex);
pipe_mutex_destroy(ws->cmask_owner_mutex);
}
ws->cs_stack[p_atomic_read(&ws->ncs) - 1] = NULL;
empty_stack = p_atomic_dec_zero(&ws->ncs);
- if (empty_stack) {
- pipe_condvar_signal(ws->cs_queue_empty);
- }
pipe_mutex_unlock(ws->cs_stack_lock);
pipe_semaphore_signal(&cs->flush_completed);
ws->cs_stack[i] = NULL;
}
p_atomic_set(&ws->ncs, 0);
- pipe_condvar_signal(ws->cs_queue_empty);
pipe_mutex_unlock(ws->cs_stack_lock);
return NULL;
}
p_atomic_set(&ws->ncs, 0);
pipe_semaphore_init(&ws->cs_queued, 0);
- pipe_condvar_init(ws->cs_queue_empty);
if (ws->num_cpus > 1 && debug_get_option_thread())
ws->thread = pipe_thread_create(radeon_drm_cs_emit_ioctl, ws);
/* rings submission thread */
pipe_mutex cs_stack_lock;
pipe_semaphore cs_queued;
- /* we cannot use semaphore for empty queue because maintaining an even
- * number of call to semaphore_wait and semaphore_signal is, to say the
- * least, tricky
- */
- pipe_condvar cs_queue_empty;
pipe_thread thread;
int kill_thread;
int ncs;