st/mesa: fix incorrect RowStride computation
[mesa.git] / src / gallium / winsys / drm / intel / gem / intel_drm_fence.c
1
2 #include "intel_drm_winsys.h"
3 #include "util/u_memory.h"
4 #include "util/u_atomic.h"
5 #include "util/u_inlines.h"
6
7 /**
8 * Because gem does not have fence's we have to create our own fences.
9 *
10 * They work by keeping the batchbuffer around and checking if that has
11 * been idled. If bo is NULL fence has expired.
12 */
13 struct intel_drm_fence
14 {
15 struct pipe_reference reference;
16 drm_intel_bo *bo;
17 };
18
19
20 struct pipe_fence_handle *
21 intel_drm_fence_create(drm_intel_bo *bo)
22 {
23 struct intel_drm_fence *fence = CALLOC_STRUCT(intel_drm_fence);
24
25 pipe_reference_init(&fence->reference, 1);
26 /* bo is null if fence already expired */
27 if (bo) {
28 drm_intel_bo_reference(bo);
29 fence->bo = bo;
30 }
31
32 return (struct pipe_fence_handle *)fence;
33 }
34
35 static void
36 intel_drm_fence_reference(struct intel_winsys *iws,
37 struct pipe_fence_handle **ptr,
38 struct pipe_fence_handle *fence)
39 {
40 struct intel_drm_fence *old = (struct intel_drm_fence *)*ptr;
41 struct intel_drm_fence *f = (struct intel_drm_fence *)fence;
42
43 if (pipe_reference(&((struct intel_drm_fence *)(*ptr))->reference, &f->reference)) {
44 if (old->bo)
45 drm_intel_bo_unreference(old->bo);
46 FREE(old);
47 }
48 *ptr = fence;
49 }
50
51 static int
52 intel_drm_fence_signalled(struct intel_winsys *iws,
53 struct pipe_fence_handle *fence)
54 {
55 assert(0);
56
57 return 0;
58 }
59
60 static int
61 intel_drm_fence_finish(struct intel_winsys *iws,
62 struct pipe_fence_handle *fence)
63 {
64 struct intel_drm_fence *f = (struct intel_drm_fence *)fence;
65
66 /* fence already expired */
67 if (!f->bo)
68 return 0;
69
70 drm_intel_bo_wait_rendering(f->bo);
71 drm_intel_bo_unreference(f->bo);
72 f->bo = NULL;
73
74 return 0;
75 }
76
77 void
78 intel_drm_winsys_init_fence_functions(struct intel_drm_winsys *idws)
79 {
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;
83 }