13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 2e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Copyright 2009-2011 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 25e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/* 26e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * TODO: 27e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 28e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Fencing is currently a bit inefficient, since we need to call the 29e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * kernel do determine a fence object signaled status if the fence is not 30e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * signaled. This can be greatly improved upon by using the fact that the 31e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * execbuf ioctl returns the last signaled fence seqno, as does the 32e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * fence signaled ioctl. We should set up a ring of fence objects and 33e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * walk through them checking for signaled status each time we receive a 34e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * new passed fence seqno. 35e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 38e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom#include "util/u_atomic.h" 39e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipebuffer/pb_buffer_fenced.h" 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_screen.h" 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_fence.h" 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_fence_ops 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pb_fence_ops base; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_winsys_screen *vws; 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 52e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromstruct vmw_fence 53e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 54e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t refcount; 55e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom uint32_t handle; 56e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom uint32_t mask; 57e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t signalled; 58e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom}; 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 60e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 61e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence - return the vmw_fence object identified by a 62e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * struct pipe_fence_handle * 63e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 64e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @fence: The opaque pipe fence handle. 65e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 66e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromstatic INLINE struct vmw_fence * 67e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_fence(struct pipe_fence_handle *fence) 68e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 69e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return (struct vmw_fence *) fence; 70e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 71e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 72e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 73e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_create - Create a user-space fence object. 74e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 75e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @handle: Handle identifying the kernel fence object. 76e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @mask: Mask of flags that this fence object may signal. 77e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 78e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Returns NULL on failure. 79e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 80e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromstruct pipe_fence_handle * 81e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_fence_create(uint32_t handle, uint32_t mask) 82e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 83e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_fence *fence = CALLOC_STRUCT(vmw_fence); 84e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 85e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (!fence) 86e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return NULL; 87e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 88e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom p_atomic_set(&fence->refcount, 1); 89e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom fence->handle = handle; 90e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom fence->mask = mask; 91e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom p_atomic_set(&fence->signalled, 0); 92e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 93e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return (struct pipe_fence_handle *) fence; 94e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 95e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 96e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 97e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops - Return the vmw_fence_ops structure backing a 98e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * struct pb_fence_ops pointer. 99e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 100e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @ops: Pointer to a struct pb_fence_ops. 101e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 102e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE struct vmw_fence_ops * 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops(struct pb_fence_ops *ops) 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ops); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return (struct vmw_fence_ops *)ops; 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 111e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 112e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 113e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_reference - Reference / unreference a vmw fence object. 114e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 115e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @vws: Pointer to the winsys screen. 116e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @ptr: Pointer to reference transfer destination. 117e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @fence: Pointer to object to reference. May be NULL. 118e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 119e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvoid 120e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_fence_reference(struct vmw_winsys_screen *vws, 121e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct pipe_fence_handle **ptr, 122e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct pipe_fence_handle *fence) 123e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 124e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (*ptr) { 125e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_fence *vfence = vmw_fence(*ptr); 126e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 127e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (p_atomic_dec_zero(&vfence->refcount)) { 128e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vmw_ioctl_fence_unref(vws, vfence->handle); 129e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom FREE(vfence); 130e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } 131e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } 132e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 133e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (fence) { 134e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_fence *vfence = vmw_fence(fence); 135e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 136e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom p_atomic_inc(&vfence->refcount); 137e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } 138e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 139e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom *ptr = fence; 140e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 141e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 142e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 143e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 144e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_signalled - Check whether a fence object is signalled. 145e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 146e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @vws: Pointer to the winsys screen. 147e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @fence: Handle to the fence object. 148e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @flag: Fence flags to check. If the fence object can't signal 149e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * a flag, it is assumed to be already signaled. 150e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 151e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Returns 0 if the fence object was signaled, nonzero otherwise. 152e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 153e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromint 154e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_fence_signalled(struct vmw_winsys_screen *vws, 155e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct pipe_fence_handle *fence, 156e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom unsigned flag) 157e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 158e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_fence *vfence; 159e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t vflags = SVGA_FENCE_FLAG_EXEC; 160e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int ret; 161e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom uint32_t old; 162e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 163e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (!fence) 164e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return 0; 165e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 166e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vfence = vmw_fence(fence); 167e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom old = p_atomic_read(&vfence->signalled); 168e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 169e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vflags &= ~vfence->mask; 170e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 171e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if ((old & vflags) == vflags) 172e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return 0; 173e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 174e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom ret = vmw_ioctl_fence_signalled(vws, vfence->handle, vflags); 175e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 176e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (ret == 0) { 177e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t prev = old; 178e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 179e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom do { 180e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom old = prev; 181e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom prev = p_atomic_cmpxchg(&vfence->signalled, old, old | vflags); 182e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } while (prev != old); 183e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } 184e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 185e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return ret; 186e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 187e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 188e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 189e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_finish - Wait for a fence object to signal. 190e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 191e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @vws: Pointer to the winsys screen. 192e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @fence: Handle to the fence object. 193e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @flag: Fence flags to wait for. If the fence object can't signal 194e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * a flag, it is assumed to be already signaled. 195e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 196e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Returns 0 if the wait succeeded. Nonzero otherwise. 197e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 198e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromint 199e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_fence_finish(struct vmw_winsys_screen *vws, 200e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct pipe_fence_handle *fence, 201e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom unsigned flag) 202e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{ 203e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_fence *vfence; 204e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t vflags = SVGA_FENCE_FLAG_EXEC; 205e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int ret; 206e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom uint32_t old; 207e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 208e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (!fence) 209e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return 0; 210e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 211e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vfence = vmw_fence(fence); 212e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom old = p_atomic_read(&vfence->signalled); 213e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vflags &= ~vfence->mask; 214e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 215e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if ((old & vflags) == vflags) 216e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return 0; 217e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 218e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom ret = vmw_ioctl_fence_finish(vws, vfence->handle, vflags); 219e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 220e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom if (ret == 0) { 221e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom int32_t prev = old; 222e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 223e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom do { 224e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom old = prev; 225e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom prev = p_atomic_cmpxchg(&vfence->signalled, old, old | vflags); 226e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } while (prev != old); 227e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom } 228e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 229e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return ret; 230e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 231e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 232e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 233e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 234e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops_fence_reference - wrapper for the pb_fence_ops api. 235e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 236e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * wrapper around vmw_fence_reference. 237e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops_fence_reference(struct pb_fence_ops *ops, 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle **ptr, 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle *fence) 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 243e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 245e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom vmw_fence_reference(vws, ptr, fence); 246e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom} 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 248e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 249e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops_fence_signalled - wrapper for the pb_fence_ops api. 250e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 251e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * wrapper around vmw_fence_signalled. 252e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops_fence_signalled(struct pb_fence_ops *ops, 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle *fence, 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned flag) 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; 259e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 260e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return vmw_fence_signalled(vws, fence, flag); 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 264e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 265e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops_fence_finish - wrapper for the pb_fence_ops api. 266e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 267e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * wrapper around vmw_fence_finish. 268e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int 2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops_fence_finish(struct pb_fence_ops *ops, 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle *fence, 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned flag) 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; 275e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom 276e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom return vmw_fence_finish(vws, fence, flag); 2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 280e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 281e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops_destroy - Destroy a pb_fence_ops function table. 282e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 283e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @ops: The function table to destroy. 284e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 285e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Part of the pb_fence_ops api. 286e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops_destroy(struct pb_fence_ops *ops) 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(ops); 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 294e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom/** 295e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * vmw_fence_ops_create - Create a pb_fence_ops function table. 296e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 297e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * @vws: Pointer to a struct vmw_winsys_screen. 298e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 299e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Returns a pointer to a pb_fence_ops function table to interface 300e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * with pipe_buffer. This function is typically called on driver setup. 301e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * 302e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom * Returns NULL on failure. 303e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom */ 3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct pb_fence_ops * 3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_fence_ops_create(struct vmw_winsys_screen *vws) 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct vmw_fence_ops *ops; 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops = CALLOC_STRUCT(vmw_fence_ops); 3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!ops) 3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops->base.destroy = &vmw_fence_ops_destroy; 3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops->base.fence_reference = &vmw_fence_ops_fence_reference; 3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops->base.fence_signalled = &vmw_fence_ops_fence_signalled; 3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops->base.fence_finish = &vmw_fence_ops_fence_finish; 3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ops->vws = vws; 3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &ops->base; 3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 324