args.handle = bo->handle;
while (drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_WAIT_IDLE,
&args, sizeof(args)) == -EBUSY);
-
- bo->busy_for_write = FALSE;
}
static boolean radeon_bo_is_busy(struct pb_buffer *_buf)
busy = drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_BUSY,
&args, sizeof(args)) != 0;
- if (!busy)
- bo->busy_for_write = FALSE;
return busy;
}
/* XXX We could check whether the buffer is busy for write here. */
radeon_bo_wait((struct pb_buffer*)bo);
}
-#if 0
- /* XXX This per-winsys busy-for-write tracking sucks.
- * What if some other process wrote something, e.g. using
- * DRI2CopyRegion? We wouldn't get the busy_for_write flag
- * set, skipping bo_wait.
- * We need to move the is-busy-for-write query into the kernel.
- */
- } else if (bo->busy_for_write) {
- /* Update the busy_for_write field (done by radeon_bo_is_busy)
- * and wait if needed. */
- if (radeon_bo_is_busy((struct pb_buffer*)bo)) {
- radeon_bo_wait((struct pb_buffer*)bo);
- }
- }
-#endif
} else {
/* Mapping for write. */
if (radeon_bo_is_referenced_by_cs(cs, bo)) {
* thread, is this bo referenced in? */
int num_active_ioctls;
- /* Whether the buffer has been relocated for write and is busy since then.
- * This field is updated in:
- * - radeon_drm_cs_flush (to TRUE if it's relocated for write)
- * - radeon_bo_is_busy (to FALSE if it's not busy)
- * - radeon_bo_wait (to FALSE) */
- boolean busy_for_write;
-
boolean flinked;
uint32_t flink;
};
for (i = 0; i < crelocs; i++) {
/* Update the number of active asynchronous CS ioctls for the buffer. */
p_atomic_inc(&cs->csc->relocs_bo[i]->num_active_ioctls);
-
- /* Update whether the buffer is busy for write. */
- if (cs->csc->relocs[i].write_domain) {
- cs->csc->relocs_bo[i]->busy_for_write = TRUE;
- }
}
if (cs->ws->num_cpus > 1 && debug_get_option_thread() &&