2 #include "i915_drm_winsys.h"
3 #include "util/u_memory.h"
4 #include "util/u_atomic.h"
5 #include "util/u_inlines.h"
8 * Because gem does not have fence's we have to create our own fences.
10 * They work by keeping the batchbuffer around and checking if that has
11 * been idled. If bo is NULL fence has expired.
15 struct pipe_reference reference;
20 struct pipe_fence_handle *
21 i915_drm_fence_create(drm_intel_bo *bo)
23 struct i915_drm_fence *fence = CALLOC_STRUCT(i915_drm_fence);
25 pipe_reference_init(&fence->reference, 1);
26 /* bo is null if fence already expired */
28 drm_intel_bo_reference(bo);
32 return (struct pipe_fence_handle *)fence;
36 i915_drm_fence_reference(struct i915_winsys *iws,
37 struct pipe_fence_handle **ptr,
38 struct pipe_fence_handle *fence)
40 struct i915_drm_fence *old = (struct i915_drm_fence *)*ptr;
41 struct i915_drm_fence *f = (struct i915_drm_fence *)fence;
43 if (pipe_reference(&((struct i915_drm_fence *)(*ptr))->reference, &f->reference)) {
45 drm_intel_bo_unreference(old->bo);
52 i915_drm_fence_signalled(struct i915_winsys *iws,
53 struct pipe_fence_handle *fence)
55 struct i915_drm_fence *f = (struct i915_drm_fence *)fence;
57 /* fence already expired */
61 return !drm_intel_bo_busy(f->bo);
65 i915_drm_fence_finish(struct i915_winsys *iws,
66 struct pipe_fence_handle *fence)
68 struct i915_drm_fence *f = (struct i915_drm_fence *)fence;
70 /* fence already expired */
74 drm_intel_bo_wait_rendering(f->bo);
75 drm_intel_bo_unreference(f->bo);
82 i915_drm_winsys_init_fence_functions(struct i915_drm_winsys *idws)
84 idws->base.fence_reference = i915_drm_fence_reference;
85 idws->base.fence_signalled = i915_drm_fence_signalled;
86 idws->base.fence_finish = i915_drm_fence_finish;