#!/bin/bash

# Copyright (c) 2016-2023 The Brenwill Workshop Ltd.
#
# runcts - This script simplifies running Vulkan CTS tests on MoltenVK.
#
# CTS will save temporary output files to the directory this script is located in. It is 
# recommended that you copy this file to a location where your testing files will be kept.
# By default, this should be a directory beside the VK-GL-CTS directory. See the description 
# of the --cts option below for information about locations.
#
# Executing a large case list file of CTS tests can take a long time. It is recommended
# that you run this using caffeinate, as follows:
#     caffeinate -is ./runcts [-o path] [--cts path] [-p] [--portability] case_list_file
#
#
# macOS usage: ./runcts [-o path] [--cts path] [-p] [--portability] case_list_file
#
#     case_list_file
#         The path to the file that contains a list of the CTS test cases to run.
#
#     -o path
#         The path to the file to write the test results. If this option is not provided, 
#         the results will be written to an output text file with the same name as the 
#         case_list_file, with "-results.txt" appended. CTS will also output several
#         working temporary files into the directory holding this script.
#
#     --cts path
#         The path to the directory containing the built CTS executable.
#         If this parameter is not provided, it defaults to:
#         "../../VK-GL-CTS/build/external/vulkancts/modules/vulkan/Debug".
#
#      -p
#         Same as the --portability option.
#
#      --portability
#         Indicates that this testing is for testing conformance with the 
#         Vulkan Portability initiative. MoltenVK will advertise support for
#         only Vulkan 1.0, and only the following extensions:
#             VK_KHR_get_physical_device_properties2
#             VK_KHR_portability_subset
#             VK_MVK_moltenvk
#

cts_vk_dir="../../VK-GL-CTS/build/external/vulkancts/modules/vulkan/Debug"
caselist_file=""
results_file=""
is_portability=""

while (( "$#" )); do
  case "$1" in
       -o)
         results_file="${2}"
         shift 2
         ;;
       --cts)
         cts_vk_dir="${2}"
         shift 2
         ;;
       -p | --portability)
         is_portability="Y"
         shift 1
         ;;
       -*|--*=)
         echo "Error: Unsupported option $1. See usage instructions in body of this script." >&2
         exit 1
         ;;
       *)
         caselist_file="${1}"
         shift 1
         ;;
  esac
done

if [ "${caselist_file}" == "" ]; then 
	echo "Error: No caselist file specified. See usage instructions in body of this script." >&2
	exit 1
fi

if [ "${results_file}" == "" ]; then
	results_file="${caselist_file}-results.txt"
fi


# -------------- MoltenVK configuration --------------------

# As documented above, the portability option restricts to Vulkan 1.0 and a very limited set of extensions.
# The values used here are documented in vk_mvk_moltenvk.h.
# - MVK_CONFIG_API_VERSION_TO_ADVERTISE = VK_API_VERSION_1_0 (4194304)
# - MVK_CONFIG_ADVERTISE_EXTENSIONS selects support for a very limited set of extensions,
#   using a bit-or of values in MVKConfigAdvertiseExtensions (extension list documented above).
if [ "${is_portability}" != "" ]; then
	export MVK_CONFIG_API_VERSION_TO_ADVERTISE=4194304
	export MVK_CONFIG_ADVERTISE_EXTENSIONS=0xA
fi

# ----- Metal validation settings ------
export METAL_DEVICE_WRAPPER_TYPE=1
export METAL_ERROR_MODE=3
export METAL_DEBUG_ERROR_MODE=3

# ----- MoltenVK config settings ------
export MVK_CONFIG_LOG_LEVEL=1	#(1 = Errors only, 3 = Info)
export MVK_DEBUG=0

# Additional MoltenVK configuration can be set here by editing below.
export MVK_CONFIG_RESUME_LOST_DEVICE=1
export MVK_CONFIG_FAST_MATH_ENABLED=1
export MVK_CONFIG_FORCE_LOW_POWER_GPU=0
export MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=0          #(2 = VK_EXT_descriptor_indexing enabled)
export MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE=2          #(2 = MTLEvents always)
export MVK_CONFIG_SHADER_COMPRESSION_ALGORITHM=0        #(2 = ZLIB, 3 = LZ4)
export MVK_CONFIG_PERFORMANCE_TRACKING=0
export MVK_CONFIG_ACTIVITY_PERFORMANCE_LOGGING_STYLE=2  #(2 = Device lifetime)

# -------------- Operation --------------------

echo Testing started at `date +%r`
start_time=${SECONDS}

"${cts_vk_dir}/deqp-vk"                    \
--deqp-archive-dir="${cts_vk_dir}/.."      \
--deqp-log-images=disable                  \
--deqp-log-shader-sources=disable          \
--deqp-caselist-file="${caselist_file}"    \
&> "${results_file}"

echo Testing complete in $(($SECONDS - $start_time)) seconds
