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