You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
11 KiB
312 lines
11 KiB
#!/bin/bash
|
|
|
|
|
|
# DEFAULT VALUES
|
|
TESTS=()
|
|
MIN_TIME=0.0
|
|
MIN_ITER=0
|
|
BATCH_MODE=0
|
|
GRAPH_LINE=0
|
|
GRAPH_ZERO=0
|
|
VARIABLES=
|
|
|
|
|
|
# DEFINES
|
|
TEST_NAMES=(
|
|
LEVELS_VEC3_RELAXED LEVELS_VEC4_RELAXED LEVELS_VEC3_FULL LEVELS_VEC4_FULL BLUR_RADIUS_25 # 00-04
|
|
INTRINSIC_BLUR_RADIUS_25 GREYSCALE GRAIN FISHEYE_FULL FISHEYE_RELAXED # 05-09
|
|
FISHEYE_APPROXIMATE_FULL FISHEYE_APPROXIMATE_RELAXED VIGNETTE_FULL VIGNETTE_RELAXED VIGNETTE_APPROXIMATE_FULL # 10-14
|
|
VIGNETTE_APPROXIMATE_RELAXED GROUP_TEST_EMULATED GROUP_TEST_NATIVE CONVOLVE_3X3 INTRINSICS_CONVOLVE_3X3 # 15-19
|
|
COLOR_MATRIX INTRINSICS_COLOR_MATRIX INTRINSICS_COLOR_MATRIX_GREY COPY CROSS_PROCESS_USING_LUT # 20-24
|
|
CONVOLVE_5X5 INTRINSICS_CONVOLVE_5X5 MANDELBROT_FLOAT INTRINSICS_BLEND INTRINSICS_BLUR_25G # 25-29
|
|
VIBRANCE BW_FILTER SHADOWS CONTRAST EXPOSURE # 30-34
|
|
WHITE_BALANCE COLOR_CUBE COLOR_CUBE_3D_INTRINSIC ARTISTIC1 RESIZE_BI_SCRIPT # 35-39
|
|
RESIZE_BI_INTRINSIC POSTERIZE_INVOKE POSTERIZE_SET HISTOGRAM_INTRINSIC HISTOGRAM_SCRIPT # 40-44
|
|
MANDELBROT_DOUBLE BLUR_RADIUS_25_HALF # 45-46
|
|
)
|
|
|
|
FUNCTION_NAMES=(
|
|
testLevelsVec3Relaxed testLevelsVec4Relaxed testLevelsVec3Full testLevelsVec4Full testBlurRadius25 # 00-04
|
|
testIntrinsicBlurRadius25 testGreyscale testGrain testFisheyeFull testFishEyeRelaxed # 05-09
|
|
testFisheyeApproximateFull testFisheyeApproximateRelaxed testVignetteFull testVignetteRelaxed testVignetteApproximateFull # 10-14
|
|
testVignetteApproximateRelaxed testGroupTestEmulated testGroupTestNative testConvolve3x3 testIntrinsicsConvolve3x3 # 15-19
|
|
testColorMatrix testIntrinsicsColorMatrix testIntrinsicsColorMatrixGrey testCopy testCrossProcessUsingLUT # 20-24
|
|
testConvolve5x5 testIntrinsicsConvolve5x5 testMandelbrot testIntrinsicsBlend testIntrinsicsBlur25G # 25-29
|
|
testVibrance testBWFilter testShadows testContrast testExposure # 30-34
|
|
testWhiteBalance testColorCube testColorCube3DIntrinsic testArtistic1 testResizeBiCubicScript # 35-39
|
|
testResizeBiCubicIntrinsic testPosterizeInvoke testPosterizeSet testHistogramIntrinsic testHistogramScript # 40-44
|
|
testMandelbrotfp64 testBlurRadius25Half # 45-46
|
|
)
|
|
|
|
RUNNER="com.android.rs.imagejb/androidx.test.runner.AndroidJUnitRunner"
|
|
TEST_ROOT="com.android.rs.imagejb.ImageProcessingTest"
|
|
|
|
|
|
# Helper functions
|
|
show_help() {
|
|
echo "
|
|
Usage: ${0##*/} [OPTIONS]...
|
|
Do stuff with FILE and write the result to standard output. With no FILE
|
|
or when FILE is -, read standard input.
|
|
|
|
-h, -?, --?, --help display this help message
|
|
-t, --time K set the minimum time (in seconds) each test should run
|
|
-i, --iteration[s] K set the minimum number of iterations each test should run
|
|
-c, --case[s] T1 [T2]... specify the number corresponding to each test to be run;
|
|
the test IDs are below
|
|
-b, --batch run all tests together for speed
|
|
-f, --bestfit add best fit line to graph
|
|
-z, --zero set graph's minimum yrange to 0
|
|
"
|
|
echo "Available test cases:"
|
|
for i in `seq 0 $((${#TEST_NAMES[@]} - 1))`; do
|
|
echo " $i: ${TEST_NAMES[$i]}"
|
|
done
|
|
echo
|
|
}
|
|
fileexists() {
|
|
[ `adb shell "[ -f $1 ] && echo found"` ]
|
|
}
|
|
|
|
|
|
# display help if blank argument list
|
|
if [ $# -eq 0 ]; then
|
|
show_help
|
|
exit
|
|
fi
|
|
|
|
# command line parsing
|
|
using_cases=0
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
-h|-\?|--\?|--help)
|
|
show_help
|
|
exit
|
|
;;
|
|
-t|--time)
|
|
using_cases=0
|
|
if [ -n "$2" ]; then
|
|
MIN_TIME=$2
|
|
shift
|
|
shift
|
|
else
|
|
echo 'ERROR: "--time" requires a non-empty option argument.'
|
|
exit 1
|
|
fi
|
|
;;
|
|
-i|--iter|--iters|--iteration|--iterations)
|
|
using_cases=0
|
|
if [ -n "$2" ]; then
|
|
MIN_ITER=$2
|
|
shift
|
|
shift
|
|
else
|
|
echo 'ERROR: "--iteration" requires a non-empty option argument.'
|
|
exit 1
|
|
fi
|
|
;;
|
|
-c|--case|--cases)
|
|
if [ -n "$2" ]; then
|
|
using_cases=1
|
|
shift
|
|
else
|
|
echo 'ERROR: "--case" requires a non-empty option argument.'
|
|
exit 1
|
|
fi
|
|
;;
|
|
-b|--batch)
|
|
using_cases=0
|
|
BATCH_MODE=1
|
|
shift
|
|
;;
|
|
-f|--bestfit)
|
|
using_cases=0
|
|
GRAPH_LINE=1
|
|
shift
|
|
;;
|
|
-z|--zero)
|
|
using_cases=0
|
|
GRAPH_ZERO=1
|
|
shift
|
|
;;
|
|
all)
|
|
if [ $using_cases -eq 1 ]; then
|
|
using_cases=0
|
|
TESTS=(`seq 0 $((${#TEST_NAMES[@]} - 1))`)
|
|
shift
|
|
else
|
|
echo "ERROR: Invalid option: $1"
|
|
fi
|
|
;;
|
|
[0-9]*)
|
|
if [ $using_cases -eq 1 ]; then
|
|
TESTS+=($1)
|
|
shift
|
|
else
|
|
echo "ERROR: Invalid option: $1"
|
|
exit 1
|
|
fi
|
|
;;
|
|
*)
|
|
echo "ERROR: Invalid option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# error checking
|
|
if [ ${#TESTS[@]} -eq 0 ]; then
|
|
echo "ERROR: need at least one --case"
|
|
exit 1
|
|
fi
|
|
|
|
# configure launch variables
|
|
if [[ ( $MIN_TIME == "0.0" ) && ( $MIN_ITER -eq 0 ) ]]; then
|
|
MIN_TIME=1.0
|
|
MIN_ITER=2
|
|
fi
|
|
VARIABLES="$VARIABLES -e minimum_test_runtime $MIN_TIME -e minimum_test_iterations $MIN_ITER"
|
|
TESTS=( `printf "%s\n" "${TESTS[@]}" | sort -n | uniq` )
|
|
|
|
# print prep
|
|
echo
|
|
[ $BATCH_MODE -eq 0 ] && echo "Running tests:" || echo "Running tests (in batch mode):"
|
|
for i in ${TESTS[@]}; do
|
|
echo $i: ${TEST_NAMES[$i]}
|
|
done
|
|
echo "with minimum runtime per test of $MIN_TIME seconds and
|
|
minimum number of $MIN_ITER iterations per test"
|
|
echo
|
|
|
|
# setup
|
|
echo
|
|
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
|
|
adb root
|
|
adb wait-for-device
|
|
fi
|
|
|
|
# grant permission
|
|
adb shell pm grant com.android.rs.imagejb android.permission.READ_EXTERNAL_STORAGE
|
|
adb shell pm grant com.android.rs.imagejb android.permission.WRITE_EXTERNAL_STORAGE
|
|
|
|
# Run each test individually...
|
|
if [[ $BATCH_MODE -eq 0 ]]; then
|
|
|
|
# run and plot each test result separately
|
|
for num in `seq 0 $((${#TESTS[@]} - 1))`; do
|
|
|
|
# alias
|
|
testId=${TESTS[$num]}
|
|
|
|
# report progress
|
|
printf "Running ${TEST_NAMES[$testId]} ($(($num + 1))/${#TESTS[@]})"
|
|
|
|
# run individual test
|
|
adb shell "am instrument -w $VARIABLES -e class $TEST_ROOT#${FUNCTION_NAMES[$testId]} $RUNNER" > /dev/null
|
|
|
|
# extract relevant data if present, write to temporary file
|
|
if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
|
|
adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
|
|
else
|
|
printf "\r \r"
|
|
echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
|
|
continue
|
|
fi
|
|
|
|
# calculate avg and stdcoef
|
|
AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
|
|
STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
|
|
|
|
# create plot file
|
|
echo "# temporary file" > plot.tmp
|
|
echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp # --- blue
|
|
echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp # --- green
|
|
echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
|
|
echo "set xlabel \"Iteration #\"" >> plot.tmp
|
|
echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
|
|
if [ $GRAPH_ZERO -eq 1 ]; then
|
|
echo "set yrange [0.0:*]" >> plot.tmp
|
|
fi
|
|
if [ $GRAPH_LINE -eq 1 ]; then
|
|
echo "set fit quiet" >> plot.tmp
|
|
echo "set fit logfile '/dev/null'" >> plot.tmp
|
|
echo "f(x) = a*x + b" >> plot.tmp
|
|
echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
|
|
echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
|
|
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
|
|
else
|
|
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
|
|
fi
|
|
|
|
# plot data as simple line graph
|
|
gnuplot -p plot.tmp
|
|
|
|
# clear line
|
|
printf "\r \r"
|
|
|
|
done
|
|
|
|
# ...or all at once
|
|
else
|
|
|
|
# concatenate all tests together to run in batch
|
|
TESTS_TEXT="-e class $TEST_ROOT#${FUNCTION_NAMES[${TESTS[0]}]}"
|
|
for num in `seq 1 $((${#TESTS[@]} - 1))`; do
|
|
TESTS_TEXT=$TESTS_TEXT,"$TEST_ROOT#${FUNCTION_NAMES[${TESTS[$num]}]}"
|
|
done
|
|
|
|
# run command
|
|
adb shell "am instrument -w $VARIABLES $TESTS_TEXT $RUNNER"
|
|
|
|
# run and plot each test result separately
|
|
for num in `seq 0 $((${#TESTS[@]} - 1))`; do
|
|
|
|
# alias
|
|
testId=${TESTS[$num]}
|
|
|
|
# extract relevant data if present, write to temporary file
|
|
if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
|
|
adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
|
|
else
|
|
echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
|
|
continue
|
|
fi
|
|
|
|
# calculate avg and stdcoef
|
|
AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
|
|
STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`
|
|
|
|
# create plot file
|
|
echo "# temporary file" > plot.tmp
|
|
echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp # --- blue
|
|
echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp # --- green
|
|
echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
|
|
echo "set xlabel \"Iteration #\"" >> plot.tmp
|
|
echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
|
|
if [ $GRAPH_ZERO -eq 1 ]; then
|
|
echo "set yrange [0.0:*]" >> plot.tmp
|
|
fi
|
|
if [ $GRAPH_LINE -eq 1 ]; then
|
|
echo "set fit quiet" >> plot.tmp
|
|
echo "set fit logfile '/dev/null'" >> plot.tmp
|
|
echo "f(x) = a*x + b" >> plot.tmp
|
|
echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
|
|
echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
|
|
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
|
|
else
|
|
echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
|
|
fi
|
|
|
|
# plot data as simple line graph
|
|
gnuplot -p plot.tmp
|
|
|
|
done
|
|
|
|
fi # single or batch mode
|
|
|
|
# cleanup
|
|
rm -f plot.tmp
|
|
rm -f timing.tmp
|
|
|
|
|