Lines Matching refs:fence
33 nouveau_fence_new(struct nouveau_screen *screen, struct nouveau_fence **fence) in nouveau_fence_new() argument
35 *fence = CALLOC_STRUCT(nouveau_fence); in nouveau_fence_new()
36 if (!*fence) in nouveau_fence_new()
39 (*fence)->screen = screen; in nouveau_fence_new()
40 (*fence)->ref = 1; in nouveau_fence_new()
41 LIST_INITHEAD(&(*fence)->work); in nouveau_fence_new()
47 nouveau_fence_trigger_work(struct nouveau_fence *fence) in nouveau_fence_trigger_work() argument
51 LIST_FOR_EACH_ENTRY_SAFE(work, tmp, &fence->work, list) { in nouveau_fence_trigger_work()
59 nouveau_fence_emit(struct nouveau_fence *fence) in nouveau_fence_emit() argument
61 struct nouveau_screen *screen = fence->screen; in nouveau_fence_emit()
63 assert(fence->state == NOUVEAU_FENCE_STATE_AVAILABLE); in nouveau_fence_emit()
66 fence->state = NOUVEAU_FENCE_STATE_EMITTING; in nouveau_fence_emit()
68 ++fence->ref; in nouveau_fence_emit()
70 if (screen->fence.tail) in nouveau_fence_emit()
71 screen->fence.tail->next = fence; in nouveau_fence_emit()
73 screen->fence.head = fence; in nouveau_fence_emit()
75 screen->fence.tail = fence; in nouveau_fence_emit()
77 screen->fence.emit(&screen->base, &fence->sequence); in nouveau_fence_emit()
79 assert(fence->state == NOUVEAU_FENCE_STATE_EMITTING); in nouveau_fence_emit()
80 fence->state = NOUVEAU_FENCE_STATE_EMITTED; in nouveau_fence_emit()
84 nouveau_fence_del(struct nouveau_fence *fence) in nouveau_fence_del() argument
87 struct nouveau_screen *screen = fence->screen; in nouveau_fence_del()
89 if (fence->state == NOUVEAU_FENCE_STATE_EMITTED || in nouveau_fence_del()
90 fence->state == NOUVEAU_FENCE_STATE_FLUSHED) { in nouveau_fence_del()
91 if (fence == screen->fence.head) { in nouveau_fence_del()
92 screen->fence.head = fence->next; in nouveau_fence_del()
93 if (!screen->fence.head) in nouveau_fence_del()
94 screen->fence.tail = NULL; in nouveau_fence_del()
96 for (it = screen->fence.head; it && it->next != fence; it = it->next); in nouveau_fence_del()
97 it->next = fence->next; in nouveau_fence_del()
98 if (screen->fence.tail == fence) in nouveau_fence_del()
99 screen->fence.tail = it; in nouveau_fence_del()
103 if (!LIST_IS_EMPTY(&fence->work)) { in nouveau_fence_del()
105 nouveau_fence_trigger_work(fence); in nouveau_fence_del()
108 FREE(fence); in nouveau_fence_del()
114 struct nouveau_fence *fence; in nouveau_fence_update() local
116 u32 sequence = screen->fence.update(&screen->base); in nouveau_fence_update()
118 if (screen->fence.sequence_ack == sequence) in nouveau_fence_update()
120 screen->fence.sequence_ack = sequence; in nouveau_fence_update()
122 for (fence = screen->fence.head; fence; fence = next) { in nouveau_fence_update()
123 next = fence->next; in nouveau_fence_update()
124 sequence = fence->sequence; in nouveau_fence_update()
126 fence->state = NOUVEAU_FENCE_STATE_SIGNALLED; in nouveau_fence_update()
128 nouveau_fence_trigger_work(fence); in nouveau_fence_update()
129 nouveau_fence_ref(NULL, &fence); in nouveau_fence_update()
131 if (sequence == screen->fence.sequence_ack) in nouveau_fence_update()
134 screen->fence.head = next; in nouveau_fence_update()
136 screen->fence.tail = NULL; in nouveau_fence_update()
139 for (fence = next; fence; fence = fence->next) in nouveau_fence_update()
140 if (fence->state == NOUVEAU_FENCE_STATE_EMITTED) in nouveau_fence_update()
141 fence->state = NOUVEAU_FENCE_STATE_FLUSHED; in nouveau_fence_update()
148 nouveau_fence_signalled(struct nouveau_fence *fence) in nouveau_fence_signalled() argument
150 struct nouveau_screen *screen = fence->screen; in nouveau_fence_signalled()
152 if (fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) in nouveau_fence_signalled()
155 if (fence->state >= NOUVEAU_FENCE_STATE_EMITTED) in nouveau_fence_signalled()
158 return fence->state == NOUVEAU_FENCE_STATE_SIGNALLED; in nouveau_fence_signalled()
162 nouveau_fence_kick(struct nouveau_fence *fence) in nouveau_fence_kick() argument
164 struct nouveau_screen *screen = fence->screen; in nouveau_fence_kick()
167 assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); in nouveau_fence_kick()
169 if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) { in nouveau_fence_kick()
174 if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) in nouveau_fence_kick()
175 nouveau_fence_emit(fence); in nouveau_fence_kick()
178 if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED) in nouveau_fence_kick()
182 if (fence == screen->fence.current) in nouveau_fence_kick()
191 nouveau_fence_wait(struct nouveau_fence *fence, struct pipe_debug_callback *debug) in nouveau_fence_wait() argument
193 struct nouveau_screen *screen = fence->screen; in nouveau_fence_wait()
200 if (!nouveau_fence_kick(fence)) in nouveau_fence_wait()
204 if (fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) { in nouveau_fence_wait()
223 fence->sequence, in nouveau_fence_wait()
224 screen->fence.sequence_ack, screen->fence.sequence); in nouveau_fence_wait()
232 if (screen->fence.current->state < NOUVEAU_FENCE_STATE_EMITTING) { in nouveau_fence_next()
233 if (screen->fence.current->ref > 1) in nouveau_fence_next()
234 nouveau_fence_emit(screen->fence.current); in nouveau_fence_next()
239 nouveau_fence_ref(NULL, &screen->fence.current); in nouveau_fence_next()
241 nouveau_fence_new(screen, &screen->fence.current); in nouveau_fence_next()
253 nouveau_fence_work(struct nouveau_fence *fence, in nouveau_fence_work() argument
258 if (!fence || fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) { in nouveau_fence_work()
268 LIST_ADD(&work->list, &fence->work); in nouveau_fence_work()
269 p_atomic_inc(&fence->work_count); in nouveau_fence_work()
270 if (fence->work_count > 64) in nouveau_fence_work()
271 nouveau_fence_kick(fence); in nouveau_fence_work()