1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include "sync.h"
29#include "sw_sync.h"
30#include "synctest.h"
31
32int test_fence_multi_timeline_wait(void)
33{
34 int timelineA, timelineB, timelineC;
35 int fenceA, fenceB, fenceC, merged;
36 int valid, active, signaled, ret;
37
38 timelineA = sw_sync_timeline_create();
39 timelineB = sw_sync_timeline_create();
40 timelineC = sw_sync_timeline_create();
41
42 fenceA = sw_sync_fence_create(timelineA, "fenceA", 5);
43 fenceB = sw_sync_fence_create(timelineB, "fenceB", 5);
44 fenceC = sw_sync_fence_create(timelineC, "fenceC", 5);
45
46 merged = sync_merge("mergeFence", fenceB, fenceA);
47 merged = sync_merge("mergeFence", fenceC, merged);
48
49 valid = sw_sync_fence_is_valid(merged);
50 ASSERT(valid, "Failure merging fence from various timelines\n");
51
52
53 active = sync_fence_count_with_status(merged, FENCE_STATUS_ACTIVE);
54 ASSERT(active == 3, "Fence signaled too early!\n");
55
56 ret = sync_wait(merged, 0);
57 ASSERT(ret == 0,
58 "Failure waiting on fence until timeout\n");
59
60 ret = sw_sync_timeline_inc(timelineA, 5);
61 active = sync_fence_count_with_status(merged, FENCE_STATUS_ACTIVE);
62 signaled = sync_fence_count_with_status(merged, FENCE_STATUS_SIGNALED);
63 ASSERT(active == 2 && signaled == 1,
64 "Fence did not signal properly!\n");
65
66 ret = sw_sync_timeline_inc(timelineB, 5);
67 active = sync_fence_count_with_status(merged, FENCE_STATUS_ACTIVE);
68 signaled = sync_fence_count_with_status(merged, FENCE_STATUS_SIGNALED);
69 ASSERT(active == 1 && signaled == 2,
70 "Fence did not signal properly!\n");
71
72 ret = sw_sync_timeline_inc(timelineC, 5);
73 active = sync_fence_count_with_status(merged, FENCE_STATUS_ACTIVE);
74 signaled = sync_fence_count_with_status(merged, FENCE_STATUS_SIGNALED);
75 ASSERT(active == 0 && signaled == 3,
76 "Fence did not signal properly!\n");
77
78
79 ret = sync_wait(merged, 100);
80 ASSERT(ret > 0, "Failure waiting on signaled fence\n");
81
82 sw_sync_fence_destroy(merged);
83 sw_sync_fence_destroy(fenceC);
84 sw_sync_fence_destroy(fenceB);
85 sw_sync_fence_destroy(fenceA);
86 sw_sync_timeline_destroy(timelineC);
87 sw_sync_timeline_destroy(timelineB);
88 sw_sync_timeline_destroy(timelineA);
89
90 return 0;
91}
92