133 lines · c
1/*2 * sync fence tests with one timeline3 * 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_one_timeline_wait(void)33{34 int fence, valid, ret;35 int timeline = sw_sync_timeline_create();36 37 valid = sw_sync_timeline_is_valid(timeline);38 ASSERT(valid, "Failure allocating timeline\n");39 40 fence = sw_sync_fence_create(timeline, "allocFence", 5);41 valid = sw_sync_fence_is_valid(fence);42 ASSERT(valid, "Failure allocating fence\n");43 44 /* Wait on fence until timeout */45 ret = sync_wait(fence, 0);46 ASSERT(ret == 0, "Failure waiting on fence until timeout\n");47 48 /* Advance timeline from 0 -> 1 */49 ret = sw_sync_timeline_inc(timeline, 1);50 ASSERT(ret == 0, "Failure advancing timeline\n");51 52 /* Wait on fence until timeout */53 ret = sync_wait(fence, 0);54 ASSERT(ret == 0, "Failure waiting on fence until timeout\n");55 56 /* Signal the fence */57 ret = sw_sync_timeline_inc(timeline, 4);58 ASSERT(ret == 0, "Failure signaling the fence\n");59 60 /* Wait successfully */61 ret = sync_wait(fence, 0);62 ASSERT(ret > 0, "Failure waiting on fence\n");63 64 /* Go even further, and confirm wait still succeeds */65 ret = sw_sync_timeline_inc(timeline, 10);66 ASSERT(ret == 0, "Failure going further\n");67 ret = sync_wait(fence, 0);68 ASSERT(ret > 0, "Failure waiting ahead\n");69 70 sw_sync_fence_destroy(fence);71 sw_sync_timeline_destroy(timeline);72 73 return 0;74}75 76int test_fence_one_timeline_merge(void)77{78 int a, b, c, d, valid;79 int timeline = sw_sync_timeline_create();80 81 /* create fence a,b,c and then merge them all into fence d */82 a = sw_sync_fence_create(timeline, "allocFence", 1);83 b = sw_sync_fence_create(timeline, "allocFence", 2);84 c = sw_sync_fence_create(timeline, "allocFence", 3);85 86 valid = sw_sync_fence_is_valid(a) &&87 sw_sync_fence_is_valid(b) &&88 sw_sync_fence_is_valid(c);89 ASSERT(valid, "Failure allocating fences\n");90 91 d = sync_merge("mergeFence", b, a);92 d = sync_merge("mergeFence", c, d);93 valid = sw_sync_fence_is_valid(d);94 ASSERT(valid, "Failure merging fences\n");95 96 /* confirm all fences have one active point (even d) */97 ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,98 "a has too many active fences!\n");99 ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,100 "b has too many active fences!\n");101 ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,102 "c has too many active fences!\n");103 ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,104 "d has too many active fences!\n");105 106 /* confirm that d is not signaled until the max of a,b,c */107 sw_sync_timeline_inc(timeline, 1);108 ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_SIGNALED) == 1,109 "a did not signal!\n");110 ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1,111 "d signaled too early!\n");112 113 sw_sync_timeline_inc(timeline, 1);114 ASSERT(sync_fence_count_with_status(b, FENCE_STATUS_SIGNALED) == 1,115 "b did not signal!\n");116 ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1,117 "d signaled too early!\n");118 119 sw_sync_timeline_inc(timeline, 1);120 ASSERT(sync_fence_count_with_status(c, FENCE_STATUS_SIGNALED) == 1,121 "c did not signal!\n");122 ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 0 &&123 sync_fence_count_with_status(d, FENCE_STATUS_SIGNALED) == 1,124 "d did not signal!\n");125 126 sw_sync_fence_destroy(d);127 sw_sync_fence_destroy(c);128 sw_sync_fence_destroy(b);129 sw_sync_fence_destroy(a);130 sw_sync_timeline_destroy(timeline);131 return 0;132}133