1#!/usr/bin/env bash 2# shellcheck disable=SC2035 # FIXME glob 3# shellcheck disable=SC2086 # we want word splitting 4 5set -ex 6 7# Our rootfs may not have "less", which apitrace uses during apitrace dump 8export PAGER=cat # FIXME: export everywhere 9 10INSTALL=$(realpath -s "$PWD"/install) 11S3_ARGS="--token-file ${CI_JOB_JWT_FILE}" 12 13RESULTS=$(realpath -s "$PWD"/results) 14mkdir -p "$RESULTS" 15 16export PIGLIT_REPLAY_DESCRIPTION_FILE="$INSTALL/$PIGLIT_TRACES_FILE" 17 18# FIXME: guess why /usr/local/bin is not included in all runners PATH. 19# Needed because yq and ci-fairy are installed there. 20PATH="/usr/local/bin:$PATH" 21 22if [ "$PIGLIT_REPLAY_SUBCOMMAND" = "profile" ]; then 23 yq -iY 'del(.traces[][] | select(.label[]? == "no-perf"))' \ 24 "$PIGLIT_REPLAY_DESCRIPTION_FILE" 25else 26 # keep the images for the later upload 27 export PIGLIT_REPLAY_EXTRA_ARGS="--keep-image ${PIGLIT_REPLAY_EXTRA_ARGS}" 28fi 29 30# WINE 31case "$PIGLIT_REPLAY_DEVICE_NAME" in 32 vk-*) 33 export WINEPREFIX="/dxvk-wine64" 34 ;; 35 *) 36 export WINEPREFIX="/generic-wine64" 37 ;; 38esac 39 40#PATH="/opt/wine-stable/bin/:$PATH" # WineHQ path 41 42# Avoid asking about Gecko or Mono instalation 43export WINEDLLOVERRIDES="mscoree=d;mshtml=d" # FIXME: drop, not needed anymore? (wine dir is already created) 44 45 46# Set up the environment. 47# Modifiying here directly LD_LIBRARY_PATH may cause problems when 48# using a command wrapper. Hence, we will just set it when running the 49# command. 50export __LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/" 51if [ -n "${VK_DRIVER}" ]; then 52 # Set environment for DXVK. 53 export DXVK_LOG_LEVEL="info" 54 export DXVK_LOG="$RESULTS/dxvk" 55 [ -d "$DXVK_LOG" ] || mkdir -pv "$DXVK_LOG" 56 export DXVK_STATE_CACHE=0 57 export VK_ICD_FILENAMES="$INSTALL/share/vulkan/icd.d/${VK_DRIVER}_icd.${VK_CPU:-$(uname -m)}.json" 58fi 59 60# Sanity check to ensure that our environment is sufficient to make our tests 61# run against the Mesa built by CI, rather than any installed distro version. 62MESA_VERSION=$(head -1 "$INSTALL/VERSION" | sed 's/\./\\./g') 63 64# wrapper to supress +x to avoid spamming the log 65quiet() { 66 set +x 67 "$@" 68 set -x 69} 70 71# Set environment for apitrace executable. 72export PATH="/apitrace/build:$PATH" 73export PIGLIT_REPLAY_WINE_BINARY=wine 74export PIGLIT_REPLAY_WINE_APITRACE_BINARY="/apitrace-msvc-win64/bin/apitrace.exe" 75export PIGLIT_REPLAY_WINE_D3DRETRACE_BINARY="/apitrace-msvc-win64/bin/d3dretrace.exe" 76 77echo "Version:" 78apitrace version 2>/dev/null || echo "apitrace not found (Linux)" 79 80SANITY_MESA_VERSION_CMD="wflinfo" 81 82HANG_DETECTION_CMD="" 83 84# Set up the platform windowing system. 85if [ "$EGL_PLATFORM" = "surfaceless" ]; then 86 # Use the surfaceless EGL platform. 87 export DISPLAY= 88 export WAFFLE_PLATFORM="surfaceless_egl" 89 90 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform surfaceless_egl --api gles2" 91 92 if [ "$GALLIUM_DRIVER" = "virpipe" ]; then 93 # piglit is to use virpipe, and virgl_test_server llvmpipe 94 export GALLIUM_DRIVER="$GALLIUM_DRIVER" 95 96 LD_LIBRARY_PATH="$__LD_LIBRARY_PATH" \ 97 GALLIUM_DRIVER=llvmpipe \ 98 VTEST_USE_EGL_SURFACELESS=1 \ 99 VTEST_USE_GLES=1 \ 100 virgl_test_server >"$RESULTS"/vtest-log.txt 2>&1 & 101 102 sleep 1 103 fi 104elif [ "$PIGLIT_PLATFORM" = "gbm" ]; then 105 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform gbm --api gl" 106elif [ "$PIGLIT_PLATFORM" = "mixed_glx_egl" ]; then 107 # It is assumed that you have already brought up your X server before 108 # calling this script. 109 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform glx --api gl" 110else 111 SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD --platform glx --api gl --profile core" 112 # copy-paste from init-stage2.sh, please update accordingly 113 { 114 WESTON_X11_SOCK="/tmp/.X11-unix/X0" 115 export WAYLAND_DISPLAY=wayland-0 116 export DISPLAY=:0 117 mkdir -p /tmp/.X11-unix 118 119 env \ 120 VK_ICD_FILENAMES="/install/share/vulkan/icd.d/${VK_DRIVER}_icd.$(uname -m).json" \ 121 weston -Bheadless-backend.so --use-gl -Swayland-0 --xwayland --idle-time=0 & 122 123 while [ ! -S "$WESTON_X11_SOCK" ]; do sleep 1; done 124 } 125fi 126 127# If the job is parallel at the gitlab job level, will take the corresponding 128# fraction of the caselist. 129if [ -n "$CI_NODE_INDEX" ]; then 130 USE_CASELIST=1 131fi 132 133# shellcheck disable=SC2317 134replay_s3_upload_images() { 135 find "$RESULTS/$__PREFIX" -type f -name "*.png" -printf "%P\n" \ 136 | while read -r line; do 137 138 __TRACE="${line%-*-*}" 139 if grep -q "^$__PREFIX/$__TRACE: pass$" ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.orig"; then 140 if [ "x$CI_PROJECT_PATH" != "x$FDO_UPSTREAM_REPO" ]; then 141 continue 142 fi 143 __S3_PATH="$PIGLIT_REPLAY_REFERENCE_IMAGES_BASE" 144 __DESTINATION_FILE_PATH="${line##*-}" 145 if curl -L -s -I "https://${__S3_PATH}/${__DESTINATION_FILE_PATH}" | grep -q "content-type: application/octet-stream" 2>/dev/null; then 146 continue 147 fi 148 else 149 __S3_PATH="$JOB_ARTIFACTS_BASE" 150 __DESTINATION_FILE_PATH="$__S3_TRACES_PREFIX/${line##*-}" 151 fi 152 153 ci-fairy s3cp $S3_ARGS "$RESULTS/$__PREFIX/$line" \ 154 "https://${__S3_PATH}/${__DESTINATION_FILE_PATH}" 155 done 156} 157 158SANITY_MESA_VERSION_CMD="$SANITY_MESA_VERSION_CMD | tee /tmp/version.txt | grep \"Mesa $MESA_VERSION\(\s\|$\)\"" 159 160if [ -d results ]; then 161 cd results && rm -rf ..?* .[!.]* * 162fi 163cd /piglit 164 165if [ -n "$USE_CASELIST" ]; then 166 PIGLIT_TESTS=$(printf "%s" "$PIGLIT_TESTS") 167 PIGLIT_GENTESTS="./piglit print-cmd $PIGLIT_TESTS replay --format \"{name}\" > /tmp/case-list.txt" 168 RUN_GENTESTS="export LD_LIBRARY_PATH=$__LD_LIBRARY_PATH; $PIGLIT_GENTESTS" 169 170 eval $RUN_GENTESTS 171 172 sed -ni $CI_NODE_INDEX~$CI_NODE_TOTAL"p" /tmp/case-list.txt 173 174 PIGLIT_TESTS="--test-list /tmp/case-list.txt" 175fi 176 177PIGLIT_OPTIONS=$(printf "%s" "$PIGLIT_OPTIONS") 178 179PIGLIT_TESTS=$(printf "%s" "$PIGLIT_TESTS") 180 181PIGLIT_CMD="./piglit run -l verbose --timeout 300 -j${FDO_CI_CONCURRENT:-4} $PIGLIT_OPTIONS $PIGLIT_TESTS replay "$(/usr/bin/printf "%q" "$RESULTS") 182 183RUN_CMD="export LD_LIBRARY_PATH=$__LD_LIBRARY_PATH; $SANITY_MESA_VERSION_CMD && $HANG_DETECTION_CMD $PIGLIT_CMD" 184 185# The replayer doesn't do any size or checksum verification for the traces in 186# the replayer db, so if we had to restart the system due to intermittent device 187# errors (or tried to cache replayer-db between runs, which would be nice to 188# have), you could get a corrupted local trace that would spuriously fail the 189# run. 190rm -rf replayer-db 191 192if ! eval $RUN_CMD; 193then 194 printf "%s\n" "Found $(cat /tmp/version.txt), expected $MESA_VERSION" 195fi 196 197./piglit summary aggregate "$RESULTS" -o junit.xml 198 199PIGLIT_RESULTS="${PIGLIT_RESULTS:-replay}" 200RESULTSFILE="$RESULTS/$PIGLIT_RESULTS.txt" 201mkdir -p .gitlab-ci/piglit 202./piglit summary console "$RESULTS"/results.json.bz2 \ 203 | tee ".gitlab-ci/piglit/$PIGLIT_RESULTS.txt.orig" \ 204 | head -n -1 | grep -v ": pass" \ 205 | sed '/^summary:/Q' \ 206 > $RESULTSFILE 207 208__PREFIX="trace/$PIGLIT_REPLAY_DEVICE_NAME" 209__S3_PATH="$PIGLIT_REPLAY_ARTIFACTS_BASE_URL" 210__S3_TRACES_PREFIX="traces" 211 212if [ "$PIGLIT_REPLAY_SUBCOMMAND" != "profile" ]; then 213 quiet replay_s3_upload_images 214fi 215 216 217if [ ! -s $RESULTSFILE ]; then 218 exit 0 219fi 220 221./piglit summary html --exclude-details=pass \ 222"$RESULTS"/summary "$RESULTS"/results.json.bz2 223 224find "$RESULTS"/summary -type f -name "*.html" -print0 \ 225 | xargs -0 sed -i 's%<img src="file://'"${RESULTS}"'.*-\([0-9a-f]*\)\.png%<img src="https://'"${JOB_ARTIFACTS_BASE}"'/traces/\1.png%g' 226find "$RESULTS"/summary -type f -name "*.html" -print0 \ 227 | xargs -0 sed -i 's%<img src="file://%<img src="https://'"${PIGLIT_REPLAY_REFERENCE_IMAGES_BASE}"'/%g' 228 229echo "Failures in traces:" 230cat $RESULTSFILE 231error echo "Review the image changes and get the new checksums at: ${ARTIFACTS_BASE_URL}/results/summary/problems.html " 232exit 1 233