# Powershell script for running the vktrace trace/replay auto test | |
# To run this test: | |
# cd <this-dir> | |
# powershell C:\src\LoaderAndTools\vktracereplay.ps1 [-Debug] | |
$exitstatus = 0 | |
if ($args[0] -eq "-Debug") { | |
$dPath = "Debug" | |
} else { | |
$dPath = "Release" | |
} | |
write-host -background black -foreground green "[ RUN ] " -nonewline | |
write-host "vktracereplay.ps1: Vktrace trace/replay" | |
# Create a temp directory to run the test in | |
rm -recurse -force vktracereplay_tmp > $null 2> $null | |
new-item vktracereplay_tmp -itemtype directory > $null 2> $null | |
# Copy everything we need into the temp directory, so we | |
# can make sure we are using the correct dll and exe files | |
cd vktracereplay_tmp | |
cp ..\..\vktrace\$dPath\vkreplay.exe . | |
cp ..\..\vktrace\$dPath\vktrace.exe . | |
cp ..\..\vktrace\$dPath\vulkan_trace.dll | |
cp ..\..\demos\$dPath\cube.exe . | |
cp ..\..\demos\*.png . | |
cp ..\..\demos\*.spv . | |
cp ..\..\loader\$dPath\vulkan-0.dll . | |
cp ..\..\layers\$dPath\VKLayerScreenShot.dll . | |
cp ..\..\layers\$dPath\screenshot.json . | |
# Change PATH to the temp directory | |
$oldpath = $Env:PATH | |
$Env:PATH = $pwd | |
# Set up some modified env vars | |
$Env:VK_LAYER_PATH = $pwd | |
# Temporarily set ScreenShot layer by hand until these are worked out | |
$Env:_VK_SCREENSHOT = 1 | |
$Env:VK_INSTANCE_LAYERS = "ScreenShot" | |
$Env:VK_DEVICE_LAYERS = "ScreenShot" | |
# Do a trace and replay | |
& vktrace -o c01.vktrace -s 1 -p cube -a "--c 10" -l0 vulkan_trace.dll > trace.sout 2> trace.serr | |
rename-item -path 1.ppm -newname 1-trace.ppm | |
& vkreplay -s 1 -t c01.vktrace > replay.sout 2> replay.serr | |
rename-item -path 1.ppm -newname 1-replay.ppm | |
# Force a failure - for testing this script | |
#cp vulkan.dll 1-replay.ppm | |
#rm 1-trace.ppm | |
#rm 1-replay.ppm | |
# Restore PATH | |
$Env:PATH = $oldpath | |
if ($exitstatus -eq 0) { | |
# Check that two screenshots were created | |
if (!(Test-Path 1-trace.ppm) -or !(Test-Path 1-replay.ppm)) { | |
echo 'Trace file does not exist' | |
write-host -background black -foreground red "[ FAILED ] " -nonewline; | |
$exitstatus = 1 | |
} | |
} | |
if ($exitstatus -eq 0) { | |
# ensure the trace and replay snapshots are identical | |
fc.exe /b 1-trace.ppm 1-replay.ppm > $null | |
if (!(Test-Path 1-trace.ppm) -or !(Test-Path 1-replay.ppm) -or $LastExitCode -eq 1) { | |
echo 'Trace files do not match' | |
write-host -background black -foreground red "[ FAILED ] " -nonewline; | |
$exitstatus = 1 | |
} | |
} | |
# check the average pixel value of each screenshot to ensure something plausible was written | |
if ($exitstatus -eq 0) { | |
$trace_mean = (convert 1-trace.ppm -format "%[mean]" info:) | |
$replay_mean = (convert 1-replay.ppm -format "%[mean]" info:) | |
$version = (identify -version) | |
# normalize the values so we can support Q8 and Q16 imagemagick installations | |
if ($version -match "Q8") { | |
$trace_mean = $trace_mean / 255 # 2^8-1 | |
$replay_mean = $replay_mean / 255 # 2^8-1 | |
} else { | |
$trace_mean = $trace_mean / 65535 # 2^16-1 | |
$replay_mean = $replay_mean / 65535 # 2^16-1 | |
} | |
# if either screenshot is too bright or too dark, it either failed, or is a bad test | |
if (($trace_mean -lt 0.10) -or ($trace_mean -gt 0.90)){ | |
echo '' | |
echo 'Trace screenshot failed mean check, must be in range [0.1, 0.9]' | |
write-host 'Detected mean:' $trace_mean | |
echo '' | |
write-host -background black -foreground red "[ FAILED ] " -nonewline; | |
$exitstatus = 1 | |
} | |
if (($replay_mean -lt 0.10) -or ($replay_mean -gt 0.90)){ | |
echo '' | |
echo 'Replay screenshot failed mean check, must be in range [0.1, 0.9]' | |
write-host 'Detected mean:' $replay_mean | |
echo '' | |
write-host -background black -foreground red "[ FAILED ] " -nonewline; | |
$exitstatus = 1 | |
} | |
} | |
# if we passed all the checks, the test is good | |
if ($exitstatus -eq 0) { | |
write-host -background black -foreground green "[ PASSED ] " -nonewline; | |
} | |
write-host "vktracereplay.ps1: Vktrace trace/replay" | |
write-host | |
if ($exitstatus) { | |
echo '1 FAILED TEST' | |
} | |
# cleanup | |
cd .. | |
rm -recurse -force vktracereplay_tmp > $null 2> $null | |
Remove-Item Env:\VK_LAYER_PATH | |
Remove-Item Env:\_VK_SCREENSHOT | |
Remove-Item Env:\VK_INSTANCE_LAYERS | |
Remove-Item Env:\VK_DEVICE_LAYERS | |
exit $exitstatus |