2023-04-16 00:49:40 +01:00
#!/usr/bin/env bash
2023-05-20 23:47:05 +01:00
# shellcheck disable=SC2086 # we want word splitting
2019-06-29 00:35:32 +01:00
2022-12-11 16:46:41 +00:00
section_start test_setup "deqp: preparing test setup"
2022-03-10 20:53:22 +00:00
2019-06-29 00:35:32 +01:00
set -ex
2021-09-08 06:38:59 +01:00
# Needed so configuration files can contain paths to files in /install
2023-04-16 00:49:40 +01:00
ln -sf " $CI_PROJECT_DIR " /install /install
2021-09-08 06:38:59 +01:00
2020-12-17 19:08:42 +00:00
if [ -z " $GPU_VERSION " ] ; then
2021-10-25 18:27:10 +01:00
echo 'GPU_VERSION must be set to something like "llvmpipe" or "freedreno-a630" (the name used in .gitlab-ci/gpu-version-*.txt)'
2019-06-29 00:35:32 +01:00
exit 1
fi
2023-04-16 00:49:40 +01:00
INSTALL = $( realpath -s " $PWD " /install)
2019-06-29 00:35:32 +01:00
# Set up the driver environment.
2023-04-24 17:39:09 +01:00
export LD_LIBRARY_PATH = " $INSTALL " /lib/:$LD_LIBRARY_PATH
2019-06-29 00:35:32 +01:00
export EGL_PLATFORM = surfaceless
2023-04-16 00:49:40 +01:00
export VK_ICD_FILENAMES = " $PWD " /install/share/vulkan/icd.d/" $VK_DRIVER " _icd.${ VK_CPU :- $( uname -m) } .json
export OCL_ICD_VENDORS = " $PWD " /install/etc/OpenCL/vendors/
2019-06-29 00:35:32 +01:00
2023-04-16 00:49:40 +01:00
RESULTS = " $PWD / ${ DEQP_RESULTS_DIR :- results } "
mkdir -p " $RESULTS "
2019-06-29 00:35:32 +01:00
2022-02-07 09:43:57 +00:00
# Ensure Mesa Shader Cache resides on tmpfs.
2022-03-14 17:50:26 +00:00
SHADER_CACHE_HOME = ${ XDG_CACHE_HOME :- ${ HOME } /.cache }
SHADER_CACHE_DIR = ${ MESA_SHADER_CACHE_DIR :- ${ SHADER_CACHE_HOME } /mesa_shader_cache }
2022-02-07 09:43:57 +00:00
2022-03-14 17:50:26 +00:00
findmnt -n tmpfs ${ SHADER_CACHE_HOME } || findmnt -n tmpfs ${ SHADER_CACHE_DIR } || {
mkdir -p ${ SHADER_CACHE_DIR }
mount -t tmpfs -o nosuid,nodev,size= 2G,mode= 1755 tmpfs ${ SHADER_CACHE_DIR }
2022-02-07 09:43:57 +00:00
}
2021-07-21 21:12:29 +01:00
if [ -z " $DEQP_SUITE " ] ; then
2021-10-14 22:05:20 +01:00
if [ -z " $DEQP_VER " ] ; then
echo 'DEQP_SUITE must be set to the name of your deqp-gpu_version.toml, or DEQP_VER must be set to something like "gles2", "gles31-khr" or "vk" for the test run'
exit 1
fi
DEQP_WIDTH = ${ DEQP_WIDTH :- 256 }
DEQP_HEIGHT = ${ DEQP_HEIGHT :- 256 }
DEQP_CONFIG = ${ DEQP_CONFIG :- rgba8888d24s8ms0 }
DEQP_VARIANT = ${ DEQP_VARIANT :- master }
DEQP_OPTIONS = " $DEQP_OPTIONS --deqp-surface-width= $DEQP_WIDTH --deqp-surface-height= $DEQP_HEIGHT "
DEQP_OPTIONS = " $DEQP_OPTIONS --deqp-surface-type= ${ DEQP_SURFACE_TYPE :- pbuffer } "
DEQP_OPTIONS = " $DEQP_OPTIONS --deqp-gl-config-name= $DEQP_CONFIG "
DEQP_OPTIONS = " $DEQP_OPTIONS --deqp-visibility=hidden "
2023-05-20 23:47:05 +01:00
if [ " $DEQP_VER " = "vk" ] && [ -z " $VK_DRIVER " ] ; then
2021-10-14 22:05:20 +01:00
echo 'VK_DRIVER must be to something like "radeon" or "intel" for the test run'
exit 1
fi
2021-10-12 00:27:25 +01:00
# Generate test case list file.
if [ " $DEQP_VER " = "vk" ] ; then
MUSTPASS = /deqp/mustpass/vk-$DEQP_VARIANT .txt
DEQP = /deqp/external/vulkancts/modules/vulkan/deqp-vk
2023-05-20 23:47:05 +01:00
elif [ " $DEQP_VER " = "gles2" ] || [ " $DEQP_VER " = "gles3" ] || [ " $DEQP_VER " = "gles31" ] || [ " $DEQP_VER " = "egl" ] ; then
2021-10-12 00:27:25 +01:00
MUSTPASS = /deqp/mustpass/$DEQP_VER -$DEQP_VARIANT .txt
DEQP = /deqp/modules/$DEQP_VER /deqp-$DEQP_VER
2023-05-20 23:47:05 +01:00
elif [ " $DEQP_VER " = "gles2-khr" ] || [ " $DEQP_VER " = "gles3-khr" ] || [ " $DEQP_VER " = "gles31-khr" ] || [ " $DEQP_VER " = "gles32-khr" ] ; then
2021-10-12 00:27:25 +01:00
MUSTPASS = /deqp/mustpass/$DEQP_VER -$DEQP_VARIANT .txt
DEQP = /deqp/external/openglcts/modules/glcts
else
MUSTPASS = /deqp/mustpass/$DEQP_VER -$DEQP_VARIANT .txt
DEQP = /deqp/external/openglcts/modules/glcts
fi
2021-07-21 21:12:29 +01:00
cp $MUSTPASS /tmp/case-list.txt
2020-11-06 23:55:24 +00:00
2021-07-21 21:12:29 +01:00
# If the caselist is too long to run in a reasonable amount of time, let the job
# specify what fraction (1/n) of the caselist we should run. Note: N~M is a gnu
# sed extension to match every nth line (first line is #1).
if [ -n " $DEQP_FRACTION " ] ; then
sed -ni 1~$DEQP_FRACTION "p" /tmp/case-list.txt
fi
2019-06-29 00:35:32 +01:00
2021-07-21 21:12:29 +01:00
# If the job is parallel at the gitab job level, take the corresponding fraction
# of the caselist.
if [ -n " $CI_NODE_INDEX " ] ; then
sed -ni $CI_NODE_INDEX ~$CI_NODE_TOTAL "p" /tmp/case-list.txt
fi
2020-04-17 20:02:37 +01:00
2021-07-21 21:12:29 +01:00
if [ ! -s /tmp/case-list.txt ] ; then
echo "Caselist generation failed"
exit 1
fi
2019-06-29 00:35:32 +01:00
fi
2021-10-25 18:27:10 +01:00
if [ -e " $INSTALL / $GPU_VERSION -fails.txt " ] ; then
DEQP_RUNNER_OPTIONS = " $DEQP_RUNNER_OPTIONS --baseline $INSTALL / $GPU_VERSION -fails.txt "
2020-10-29 17:29:28 +00:00
fi
2021-05-26 18:45:33 +01:00
# Default to an empty known flakes file if it doesn't exist.
2021-10-25 18:27:10 +01:00
touch $INSTALL /$GPU_VERSION -flakes.txt
2020-12-17 19:08:42 +00:00
2021-06-16 15:59:15 +01:00
2021-10-25 18:27:10 +01:00
if [ -n " $VK_DRIVER " ] && [ -e " $INSTALL / $VK_DRIVER -skips.txt " ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL / $VK_DRIVER -skips.txt "
2021-06-16 15:59:15 +01:00
fi
2021-10-25 18:27:10 +01:00
if [ -n " $GALLIUM_DRIVER " ] && [ -e " $INSTALL / $GALLIUM_DRIVER -skips.txt " ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL / $GALLIUM_DRIVER -skips.txt "
2021-06-16 15:59:15 +01:00
fi
2021-10-25 18:27:10 +01:00
if [ -n " $DRIVER_NAME " ] && [ -e " $INSTALL / $DRIVER_NAME -skips.txt " ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL / $DRIVER_NAME -skips.txt "
2021-06-16 15:59:15 +01:00
fi
2021-10-25 18:27:10 +01:00
if [ -e " $INSTALL / $GPU_VERSION -skips.txt " ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL / $GPU_VERSION -skips.txt "
2019-06-29 00:35:32 +01:00
fi
2023-01-03 20:25:19 +00:00
if [ " $PIGLIT_PLATFORM " != "gbm" ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL /x11-skips.txt "
fi
2023-01-19 20:18:58 +00:00
if [ " $PIGLIT_PLATFORM " = "gbm" ] ; then
DEQP_SKIPS = " $DEQP_SKIPS $INSTALL /gbm-skips.txt "
fi
2023-04-05 20:31:51 +01:00
# Set the path to VK validation layer settings (in case it ends up getting loaded)
export VK_LAYER_SETTINGS_PATH = $INSTALL /$GPU_VERSION -validation-settings.txt
2020-12-21 19:25:10 +00:00
report_load( ) {
echo " System load: $( cut -d' ' -f1-3 < /proc/loadavg) "
2023-05-20 23:47:05 +01:00
echo " # of CPU cores: $( grep -c processor /proc/cpuinfo) "
2020-12-21 19:25:10 +00:00
}
2020-04-01 08:17:25 +01:00
if [ " $GALLIUM_DRIVER " = "virpipe" ] ; then
# deqp is to use virpipe, and virgl_test_server llvmpipe
export GALLIUM_DRIVER = " $GALLIUM_DRIVER "
2020-05-12 09:18:48 +01:00
VTEST_ARGS = "--use-egl-surfaceless"
if [ " $VIRGL_HOST_API " = "GLES" ] ; then
VTEST_ARGS = " $VTEST_ARGS --use-gles "
fi
2020-04-01 08:17:25 +01:00
GALLIUM_DRIVER = llvmpipe \
2020-05-12 09:18:48 +01:00
virgl_test_server $VTEST_ARGS >$RESULTS /vtest-log.txt 2>& 1 &
2020-04-01 08:17:25 +01:00
sleep 1
fi
2021-07-21 21:12:29 +01:00
if [ -z " $DEQP_SUITE " ] ; then
2021-10-12 00:27:25 +01:00
if [ -n " $DEQP_EXPECTED_RENDERER " ] ; then
2023-05-20 23:47:05 +01:00
export DEQP_RUNNER_OPTIONS = " $DEQP_RUNNER_OPTIONS --renderer-check $DEQP_EXPECTED_RENDERER "
2021-10-12 00:27:25 +01:00
fi
2023-05-20 23:47:05 +01:00
if [ $DEQP_VER != vk ] && [ $DEQP_VER != egl ] ; then
VER = $( sed 's/[() ]/./g' " $INSTALL /VERSION " )
export DEQP_RUNNER_OPTIONS = " $DEQP_RUNNER_OPTIONS --version-check $VER "
2021-10-12 00:27:25 +01:00
fi
2022-03-10 20:53:22 +00:00
fi
2022-12-11 16:46:41 +00:00
uncollapsed_section_switch deqp "deqp: deqp-runner"
2021-10-12 00:27:25 +01:00
2022-03-10 20:56:17 +00:00
set +e
2022-03-10 20:53:22 +00:00
if [ -z " $DEQP_SUITE " ] ; then
2021-07-21 21:12:29 +01:00
deqp-runner \
run \
--deqp $DEQP \
--output $RESULTS \
--caselist /tmp/case-list.txt \
2021-10-25 18:27:10 +01:00
--skips $INSTALL /all-skips.txt $DEQP_SKIPS \
--flakes $INSTALL /$GPU_VERSION -flakes.txt \
2021-07-21 21:12:29 +01:00
--testlog-to-xml /deqp/executor/testlog-to-xml \
2021-10-12 00:03:47 +01:00
--jobs ${ FDO_CI_CONCURRENT :- 4 } \
2021-07-21 21:12:29 +01:00
$DEQP_RUNNER_OPTIONS \
-- \
$DEQP_OPTIONS
else
deqp-runner \
suite \
--suite $INSTALL /deqp-$DEQP_SUITE .toml \
--output $RESULTS \
2021-10-25 18:27:10 +01:00
--skips $INSTALL /all-skips.txt $DEQP_SKIPS \
--flakes $INSTALL /$GPU_VERSION -flakes.txt \
2021-07-21 21:12:29 +01:00
--testlog-to-xml /deqp/executor/testlog-to-xml \
--fraction-start $CI_NODE_INDEX \
2023-05-20 23:47:05 +01:00
--fraction $(( CI_NODE_TOTAL * ${ DEQP_FRACTION :- 1 } )) \
2021-10-12 00:03:47 +01:00
--jobs ${ FDO_CI_CONCURRENT :- 4 } \
2021-07-21 21:12:29 +01:00
$DEQP_RUNNER_OPTIONS
fi
ci: Use cts_runner for our dEQP runs.
This runner is a little project by Bas, written in C++, that spawns
threads that then loop grabbing chunks of the (randomly shuffled but
consistently so) test list and hand it to a dEQP instance. As the
remaining list gets shorter, so do the chunks, so hopefully the
threads all complete effectively at once. It also handles restarting
after crashes automatically. I've extended the runner a bit to do
what I was doing in the bash scripts before, like the skip list and
expected failures handling. This project should also be a good
baseline for extending to handle retesting of intermittent failures.
By switching to it, we can have the swrast tests just take up one job
slot on the shared runners and keep their allotment of CPUs busy,
instead of taking up job slots with single-threaded dEQP jobs. It
will also let us (eventually, once I reprovision) switch the freedreno
runners over to threading within the job instead of running concurrent
jobs, so that memory scribbles in one pipeline don't affect unrelated
pipelines, and I can experiment with their parallelism (particularly
on a306 where we are frequently backed up) without trashing other
people's jobs.
What we lose in this process is per-test output in the log (not a big
loss, I think, since we summarize fails at the end and reducing log
length keeps chrome from choking on our logs so badly). We also drop
the renderer sanity checking, since it's not saving qpa files for us
to go poke through. Given that all the drivers involved have fail
lists, if we got the wrong renderer somehow, we'd get a job failure
anyway.
v2: Rebase on droppong of the autoscale cluster and the arm64
build/test split. Use a script to deduplicate the cts-runner
build.
v3: Rebase on the amd64 build/test container split.
Acked-by: Daniel Stone <daniels@collabora.com> (v1)
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> (v2)
2019-11-04 18:54:41 +00:00
DEQP_EXITCODE = $?
2019-08-26 20:57:16 +01:00
2022-03-10 20:53:22 +00:00
set +x
report_load
2022-12-11 16:46:41 +00:00
section_switch test_post_process "deqp: post-processing test results"
2022-03-10 20:53:22 +00:00
set -x
2020-07-28 07:22:34 +01:00
2020-12-19 00:47:51 +00:00
# Remove all but the first 50 individual XML files uploaded as artifacts, to
# save fd.o space when you break everything.
find $RESULTS -name \* .xml | \
sort -n |
sed -n '1,+49!p' | \
xargs rm -f
# If any QPA XMLs are there, then include the XSL/CSS in our artifacts.
find $RESULTS -name \* .xml \
-exec cp /deqp/testlog.css /deqp/testlog.xsl " $RESULTS / " ";" \
-quit
2021-10-14 22:02:40 +01:00
deqp-runner junit \
2021-10-12 00:27:25 +01:00
--testsuite dEQP \
2020-12-19 00:47:51 +00:00
--results $RESULTS /failures.csv \
--output $RESULTS /junit.xml \
--limit 50 \
2021-03-25 02:46:39 +00:00
--template " See https:// $CI_PROJECT_ROOT_NAMESPACE .pages.freedesktop.org/-/ $CI_PROJECT_NAME /-/jobs/ $CI_JOB_ID /artifacts/results/{{testcase}}.xml "
2019-11-17 19:16:09 +00:00
2020-10-29 17:29:28 +00:00
# Report the flakes to the IRC channel for monitoring (if configured):
2021-05-26 18:45:33 +01:00
if [ -n " $FLAKES_CHANNEL " ] ; then
python3 $INSTALL /report-flakes.py \
2021-05-26 22:13:47 +01:00
--host irc.oftc.net \
2021-05-26 18:45:33 +01:00
--port 6667 \
2021-10-12 18:37:43 +01:00
--results $RESULTS /results.csv \
2021-10-25 18:27:10 +01:00
--known-flakes $INSTALL /$GPU_VERSION -flakes.txt \
2021-05-26 18:45:33 +01:00
--channel " $FLAKES_CHANNEL " \
--runner " $CI_RUNNER_DESCRIPTION " \
--job " $CI_JOB_ID " \
--url " $CI_JOB_URL " \
--branch " ${ CI_MERGE_REQUEST_SOURCE_BRANCH_NAME :- $CI_COMMIT_BRANCH } " \
--branch-title " ${ CI_MERGE_REQUEST_TITLE :- $CI_COMMIT_TITLE } "
fi
2020-10-29 17:29:28 +00:00
2023-01-12 11:49:02 +00:00
# Compress results.csv to save on bandwidth during the upload of artifacts to
# GitLab. This reduces the size in a VKCTS run from 135 to 7.6MB, and takes
# 0.17s on a Ryzen 5950X (16 threads, 0.95s when limited to 1 thread).
zstd --rm -T0 -8qc $RESULTS /results.csv -o $RESULTS /results.csv.zst
2022-12-11 16:46:41 +00:00
section_end test_post_process
2022-03-10 20:53:22 +00:00
2019-11-17 19:16:09 +00:00
exit $DEQP_EXITCODE