92 lines · c
1/*2 * sync fence wait tests3 * Copyright 2015-2016 Collabora Ltd.4 *5 * Based on the implementation from the Android Open Source Project,6 *7 * Copyright 2012 Google, Inc8 *9 * Permission is hereby granted, free of charge, to any person obtaining a10 * copy of this software and associated documentation files (the "Software"),11 * to deal in the Software without restriction, including without limitation12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,13 * and/or sell copies of the Software, and to permit persons to whom the14 * Software is furnished to do so, subject to the following conditions:15 *16 * The above copyright notice and this permission notice shall be included in17 * all copies or substantial portions of the Software.18 *19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR25 * OTHER DEALINGS IN THE SOFTWARE.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 /* Confirm fence isn't signaled */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 /* confirm you can successfully wait */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