| #!/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 |
| |
| |