Enhancements to workload scripts

- display frame latencies (90th/95th/99th) for recents and systemapps
- allow device type to be specified to capture
- workaround for am hang when starting chrome on volantis
- bullhead support for recentfling

New output of "recentfling.sh":

Fling recents...
Frames: 772 latency: 19/22/34 Janks: 131(16%)

New output of "systemapps.sh -T":

App      Start(ms) Iter(ms) Jank      Latency
gmail       1090    2168      69(72%) 65/75/88
hangouts    1757    2758      60(82%) 69/111/114
chrome         0     997      59(64%) 68/77/84
youtube     3533    4834     140(48%) 70/93/150
play        1868    3147      92(62%) 89/106/182
home           0    1125     210(15%) 62/84/129
TOTAL       8248   35052

Change-Id: If4fc94ab0188dae2afabfbf696be06b6ddf55ce1
diff --git a/tests/workloads/capture.sh b/tests/workloads/capture.sh
index 721fe8c..3b2f446 100755
--- a/tests/workloads/capture.sh
+++ b/tests/workloads/capture.sh
Binary files differ
diff --git a/tests/workloads/defs.sh b/tests/workloads/defs.sh
index ba820fd..dbed4dd 100755
--- a/tests/workloads/defs.sh
+++ b/tests/workloads/defs.sh
Binary files differ
diff --git a/tests/workloads/recentfling.sh b/tests/workloads/recentfling.sh
index 68fdb2f..092c8d9 100755
--- a/tests/workloads/recentfling.sh
+++ b/tests/workloads/recentfling.sh
@@ -44,6 +44,12 @@
 	upCount=6
 	UP="70 400 70 100 $flingtime"
 	DOWN="70 100 70 400 $flingtime";;
+(bullhead)
+	flingtime=200
+	downCount=5
+	upCount=5
+	UP="500 1200 500 550 $flingtime"
+	DOWN="500 550 500 1200 $flingtime";;
 (volantis)
 	flingtime=400
 	downCount=5
@@ -66,20 +72,6 @@
 	done
 fi
 
-cur=1
-
-set -- $(getJankyFrames)
-totalFrames=$1
-jankyFrames=$2
-frameSum=0
-jankSum=0
-
-if [ ${totalFrames:=0} -eq 0 ]; then
-#echo Error: could not read frame info with \"dumpsys graphicsstats\"
-	echo Error: could not read frame info with \"dumpsys gfxinfo\"
-	exit 1
-fi
-
 function swipe {
 	count=0
 	while [ $count -lt $2 ]
@@ -89,14 +81,25 @@
 	done
 }
 
+cur=1
+frameSum=0
+jankSum=0
+latency90Sum=0
+latency95Sum=0
+latency99Sum=0
+
 echo Fling recents...
-doKeyevent APP_SWITCH
+doKeyevent HOME
+sleep 0.5
+resetJankyFrames
 
 while [ $cur -le $iterations ]
 do
 	if [ $capturesystrace -gt 0 ]; then
 		${ADB}atrace --async_start -z -c -b 16000 freq gfx view idle sched
 	fi
+	doKeyevent APP_SWITCH
+	sleep 0.5
 	swipe "$DOWN" $downCount
 	sleep 1
 	swipe "$UP" $upCount
@@ -108,25 +111,40 @@
 	if [ $capturesystrace -gt 0 ]; then
 		${ADB}atrace --async_dump -z -c -b 16000 freq gfx view idle sched > trace.${cur}.out
 	fi
+	doKeyevent HOME
+	sleep 0.5
 
 	set -- $(getJankyFrames)
-	newTotalFrames=$1
-	newJankyFrames=$2
-	((totalDiff=newTotalFrames-totalFrames))
+	totalDiff=$1
+	jankyDiff=$2
+	latency90=$3
+	latency95=$4
+	latency99=$5
+	if [ ${totalDiff:=0} -eq 0 ]; then
+		echo Error: could not read frame info with \"dumpsys gfxinfo\"
+		exit 1
+	fi
+
 	((frameSum=frameSum+totalDiff))
-	((jankyDiff=newJankyFrames-jankyFrames))
 	((jankSum=jankSum+jankyDiff))
+	((latency90Sum=latency90Sum+latency90))
+	((latency95Sum=latency95Sum+latency95))
+	((latency99Sum=latency99Sum+latency99))
 	if [ "$totalDiff" -eq 0 ]; then
 		echo Error: no frames detected. Is the display off?
 		exit 1
 	fi
 	((jankPct=jankyDiff*100/totalDiff))
-	totalFrames=$newTotalFrames
-	jankyFrames=$newJankyFrames
+	resetJankyFrames
 
-	echo Frames: $totalDiff Janks: $jankyDiff \(${jankPct}%\)
+	echo Frames: $totalDiff latency: $latency90/$latency95/$latency99 Janks: $jankyDiff\(${jankPct}%\)
 	((cur=cur+1))
 done
 doKeyevent HOME
 ((aveJankPct=jankSum*100/frameSum))
-echo AVE: Frames: $frameSum Janks: $jankSum \(${aveJankPct}%\)
+((aveJanks=jankSum/iterations))
+((aveFrames=frameSum/iterations))
+((aveLatency90=latency90Sum/iterations))
+((aveLatency95=latency95Sum/iterations))
+((aveLatency99=latency99Sum/iterations))
+echo AVE: Frames: $aveFrames latency: $aveLatency90/$aveLatency95/$aveLatency99 Janks: $aveJanks\(${aveJankPct}%\)
diff --git a/tests/workloads/systemapps.sh b/tests/workloads/systemapps.sh
index 184c4ee..bd97148 100755
--- a/tests/workloads/systemapps.sh
+++ b/tests/workloads/systemapps.sh
@@ -74,6 +74,9 @@
 	reclaim=$4
 	frames=$5
 	janks=$6
+	l90=$7
+	l95=$8
+	l99=$9
 	curMax=$(eval "echo \$${label}max")
 	curMax=${curMax:=0}
 	curMin=$(eval "echo \$${label}min")
@@ -88,6 +91,12 @@
 	curFrames=${curFrames:=0}
 	curJanks=$(eval "echo \$${label}janks")
 	curJanks=${curJanks:=0}
+	cur90=$(eval "echo \$${label}90")
+	cur90=${cur90:=0}
+	cur95=$(eval "echo \$${label}95")
+	cur95=${cur95:=0}
+	cur99=$(eval "echo \$${label}99")
+	cur99=${cur99:=0}
 	if [ $curMax -lt $t ]; then
 		eval "${label}max=$t"
 	fi
@@ -105,12 +114,19 @@
 	eval "${label}frames=$curFrames"
 	((curJanks=curJanks+${janks:=0}))
 	eval "${label}janks=$curJanks"
+	((cur90=cur90+${l90:=0}))
+	eval "${label}90=$cur90"
+	((cur95=cur95+${l95:=0}))
+	eval "${label}95=$cur95"
+	((cur99=cur99+${l99:=0}))
+	eval "${label}99=$cur99"
 }
 function getStats {
 	label=$1
 	echo $(eval "echo \$${label}max") $(eval "echo \$${label}min") $(eval "echo \$${label}sum") \
 		$(eval "echo \$${label}restart") $(eval "echo \$${label}reclaim") \
-		$(eval "echo \$${label}frames") $(eval "echo \$${label}janks")
+		$(eval "echo \$${label}frames") $(eval "echo \$${label}janks") \
+		$(eval "echo \$${label}90") $(eval "echo \$${label}95") $(eval "echo \$${label}99")
 }
 
 cur=1
@@ -126,7 +142,7 @@
 	fi
 	if [ $iterations -gt 1 -o $cur -eq 1 ]; then
 		if [ $totaltimetest -eq 0 ]; then
-			printf "%-6s    %7s(ms)  %6s(ms) %s %s %s %s\n" App  Time AmTime Restart DirReclaim JankyFrames
+			printf "%-6s    %7s(ms)  %6s(ms) %s %s %s     %s\n" App  Time AmTime Restart DirReclaim Jank Latency
 		fi
 	fi
 
@@ -136,53 +152,77 @@
 		vout Starting $app...
 		((appnum=appnum+1))
 		loopTimestamp=$(date +"%s %N")
-		if [ $totaltimetest -gt 0 ]; then
-			# no instramentation, just cycle through the apps
-			if [ $appnum -eq 0 ]; then
-				printf "%-8s %5s(ms) %3s(ms)\n" App Start Iter
-			fi
-			if [ $forcecoldstart -eq 0 ]; then
-				t=$(startActivity $app)
-			else
-				t=$(forceStartActivity $app)
-			fi
-			loopEndTimestamp=$(date +"%s %N")
-			diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp)
-			# Note: "%d" doesn't work right if run on device
-			printf "%-10s %5.0f   %5.0f\n" $app $t $diffTime
-			((totaltime=totaltime+t))
-			continue
-		fi
-		tmpTraceOut="$tmpTraceOutBase-$app.out"
-		>$tmpTraceOut
-		startInstramentation
+		resetJankyFrames
 		resetJankyFrames $(getPackageName $app)
-		t=$(startActivity $app)
+		if [ $totaltimetest -eq 0 ]; then
+			tmpTraceOut="$tmpTraceOutBase-$app.out"
+			>$tmpTraceOut
+			startInstramentation
+		else
+			if [ $appnum -eq 0 ]; then
+				printf "%-8s %5s(ms) %3s(ms) %s      %s\n" App Start Iter Jank Latency
+			fi
+		fi
+		if [ $forcecoldstart -eq 0 ]; then
+			t=$(startActivity $app)
+		else
+			t=$(forceStartActivity $app)
+		fi
+
+		loopEndTimestamp=$(date +"%s %N")
+		diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp)
 		# let app finish drawing before checking janks
 		sleep 3
 		set -- $(getJankyFrames $(getPackageName $app))
 		frames=$1
 		janks=$2
-		((jankPct=100*janks/frames))
-		stopAndDumpInstramentation $tmpTraceOut
-		actName=$(getActivityName $app)
-		stime=$(getStartTime $actName $tmpTraceOut)
-		relaunch=$?
-		etime=$(getEndTime $actName $tmpTraceOut)
-		((tdiff=$etime-$stime))
-		if [ $etime -eq 0 -o $stime -eq 0 ]; then
-			handleError $app : could not compute start time stime=$stime  etime=$etime
-			# use AmTime so statistics make sense
-			tdiff=$t
+		l90=$3
+		l95=$4
+		l99=$5
+		set -- $(getJankyFrames)
+		systemFrames=$1
+		systemJanks=$2
+		s90=$3
+		s95=$4
+		s99=$5
+		((frames=frames+systemFrames))
+		((janks=janks+systemJanks))
+		((l90=l90+s90))
+		((l95=l95+s95))
+		((l99=l99+s99))
+		if [ $frames -eq 0 ]; then
+			janks=0
+			jankPct=0
+		else
+			((jankPct=100*janks/frames))
 		fi
-		checkForDirectReclaim $actName $tmpTraceOut
-		directReclaim=$?
+		if [ $totaltimetest -gt 0 ]; then
+			# Note: using %f since %d doesn't work correctly
+			# when running on lollipop
+			printf "%-10s %5.0f   %5.0f    %4.0f(%2.0f%%) %2.0f/%2.0f/%2.0f\n" $app $t $diffTime $janks $jankPct $l90 $l95 $l99
+			((totaltime=totaltime+t))
+			continue
+		else
+			stopAndDumpInstramentation $tmpTraceOut
+			actName=$(getActivityName $app)
+			stime=$(getStartTime $actName $tmpTraceOut)
+			relaunch=$?
+			etime=$(getEndTime $actName $tmpTraceOut)
+			((tdiff=$etime-$stime))
+			if [ $etime -eq 0 -o $stime -eq 0 ]; then
+				handleError $app : could not compute start time stime=$stime  etime=$etime
+				# use AmTime so statistics make sense
+				tdiff=$t
+			fi
+			checkForDirectReclaim $actName $tmpTraceOut
+			directReclaim=$?
 
-		printf "%-12s %5d     %5d     %5d    %5d    %5d(%d%%)\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct"
-		computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks"
+			printf "%-12s %5d     %5d     %5d    %5d    %5d(%d%%) %d/%d/%d\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct" $l90 $l95 $l99
+			computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks" $l90 $l95 $l99
 
-		if [ $savetmpfiles -eq 0 ]; then
-			rm -f $tmpTraceOut
+			if [ $savetmpfiles -eq 0 ]; then
+				rm -f $tmpTraceOut
+			fi
 		fi
 	done
 	((cur=cur+1))
@@ -198,7 +238,7 @@
 	echo =========================================
 	printf "Stats after $iterations iterations:\n"
 	echo =========================================
-	printf "%-6s    %7s(ms) %6s(ms) %6s(ms)    %s    %s %s %s\n" App Max Ave Min Restart DirReclaim JankyFrames
+	printf "%-6s    %7s(ms) %6s(ms) %6s(ms)    %s    %s %s     %s\n" App Max Ave Min Restart DirReclaim Jank Latency
 	for app in $appList
 	do
 		set -- $(getStats $app)
@@ -206,7 +246,13 @@
 		((ave=sum/iterations))
 		frames=$6
 		janks=$7
+		l90=$8
+		l95=$9
+		l99=${10}
+		((ave90=l90/iterations))
+		((ave95=l95/iterations))
+		((ave99=l99/iterations))
 		((jankPct=100*janks/frames))
-		printf "%-12s %5d      %5d      %5d      %5d      %5d     %5d(%d%%)\n" $app $1 $ave $2 $4 $5 $janks $jankPct
+		printf "%-12s %5d      %5d      %5d      %5d      %5d     %5d(%d%%) %d/%d/%d\n" $app $1 $ave $2 $4 $5 $janks $jankPct $ave90 $ave95 $ave99
 	done
 fi