1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christoph Bumiller
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_double_list.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_screen.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_winsys.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_fence.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef PIPE_OS_UNIX
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sched.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_new(struct nouveau_screen *screen, struct nouveau_fence **fence,
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  boolean emit)
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *fence = CALLOC_STRUCT(nouveau_fence);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!*fence)
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fence)->screen = screen;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fence)->ref = 1;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LIST_INITHEAD(&(*fence)->work);
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (emit)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_emit(*fence);
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_trigger_work(struct nouveau_fence *fence)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_fence_work *work, *tmp;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LIST_FOR_EACH_ENTRY_SAFE(work, tmp, &fence->work, list) {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      work->func(work->data);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LIST_DEL(&work->list);
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(work);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_work(struct nouveau_fence *fence,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   void (*func)(void *), void *data)
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_fence_work *work;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!fence || fence->state == NOUVEAU_FENCE_STATE_SIGNALLED) {
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      func(data);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   work = CALLOC_STRUCT(nouveau_fence_work);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!work)
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   work->func = func;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   work->data = data;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LIST_ADD(&work->list, &fence->work);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_emit(struct nouveau_fence *fence)
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_screen *screen = fence->screen;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fence->state == NOUVEAU_FENCE_STATE_AVAILABLE);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set this now, so that if fence.emit triggers a flush we don't recurse */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fence->state = NOUVEAU_FENCE_STATE_EMITTING;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++fence->ref;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->fence.tail)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->fence.tail->next = fence;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->fence.head = fence;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->fence.tail = fence;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->fence.emit(&screen->base, &fence->sequence);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fence->state == NOUVEAU_FENCE_STATE_EMITTING);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fence->state = NOUVEAU_FENCE_STATE_EMITTED;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_del(struct nouveau_fence *fence)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_fence *it;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_screen *screen = fence->screen;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fence->state == NOUVEAU_FENCE_STATE_EMITTED ||
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       fence->state == NOUVEAU_FENCE_STATE_FLUSHED) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fence == screen->fence.head) {
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         screen->fence.head = fence->next;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!screen->fence.head)
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            screen->fence.tail = NULL;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (it = screen->fence.head; it && it->next != fence; it = it->next);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         it->next = fence->next;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (screen->fence.tail == fence)
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            screen->fence.tail = it;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!LIST_IS_EMPTY(&fence->work)) {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("WARNING: deleting fence with work still pending !\n");
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_trigger_work(fence);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(fence);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_update(struct nouveau_screen *screen, boolean flushed)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_fence *fence;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_fence *next = NULL;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u32 sequence = screen->fence.update(&screen->base);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->fence.sequence_ack == sequence)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->fence.sequence_ack = sequence;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (fence = screen->fence.head; fence; fence = next) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      next = fence->next;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sequence = fence->sequence;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fence->state = NOUVEAU_FENCE_STATE_SIGNALLED;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_trigger_work(fence);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_ref(NULL, &fence);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sequence == screen->fence.sequence_ack)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->fence.head = next;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!next)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->fence.tail = NULL;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flushed) {
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (fence = next; fence; fence = fence->next)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (fence->state == NOUVEAU_FENCE_STATE_EMITTED)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fence->state = NOUVEAU_FENCE_STATE_FLUSHED;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NOUVEAU_FENCE_MAX_SPINS (1 << 31)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_signalled(struct nouveau_fence *fence)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_screen *screen = fence->screen;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fence->state >= NOUVEAU_FENCE_STATE_EMITTED)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_update(screen, FALSE);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return fence->state == NOUVEAU_FENCE_STATE_SIGNALLED;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_wait(struct nouveau_fence *fence)
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_screen *screen = fence->screen;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t spins = 0;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* wtf, someone is waiting on a fence in flush_notify handler? */
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) {
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_emit(fence);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fence == screen->fence.current)
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nouveau_fence_new(screen, &screen->fence.current, FALSE);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_pushbuf_kick(screen->pushbuf, screen->pushbuf->channel);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_update(screen, FALSE);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fence->state == NOUVEAU_FENCE_STATE_SIGNALLED)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      spins++;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef PIPE_OS_UNIX
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!(spins % 8)) /* donate a few cycles */
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sched_yield();
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (spins < NOUVEAU_FENCE_MAX_SPINS);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf("Wait on fence %u (ack = %u, next = %u) timed out !\n",
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                fence->sequence,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                screen->fence.sequence_ack, screen->fence.sequence);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fence_next(struct nouveau_screen *screen)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->fence.current->state < NOUVEAU_FENCE_STATE_EMITTING)
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_fence_emit(screen->fence.current);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nouveau_fence_ref(NULL, &screen->fence.current);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nouveau_fence_new(screen, &screen->fence.current, FALSE);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
230