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)
61
i915_drm_fence_finish(struct i915_winsys *iws,
62
struct pipe_fence_handle *fence)
64
struct i915_drm_fence *f = (struct i915_drm_fence *)fence;
66
/* fence already expired */
70
drm_intel_bo_wait_rendering(f->bo);
71
drm_intel_bo_unreference(f->bo);
78
i915_drm_winsys_init_fence_functions(struct i915_drm_winsys *idws)
80
idws->base.fence_reference = i915_drm_fence_reference;
81
idws->base.fence_signalled = i915_drm_fence_signalled;
82
idws->base.fence_finish = i915_drm_fence_finish;