2 #include "intel_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.
13 struct intel_drm_fence
15 struct pipe_reference reference
;
20 struct pipe_fence_handle
*
21 intel_drm_fence_create(drm_intel_bo
*bo
)
23 struct intel_drm_fence
*fence
= CALLOC_STRUCT(intel_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 intel_drm_fence_reference(struct intel_winsys
*iws
,
37 struct pipe_fence_handle
**ptr
,
38 struct pipe_fence_handle
*fence
)
40 struct intel_drm_fence
*old
= (struct intel_drm_fence
*)*ptr
;
41 struct intel_drm_fence
*f
= (struct intel_drm_fence
*)fence
;
43 if (pipe_reference(&((struct intel_drm_fence
*)(*ptr
))->reference
, &f
->reference
)) {
45 drm_intel_bo_unreference(old
->bo
);
52 intel_drm_fence_signalled(struct intel_winsys
*iws
,
53 struct pipe_fence_handle
*fence
)
61 intel_drm_fence_finish(struct intel_winsys
*iws
,
62 struct pipe_fence_handle
*fence
)
64 struct intel_drm_fence
*f
= (struct intel_drm_fence
*)fence
;
66 /* fence already expired */
70 drm_intel_bo_wait_rendering(f
->bo
);
71 drm_intel_bo_unreference(f
->bo
);
78 intel_drm_winsys_init_fence_functions(struct intel_drm_winsys
*idws
)
80 idws
->base
.fence_reference
= intel_drm_fence_reference
;
81 idws
->base
.fence_signalled
= intel_drm_fence_signalled
;
82 idws
->base
.fence_finish
= intel_drm_fence_finish
;