• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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