nouveau_sync.c revision fda9279d
1fda9279dSmrg/* 2fda9279dSmrg * Copyright © 2013-2014 Intel Corporation 3fda9279dSmrg * 4fda9279dSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5fda9279dSmrg * documentation for any purpose is hereby granted without fee, provided that 6fda9279dSmrg * the above copyright notice appear in all copies and that both that copyright 7fda9279dSmrg * notice and this permission notice appear in supporting documentation, and 8fda9279dSmrg * that the name of the copyright holders not be used in advertising or 9fda9279dSmrg * publicity pertaining to distribution of the software without specific, 10fda9279dSmrg * written prior permission. The copyright holders make no representations 11fda9279dSmrg * about the suitability of this software for any purpose. It is provided "as 12fda9279dSmrg * is" without express or implied warranty. 13fda9279dSmrg * 14fda9279dSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15fda9279dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16fda9279dSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17fda9279dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18fda9279dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19fda9279dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20fda9279dSmrg * OF THIS SOFTWARE. 21fda9279dSmrg */ 22fda9279dSmrg 23fda9279dSmrg#include "nouveau_sync.h" 24fda9279dSmrg#ifdef DRI3 25fda9279dSmrg#include "nv_include.h" 26fda9279dSmrg 27fda9279dSmrgstatic DevPrivateKeyRec nouveau_syncobj_key; 28fda9279dSmrg 29fda9279dSmrgstruct nouveau_syncobj { 30fda9279dSmrg SyncFenceSetTriggeredFunc SetTriggered; 31fda9279dSmrg}; 32fda9279dSmrg 33fda9279dSmrg#define nouveau_syncobj(fence) \ 34fda9279dSmrg dixLookupPrivate(&(fence)->devPrivates, &nouveau_syncobj_key) 35fda9279dSmrg 36fda9279dSmrgstruct nouveau_syncctx { 37fda9279dSmrg SyncScreenCreateFenceFunc CreateFence; 38fda9279dSmrg}; 39fda9279dSmrg 40fda9279dSmrg#define nouveau_syncctx(screen) ({ \ 41fda9279dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); \ 42fda9279dSmrg NVPtr pNv = NVPTR(scrn); \ 43fda9279dSmrg pNv->sync; \ 44fda9279dSmrg}) 45fda9279dSmrg 46fda9279dSmrgstatic void 47fda9279dSmrgnouveau_syncobj_flush(SyncFence *fence) 48fda9279dSmrg{ 49fda9279dSmrg struct nouveau_syncobj *pobj = nouveau_syncobj(fence); 50fda9279dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(fence->pScreen); 51fda9279dSmrg NVPtr pNv = NVPTR(scrn); 52fda9279dSmrg SyncFenceFuncsPtr func = &fence->funcs; 53fda9279dSmrg 54fda9279dSmrg if (pNv->Flush) 55fda9279dSmrg pNv->Flush(scrn); 56fda9279dSmrg 57fda9279dSmrg swap(pobj, func, SetTriggered); 58fda9279dSmrg func->SetTriggered(fence); 59fda9279dSmrg swap(pobj, func, SetTriggered); 60fda9279dSmrg} 61fda9279dSmrg 62fda9279dSmrgstatic void 63fda9279dSmrgnouveau_syncobj_new(ScreenPtr screen, SyncFence *fence, Bool triggered) 64fda9279dSmrg{ 65fda9279dSmrg struct nouveau_syncctx *priv = nouveau_syncctx(screen); 66fda9279dSmrg struct nouveau_syncobj *pobj = nouveau_syncobj(fence); 67fda9279dSmrg SyncScreenFuncsPtr sync = miSyncGetScreenFuncs(screen); 68fda9279dSmrg SyncFenceFuncsPtr func = &fence->funcs; 69fda9279dSmrg 70fda9279dSmrg swap(priv, sync, CreateFence); 71fda9279dSmrg sync->CreateFence(screen, fence, triggered); 72fda9279dSmrg swap(priv, sync, CreateFence); 73fda9279dSmrg 74fda9279dSmrg wrap(pobj, func, SetTriggered, nouveau_syncobj_flush); 75fda9279dSmrg} 76fda9279dSmrg 77fda9279dSmrgvoid 78fda9279dSmrgnouveau_sync_fini(ScreenPtr screen) 79fda9279dSmrg{ 80fda9279dSmrg struct nouveau_syncctx *priv = nouveau_syncctx(screen); 81fda9279dSmrg SyncScreenFuncsPtr sync = miSyncGetScreenFuncs(screen); 82fda9279dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 83fda9279dSmrg NVPtr pNv = NVPTR(scrn); 84fda9279dSmrg 85fda9279dSmrg unwrap(priv, sync, CreateFence); 86fda9279dSmrg 87fda9279dSmrg pNv->sync = NULL; 88fda9279dSmrg free(priv); 89fda9279dSmrg} 90fda9279dSmrg 91fda9279dSmrgBool 92fda9279dSmrgnouveau_sync_init(ScreenPtr screen) 93fda9279dSmrg{ 94fda9279dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 95fda9279dSmrg NVPtr pNv = NVPTR(scrn); 96fda9279dSmrg struct nouveau_syncctx *priv; 97fda9279dSmrg SyncScreenFuncsPtr sync; 98fda9279dSmrg 99fda9279dSmrg priv = pNv->sync = calloc(1, sizeof(*priv)); 100fda9279dSmrg if (!priv) 101fda9279dSmrg return FALSE; 102fda9279dSmrg 103fda9279dSmrg if (!miSyncShmScreenInit(screen)) 104fda9279dSmrg return FALSE; 105fda9279dSmrg 106fda9279dSmrg if (!dixPrivateKeyRegistered(&nouveau_syncobj_key)) { 107fda9279dSmrg if (!dixRegisterPrivateKey(&nouveau_syncobj_key, 108fda9279dSmrg PRIVATE_SYNC_FENCE, 109fda9279dSmrg sizeof(struct nouveau_syncobj))) 110fda9279dSmrg return FALSE; 111fda9279dSmrg } 112fda9279dSmrg 113fda9279dSmrg sync = miSyncGetScreenFuncs(screen); 114fda9279dSmrg wrap(priv, sync, CreateFence, nouveau_syncobj_new); 115fda9279dSmrg return TRUE; 116fda9279dSmrg} 117fda9279dSmrg#endif 118