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