summaryrefslogtreecommitdiff
path: root/lib/mesa/.gitlab-ci/skqp-runner.sh
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mesa/.gitlab-ci/skqp-runner.sh')
-rwxr-xr-xlib/mesa/.gitlab-ci/skqp-runner.sh153
1 files changed, 153 insertions, 0 deletions
diff --git a/lib/mesa/.gitlab-ci/skqp-runner.sh b/lib/mesa/.gitlab-ci/skqp-runner.sh
new file mode 100755
index 000000000..68aca2d33
--- /dev/null
+++ b/lib/mesa/.gitlab-ci/skqp-runner.sh
@@ -0,0 +1,153 @@
+#!/bin/sh
+#
+# Copyright (C) 2022 Collabora Limited
+# Author: Guilherme Gallo <guilherme.gallo@collabora.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+copy_tests_files() (
+ # Copy either unit test or render test files from a specific driver given by
+ # GPU VERSION variable.
+ # If there is no test file at the expected location, this function will
+ # return error_code 1
+ SKQP_BACKEND="${1}"
+ SKQP_FILE_PREFIX="${INSTALL}/${GPU_VERSION}-skqp"
+
+ if echo "${SKQP_BACKEND}" | grep -qE 'vk|gl(es)?'
+ then
+ SKQP_RENDER_TESTS_FILE="${SKQP_FILE_PREFIX}-${SKQP_BACKEND}_rendertests.txt"
+ [ -f "${SKQP_RENDER_TESTS_FILE}" ] || return 1
+ cp "${SKQP_RENDER_TESTS_FILE}" "${SKQP_ASSETS_DIR}"/skqp/rendertests.txt
+ return 0
+ fi
+
+ # The unittests.txt path is hardcoded inside assets directory,
+ # that is why it needs to be a special case.
+ if echo "${SKQP_BACKEND}" | grep -qE "unitTest"
+ then
+ SKQP_UNIT_TESTS_FILE="${SKQP_FILE_PREFIX}_unittests.txt"
+ [ -f "${SKQP_UNIT_TESTS_FILE}" ] || return 1
+ cp "${SKQP_UNIT_TESTS_FILE}" "${SKQP_ASSETS_DIR}"/skqp/unittests.txt
+ fi
+)
+
+test_vk_backend() {
+ if echo "${SKQP_BACKENDS}" | grep -qE 'vk'
+ then
+ if [ -n "$VK_DRIVER" ]; then
+ return 0
+ fi
+
+ echo "VK_DRIVER environment variable is missing."
+ VK_DRIVERS=$(ls "$INSTALL"/share/vulkan/icd.d/ | cut -f 1 -d '_')
+ if [ -n "${VK_DRIVERS}" ]
+ then
+ echo "Please set VK_DRIVER to the correct driver from the list:"
+ echo "${VK_DRIVERS}"
+ fi
+ echo "No Vulkan tests will be executed, but it was requested in SKQP_BACKENDS variable. Exiting."
+ exit 2
+ fi
+
+ # Vulkan environment is not configured, but it was not requested by the job
+ return 1
+}
+
+setup_backends() {
+ if test_vk_backend
+ then
+ export VK_ICD_FILENAMES="$INSTALL"/share/vulkan/icd.d/"$VK_DRIVER"_icd."${VK_CPU:-$(uname -m)}".json
+ fi
+}
+
+set -ex
+
+# Needed so configuration files can contain paths to files in /install
+ln -sf "$CI_PROJECT_DIR"/install /install
+INSTALL=${PWD}/install
+
+if [ -z "$GPU_VERSION" ]; then
+ echo 'GPU_VERSION must be set to something like "llvmpipe" or
+"freedreno-a630" (it will serve as a component to find the path for files
+residing in src/**/ci/*.txt)'
+ exit 1
+fi
+
+LD_LIBRARY_PATH=$INSTALL:$LD_LIBRARY_PATH
+setup_backends
+
+SKQP_ASSETS_DIR=/skqp/assets
+SKQP_RESULTS_DIR="${SKQP_RESULTS_DIR:-$PWD/results}"
+
+mkdir -p "${SKQP_ASSETS_DIR}"/skqp
+
+SKQP_EXITCODE=0
+for SKQP_BACKEND in ${SKQP_BACKENDS}
+do
+ set -e
+ if ! copy_tests_files "${SKQP_BACKEND}"
+ then
+ echo "No override test file found for ${SKQP_BACKEND}. Using the default one."
+ fi
+
+ set +e
+ SKQP_BACKEND_RESULTS_DIR="${SKQP_RESULTS_DIR}"/"${SKQP_BACKEND}"
+ mkdir -p "${SKQP_BACKEND_RESULTS_DIR}"
+ /skqp/skqp "${SKQP_ASSETS_DIR}" "${SKQP_BACKEND_RESULTS_DIR}" "${SKQP_BACKEND}_"
+ BACKEND_EXITCODE=$?
+
+ if [ ! $BACKEND_EXITCODE -eq 0 ]
+ then
+ echo "skqp failed on ${SKQP_BACKEND} tests with ${BACKEND_EXITCODE} exit code."
+ fi
+
+ # Propagate error codes to leverage the final job result
+ SKQP_EXITCODE=$(( SKQP_EXITCODE | BACKEND_EXITCODE ))
+done
+
+set +x
+
+# Unit tests produce empty HTML reports, guide the user to check the TXT file.
+if echo "${SKQP_BACKENDS}" | grep -qE "unitTest"
+then
+ # Remove the empty HTML report to avoid confusion
+ rm -f "${SKQP_RESULTS_DIR}"/unitTest/report.html
+
+ echo "See skqp unit test results at:"
+ echo "https://$CI_PROJECT_ROOT_NAMESPACE.pages.freedesktop.org/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/${SKQP_RESULTS_DIR}/unitTest/unit_tests.txt"
+fi
+
+REPORT_FILES=$(mktemp)
+find "${SKQP_RESULTS_DIR}"/**/report.html -type f > "${REPORT_FILES}"
+while read -r REPORT
+do
+ BACKEND_NAME=$(echo "${REPORT}" | sed 's@.*/\([^/]*\)/report.html@\1@')
+ echo "See skqp ${BACKEND_NAME} render tests report at:"
+ echo "https://$CI_PROJECT_ROOT_NAMESPACE.pages.freedesktop.org/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/${REPORT}"
+done < "${REPORT_FILES}"
+
+# If there is no report available, tell the user that something is wrong.
+if [ ! -s "${REPORT_FILES}" ]
+then
+ echo "No skqp report available. Probably some fatal error has occured during the skqp execution."
+fi
+
+exit $SKQP_EXITCODE