intel_sync.c revision 428d7b3d
1428d7b3dSmrg/* 2428d7b3dSmrg * Copyright © 2013-2014 Intel Corporation 3428d7b3dSmrg * 4428d7b3dSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5428d7b3dSmrg * documentation for any purpose is hereby granted without fee, provided that 6428d7b3dSmrg * the above copyright notice appear in all copies and that both that copyright 7428d7b3dSmrg * notice and this permission notice appear in supporting documentation, and 8428d7b3dSmrg * that the name of the copyright holders not be used in advertising or 9428d7b3dSmrg * publicity pertaining to distribution of the software without specific, 10428d7b3dSmrg * written prior permission. The copyright holders make no representations 11428d7b3dSmrg * about the suitability of this software for any purpose. It is provided "as 12428d7b3dSmrg * is" without express or implied warranty. 13428d7b3dSmrg * 14428d7b3dSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15428d7b3dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16428d7b3dSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17428d7b3dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18428d7b3dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19428d7b3dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20428d7b3dSmrg * OF THIS SOFTWARE. 21428d7b3dSmrg */ 22428d7b3dSmrg 23428d7b3dSmrg#include "intel.h" 24428d7b3dSmrg#include "misyncshm.h" 25428d7b3dSmrg#include "misyncstr.h" 26428d7b3dSmrg 27428d7b3dSmrg/* 28428d7b3dSmrg * This whole file exists to wrap a sync fence trigger operation 29428d7b3dSmrg * so that we can flush the batch buffer to provide serialization 30428d7b3dSmrg * between the server and the shm fence client 31428d7b3dSmrg */ 32428d7b3dSmrg 33428d7b3dSmrgstatic DevPrivateKeyRec intel_sync_fence_private_key; 34428d7b3dSmrg 35428d7b3dSmrgtypedef struct _intel_sync_fence_private { 36428d7b3dSmrg SyncFenceSetTriggeredFunc set_triggered; 37428d7b3dSmrg} intel_sync_fence_private; 38428d7b3dSmrg 39428d7b3dSmrg#define SYNC_FENCE_PRIV(pFence) \ 40428d7b3dSmrg (intel_sync_fence_private *) dixLookupPrivate(&pFence->devPrivates, &intel_sync_fence_private_key) 41428d7b3dSmrg 42428d7b3dSmrgstatic void 43428d7b3dSmrgintel_sync_fence_set_triggered (SyncFence *fence) 44428d7b3dSmrg{ 45428d7b3dSmrg ScreenPtr screen = fence->pScreen; 46428d7b3dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 47428d7b3dSmrg intel_screen_private *intel = intel_get_screen_private(scrn); 48428d7b3dSmrg intel_sync_fence_private *private = SYNC_FENCE_PRIV(fence); 49428d7b3dSmrg 50428d7b3dSmrg /* Flush pending rendering operations */ 51428d7b3dSmrg if (intel->flush_rendering) 52428d7b3dSmrg intel->flush_rendering(intel); 53428d7b3dSmrg 54428d7b3dSmrg fence->funcs.SetTriggered = private->set_triggered; 55428d7b3dSmrg fence->funcs.SetTriggered(fence); 56428d7b3dSmrg private->set_triggered = fence->funcs.SetTriggered; 57428d7b3dSmrg fence->funcs.SetTriggered = intel_sync_fence_set_triggered; 58428d7b3dSmrg} 59428d7b3dSmrg 60428d7b3dSmrgstatic void 61428d7b3dSmrgintel_sync_create_fence(ScreenPtr screen, 62428d7b3dSmrg SyncFence *fence, 63428d7b3dSmrg Bool initially_triggered) 64428d7b3dSmrg{ 65428d7b3dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 66428d7b3dSmrg intel_screen_private *intel = intel_get_screen_private(scrn); 67428d7b3dSmrg SyncScreenFuncsPtr screen_funcs = miSyncGetScreenFuncs(screen); 68428d7b3dSmrg intel_sync_fence_private *private = SYNC_FENCE_PRIV(fence); 69428d7b3dSmrg 70428d7b3dSmrg screen_funcs->CreateFence = intel->save_sync_screen_funcs.CreateFence; 71428d7b3dSmrg screen_funcs->CreateFence(screen, fence, initially_triggered); 72428d7b3dSmrg intel->save_sync_screen_funcs.CreateFence = screen_funcs->CreateFence; 73428d7b3dSmrg screen_funcs->CreateFence = intel_sync_create_fence; 74428d7b3dSmrg 75428d7b3dSmrg private->set_triggered = fence->funcs.SetTriggered; 76428d7b3dSmrg fence->funcs.SetTriggered = intel_sync_fence_set_triggered; 77428d7b3dSmrg} 78428d7b3dSmrg 79428d7b3dSmrgBool 80428d7b3dSmrgintel_sync_init(ScreenPtr screen) 81428d7b3dSmrg{ 82428d7b3dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 83428d7b3dSmrg intel_screen_private *intel = intel_get_screen_private(scrn); 84428d7b3dSmrg SyncScreenFuncsPtr screen_funcs; 85428d7b3dSmrg 86428d7b3dSmrg if (!miSyncShmScreenInit(screen)) 87428d7b3dSmrg return FALSE; 88428d7b3dSmrg 89428d7b3dSmrg if (!dixPrivateKeyRegistered(&intel_sync_fence_private_key)) { 90428d7b3dSmrg if (!dixRegisterPrivateKey(&intel_sync_fence_private_key, 91428d7b3dSmrg PRIVATE_SYNC_FENCE, 92428d7b3dSmrg sizeof (intel_sync_fence_private))) 93428d7b3dSmrg return FALSE; 94428d7b3dSmrg } 95428d7b3dSmrg 96428d7b3dSmrg screen_funcs = miSyncGetScreenFuncs(screen); 97428d7b3dSmrg intel->save_sync_screen_funcs.CreateFence = screen_funcs->CreateFence; 98428d7b3dSmrg screen_funcs->CreateFence = intel_sync_create_fence; 99428d7b3dSmrg return TRUE; 100428d7b3dSmrg} 101428d7b3dSmrg 102428d7b3dSmrgvoid 103428d7b3dSmrgintel_sync_close(ScreenPtr screen) 104428d7b3dSmrg{ 105428d7b3dSmrg ScrnInfoPtr scrn = xf86ScreenToScrn(screen); 106428d7b3dSmrg intel_screen_private *intel = intel_get_screen_private(scrn); 107428d7b3dSmrg SyncScreenFuncsPtr screen_funcs = miSyncGetScreenFuncs(screen); 108428d7b3dSmrg 109428d7b3dSmrg if (screen_funcs) 110428d7b3dSmrg screen_funcs->CreateFence = intel->save_sync_screen_funcs.CreateFence; 111428d7b3dSmrg} 112