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