lp_fence.c revision cdc920a0
1/************************************************************************** 2 * 3 * Copyright 2009 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29#include "pipe/p_screen.h" 30#include "util/u_memory.h" 31#include "util/u_inlines.h" 32#include "lp_fence.h" 33 34 35struct lp_fence * 36lp_fence_create(unsigned rank) 37{ 38 struct lp_fence *fence = CALLOC_STRUCT(lp_fence); 39 40 pipe_reference_init(&fence->reference, 1); 41 42 pipe_mutex_init(fence->mutex); 43 pipe_condvar_init(fence->signalled); 44 45 fence->rank = rank; 46 47 return fence; 48} 49 50 51static void 52lp_fence_destroy(struct lp_fence *fence) 53{ 54 pipe_mutex_destroy(fence->mutex); 55 pipe_condvar_destroy(fence->signalled); 56 FREE(fence); 57} 58 59 60static void 61llvmpipe_fence_reference(struct pipe_screen *screen, 62 struct pipe_fence_handle **ptr, 63 struct pipe_fence_handle *fence) 64{ 65 struct lp_fence *old = (struct lp_fence *) *ptr; 66 struct lp_fence *f = (struct lp_fence *) fence; 67 68 if (pipe_reference(&old->reference, &f->reference)) { 69 lp_fence_destroy(old); 70 } 71} 72 73 74static int 75llvmpipe_fence_signalled(struct pipe_screen *screen, 76 struct pipe_fence_handle *fence, 77 unsigned flag) 78{ 79 struct lp_fence *f = (struct lp_fence *) fence; 80 81 return f->count == f->rank; 82} 83 84 85static int 86llvmpipe_fence_finish(struct pipe_screen *screen, 87 struct pipe_fence_handle *fence_handle, 88 unsigned flag) 89{ 90 struct lp_fence *fence = (struct lp_fence *) fence_handle; 91 92 pipe_mutex_lock(fence->mutex); 93 while (fence->count < fence->rank) { 94 pipe_condvar_wait(fence->signalled, fence->mutex); 95 } 96 pipe_mutex_unlock(fence->mutex); 97 98 return 0; 99} 100 101 102 103 104void 105llvmpipe_init_screen_fence_funcs(struct pipe_screen *screen) 106{ 107 screen->fence_reference = llvmpipe_fence_reference; 108 screen->fence_signalled = llvmpipe_fence_signalled; 109 screen->fence_finish = llvmpipe_fence_finish; 110} 111