1#!/bin/sh 2 3set -ex 4 5INSTALL=$(realpath -s "$PWD"/install) 6MINIO_ARGS="--credentials=/tmp/.minio_credentials" 7 8RESULTS=$(realpath -s "$PWD"/results) 9mkdir -p "$RESULTS" 10 11# Set up the driver environment. 12# Modifiying here directly LD_LIBRARY_PATH may cause problems when 13# using a command wrapper. Hence, we will just set it when running the 14# command. 15export __LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/" 16 17# Sanity check to ensure that our environment is sufficient to make our tests 18# run against the Mesa built by CI, rather than any installed distro version. 19MESA_VERSION=$(head -1 "$INSTALL/VERSION" | sed 's/\./\\./g') 20 21print_red() { 22 RED='\033[0;31m' 23 NC='\033[0m' # No Color 24 printf "${RED}" 25 "$@" 26 printf "${NC}" 27} 28 29# wrapper to supress +x to avoid spamming the log 30quiet() { 31 set +x 32 "$@" 33 set -x 34} 35 36if [ "$VK_DRIVER" ]; then 37 38 ### VULKAN ### 39 40 # Set the Vulkan driver to use. 41 export VK_ICD_FILENAMES="$INSTALL/share/vulkan/icd.d/${VK_DRIVER}_icd.x86_64.json" 42 43 if [ "x$PIGLIT_PROFILES" = "xreplay" ]; then 44 # Set environment for Wine. 45 export WINEDEBUG="-all" 46 export WINEPREFIX="/dxvk-wine64" 47 export WINEESYNC=1 48 49 # Set environment for DXVK. 50 export DXVK_LOG_LEVEL="none" 51 export DXVK_STATE_CACHE=0 52 53 # Set environment for gfxreconstruct executables. 54 export PATH="/gfxreconstruct/build/bin:$PATH" 55 fi 56 57 SANITY_MESA_VERSION_CMD="vulkaninfo" 58 59 HANG_DETECTION_CMD="/parallel-deqp-runner/build/bin/hang-detection" 60 61 62 # Set up the Window System Interface (WSI) 63 64 if [ ${TEST_START_XORG:-0} -eq 1 ]; then 65 "$INSTALL"/common/start-x.sh "$INSTALL" 66 export DISPLAY=:0 67 else 68 # Run vulkan against the host's running X server (xvfb doesn't 69 # have DRI3 support). 70 # Set the DISPLAY env variable in each gitlab-runner's 71 # configuration file: 72 # https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section 73 quiet printf "%s%s\n" "Running against the hosts' X server. " \ 74 "DISPLAY is \"$DISPLAY\"." 75 fi 76else 77 78 ### GL/ES ### 79 80 if [ "x$PIGLIT_PROFILES" = "xreplay" ]; then 81 # Set environment for apitrace executable. 82 export PATH="/apitrace/build:$PATH" 83 84 # Our rootfs may not have "less", which apitrace uses during 85 # apitrace dump 86 export PAGER=cat 87 fi 88 89 SANITY_MESA_VERSION_CMD="wflinfo" 90 91 HANG_DETECTION_CMD="" 92 93 94 # Set up the platform windowing system. 95 96 if [ "x$EGL_PLATFORM" = "xsurfaceless" ]; then 97 98 # Use the surfaceless EGL platform. 99 export DISPLAY= 100 export WAFFLE_PLATFORM="surfaceless_egl" 101 102 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform surfaceless_egl --api gles2" 103 104 if [ "x$GALLIUM_DRIVER" = "xvirpipe" ]; then 105 # piglit is to use virpipe, and virgl_test_server llvmpipe 106 export GALLIUM_DRIVER="$GALLIUM_DRIVER" 107 108 LD_LIBRARY_PATH="$__LD_LIBRARY_PATH" \ 109 GALLIUM_DRIVER=llvmpipe \ 110 GALLIVM_PERF="nopt" \ 111 VTEST_USE_EGL_SURFACELESS=1 \ 112 VTEST_USE_GLES=1 \ 113 virgl_test_server >"$RESULTS"/vtest-log.txt 2>&1 & 114 115 sleep 1 116 fi 117 elif [ "x$PIGLIT_PLATFORM" = "xgbm" ]; then 118 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform gbm --api gl" 119 elif [ "x$PIGLIT_PLATFORM" = "xmixed_glx_egl" ]; then 120 # It is assumed that you have already brought up your X server before 121 # calling this script. 122 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform glx --api gl" 123 else 124 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform glx --api gl --profile core" 125 RUN_CMD_WRAPPER="xvfb-run --server-args=\"-noreset\" sh -c" 126 fi 127fi 128 129if [ "$ZINK_USE_LAVAPIPE" ]; then 130 export VK_ICD_FILENAMES="$INSTALL/share/vulkan/icd.d/lvp_icd.x86_64.json" 131fi 132 133# If the job is parallel at the gitlab job level, will take the corresponding 134# fraction of the caselist. 135if [ -n "$CI_NODE_INDEX" ]; then 136 137 if [ "$PIGLIT_PROFILES" != "${PIGLIT_PROFILES% *}" ]; then 138 FAILURE_MESSAGE=$(printf "%s" "Can't parallelize piglit with multiple profiles") 139 quiet print_red printf "%s\n" "$FAILURE_MESSAGE" 140 exit 1 141 fi 142 143 USE_CASELIST=1 144fi 145 146replay_minio_upload_images() { 147 find "$RESULTS/$__PREFIX" -type f -name "*.png" -printf "%P\n" \ 148 | while read -r line; do 149 150 __TRACE="${line%-*-*}" 151 if grep -q "^$__PREFIX/$__TRACE: pass$" ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.orig"; then 152 if [ "x$CI_PROJECT_PATH" != "x$FDO_UPSTREAM_REPO" ]; then 153 continue 154 fi 155 __MINIO_PATH="$PIGLIT_REPLAY_REFERENCE_IMAGES_BASE" 156 __DESTINATION_FILE_PATH="${line##*-}" 157 if wget -q --method=HEAD "https://${__MINIO_PATH}/${__DESTINATION_FILE_PATH}" 2>/dev/null; then 158 continue 159 fi 160 else 161 __MINIO_PATH="$JOB_ARTIFACTS_BASE" 162 __DESTINATION_FILE_PATH="$__MINIO_TRACES_PREFIX/${line##*-}" 163 fi 164 165 ci-fairy minio cp $MINIO_ARGS "$RESULTS/$__PREFIX/$line" \ 166 "minio://${__MINIO_PATH}/${__DESTINATION_FILE_PATH}" 167 done 168} 169 170SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD | tee /tmp/version.txt | grep \"Mesa $MESA_VERSION\(\s\|$\)\"" 171 172if [ -d results ]; then 173 cd results && rm -rf ..?* .[!.]* * 174fi 175cd /piglit 176 177if [ -n "$USE_CASELIST" ]; then 178 PIGLIT_TESTS=$(printf "%s" "$PIGLIT_TESTS") 179 PIGLIT_GENTESTS="./piglit print-cmd $PIGLIT_TESTS $PIGLIT_PROFILES --format \"{name}\" > /tmp/case-list.txt" 180 RUN_GENTESTS="export LD_LIBRARY_PATH=$__LD_LIBRARY_PATH; $PIGLIT_GENTESTS" 181 182 eval $RUN_GENTESTS 183 184 sed -ni $CI_NODE_INDEX~$CI_NODE_TOTAL"p" /tmp/case-list.txt 185 186 PIGLIT_TESTS="--test-list /tmp/case-list.txt" 187fi 188 189PIGLIT_OPTIONS=$(printf "%s" "$PIGLIT_OPTIONS") 190 191PIGLIT_TESTS=$(printf "%s" "$PIGLIT_TESTS") 192 193PIGLIT_CMD="./piglit run --timeout 300 -j${FDO_CI_CONCURRENT:-4} $PIGLIT_OPTIONS $PIGLIT_TESTS $PIGLIT_PROFILES "$(/usr/bin/printf "%q" "$RESULTS") 194 195RUN_CMD="export LD_LIBRARY_PATH=$__LD_LIBRARY_PATH; $SANITY_MESA_VERSION_CMD && $HANG_DETECTION_CMD $PIGLIT_CMD" 196 197if [ "$RUN_CMD_WRAPPER" ]; then 198 RUN_CMD="set +e; $RUN_CMD_WRAPPER "$(/usr/bin/printf "%q" "$RUN_CMD")"; set -e" 199fi 200 201FAILURE_MESSAGE=$(printf "%s" "Unexpected change in results:") 202 203if [ "x$PIGLIT_PROFILES" = "xreplay" ] \ 204 && [ ${PIGLIT_REPLAY_UPLOAD_TO_MINIO:-0} -eq 1 ]; then 205 ci-fairy minio login $MINIO_ARGS $CI_JOB_JWT 206fi 207 208eval $RUN_CMD 209 210if [ $? -ne 0 ]; then 211 printf "%s\n" "Found $(cat /tmp/version.txt), expected $MESA_VERSION" 212fi 213 214ARTIFACTS_BASE_URL="https://${CI_PROJECT_ROOT_NAMESPACE}.${CI_PAGES_DOMAIN}/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts" 215 216if [ ${PIGLIT_JUNIT_RESULTS:-0} -eq 1 ]; then 217 ./piglit summary aggregate "$RESULTS" -o junit.xml 218 FAILURE_MESSAGE=$(printf "${FAILURE_MESSAGE}\n%s" "Check the JUnit report for failures at: ${ARTIFACTS_BASE_URL}/results/junit.xml") 219fi 220 221PIGLIT_RESULTS="${PIGLIT_RESULTS:-$PIGLIT_PROFILES}" 222RESULTSFILE="$RESULTS/$PIGLIT_RESULTS.txt" 223mkdir -p .gitlab-ci/piglit 224./piglit summary console "$RESULTS"/results.json.bz2 \ 225 | tee ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.orig" \ 226 | head -n -1 | grep -v ": pass" \ 227 | sed '/^summary:/Q' \ 228 > $RESULTSFILE 229 230if [ "x$PIGLIT_PROFILES" = "xreplay" ] \ 231 && [ ${PIGLIT_REPLAY_UPLOAD_TO_MINIO:-0} -eq 1 ]; then 232 233 __PREFIX="trace/$PIGLIT_REPLAY_DEVICE_NAME" 234 __MINIO_PATH="$PIGLIT_REPLAY_ARTIFACTS_BASE_URL" 235 __MINIO_TRACES_PREFIX="traces" 236 237 if [ "x$PIGLIT_REPLAY_SUBCOMMAND" != "xprofile" ]; then 238 quiet replay_minio_upload_images 239 fi 240fi 241 242if [ -n "$USE_CASELIST" ]; then 243 # Just filter the expected results based on the tests that were actually 244 # executed, and switch to the version with no summary 245 cat ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.orig" | sed '/^summary:/Q' | rev \ 246 | cut -f2- -d: | rev | sed "s/$/:/g" > /tmp/executed.txt 247 248 grep -F -f /tmp/executed.txt "$INSTALL/$PIGLIT_RESULTS.txt" \ 249 > ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.baseline" || true 250elif [ -f "$INSTALL/$PIGLIT_RESULTS.txt" ]; then 251 cp "$INSTALL/$PIGLIT_RESULTS.txt" \ 252 ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.baseline" 253else 254 touch ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.baseline" 255fi 256 257if diff -q ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.baseline" $RESULTSFILE; then 258 exit 0 259fi 260 261./piglit summary html --exclude-details=pass \ 262"$RESULTS"/summary "$RESULTS"/results.json.bz2 263 264if [ "x$PIGLIT_PROFILES" = "xreplay" ]; then 265find "$RESULTS"/summary -type f -name "*.html" -print0 \ 266 | xargs -0 sed -i 's%<img src="file://'"${RESULTS}"'.*-\([0-9a-f]*\)\.png%<img src="https://'"${JOB_ARTIFACTS_BASE}"'/traces/\1.png%g' 267find "$RESULTS"/summary -type f -name "*.html" -print0 \ 268 | xargs -0 sed -i 's%<img src="file://%<img src="https://'"${PIGLIT_REPLAY_REFERENCE_IMAGES_BASE}"'/%g' 269fi 270 271FAILURE_MESSAGE=$(printf "${FAILURE_MESSAGE}\n%s" "Check the HTML summary for problems at: ${ARTIFACTS_BASE_URL}/results/summary/problems.html") 272 273quiet print_red printf "%s\n" "$FAILURE_MESSAGE" 274quiet diff --color=always -u ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.baseline" $RESULTSFILE 275exit 1 276