/* Does a CPU wait for the buffer's backing data to become reliably accessible * for write/read by waiting on the buffer's relevant fences. */ static inline bool nouveau_buffer_sync(struct nouveau_context *nv, struct nv04_resource *buf, unsigned rw) { if (rw == PIPE_TRANSFER_READ) { if (!buf->fence_wr) return true; NOUVEAU_DRV_STAT_RES(buf, buf_non_kernel_fence_sync_count, !nouveau_fence_signalled(buf->fence_wr)); if (!nouveau_fence_wait(buf->fence_wr, &nv->debug)) return false; } else { if (!buf->fence) return true; NOUVEAU_DRV_STAT_RES(buf, buf_non_kernel_fence_sync_count, !nouveau_fence_signalled(buf->fence)); if (!nouveau_fence_wait(buf->fence, &nv->debug)) return false; nouveau_fence_ref(NULL, &buf->fence); } nouveau_fence_ref(NULL, &buf->fence_wr); return true; }
static INLINE boolean nouveau_buffer_busy(struct nv04_resource *buf, unsigned rw) { if (rw == PIPE_TRANSFER_READ) return (buf->fence_wr && !nouveau_fence_signalled(buf->fence_wr)); else return (buf->fence && !nouveau_fence_signalled(buf->fence)); }
static boolean nouveau_screen_fence_finish(struct pipe_screen *screen, struct pipe_fence_handle *pfence, uint64_t timeout) { if (!timeout) return nouveau_fence_signalled(nouveau_fence(pfence)); return nouveau_fence_wait(nouveau_fence(pfence), NULL); }
static INLINE void nvc0_query_update(struct nouveau_client *cli, struct nvc0_query *q) { if (q->is64bit) { if (nouveau_fence_signalled(q->fence)) q->state = NVC0_QUERY_STATE_READY; } else { if (q->data[0] == q->sequence) q->state = NVC0_QUERY_STATE_READY; } }
static inline void nv50_query_update(struct nv50_query *q) { if (q->is64bit) { if (nouveau_fence_signalled(q->fence)) q->state = NV50_QUERY_STATE_READY; } else { if (q->data[0] == q->sequence) q->state = NV50_QUERY_STATE_READY; } }
static inline void nv50_hw_query_update(struct nv50_query *q) { struct nv50_hw_query *hq = nv50_hw_query(q); if (hq->is64bit) { if (nouveau_fence_signalled(hq->fence)) hq->state = NV50_HW_QUERY_STATE_READY; } else { if (hq->data[0] == hq->sequence) hq->state = NV50_HW_QUERY_STATE_READY; } }
static INLINE boolean nouveau_buffer_sync(struct nv04_resource *buf, unsigned rw) { if (rw == PIPE_TRANSFER_READ) { if (!buf->fence_wr) return TRUE; NOUVEAU_DRV_STAT_RES(buf, buf_non_kernel_fence_sync_count, !nouveau_fence_signalled(buf->fence_wr)); if (!nouveau_fence_wait(buf->fence_wr)) return FALSE; } else { if (!buf->fence) return TRUE; NOUVEAU_DRV_STAT_RES(buf, buf_non_kernel_fence_sync_count, !nouveau_fence_signalled(buf->fence)); if (!nouveau_fence_wait(buf->fence)) return FALSE; nouveau_fence_ref(NULL, &buf->fence); } nouveau_fence_ref(NULL, &buf->fence_wr); return TRUE; }
static boolean nouveau_screen_fence_signalled(struct pipe_screen *screen, struct pipe_fence_handle *pfence) { return nouveau_fence_signalled(nouveau_fence(pfence)); }