1 //
2 // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ANGLEPerfTestArgs.cpp:
7 // Parse command line arguments for angle_perftests.
8 //
9
10 #include "ANGLEPerfTestArgs.h"
11 #include <string.h>
12 #include <sstream>
13
14 #include "common/debug.h"
15 #include "util/test_utils.h"
16
17 namespace angle
18 {
19
20 constexpr int kDefaultStepsPerTrial = std::numeric_limits<int>::max();
21 constexpr int kDefaultTrialTimeSeconds = 0;
22 constexpr int kDefaultTestTrials = 3;
23
24 int gStepsPerTrial = kDefaultStepsPerTrial;
25 int gMaxStepsPerformed = kDefaultMaxStepsPerformed;
26 bool gEnableTrace = false;
27 const char *gTraceFile = "ANGLETrace.json";
28 const char *gScreenshotDir = nullptr;
29 const char *gRenderTestOutputDir = nullptr;
30 bool gSaveScreenshots = false;
31 int gScreenshotFrame = kDefaultScreenshotFrame;
32 bool gVerboseLogging = false;
33 bool gWarmup = false;
34 int gTrialTimeSeconds = kDefaultTrialTimeSeconds;
35 int gTestTrials = kDefaultTestTrials;
36 bool gNoFinish = false;
37 bool gRetraceMode = false;
38 bool gMinimizeGPUWork = false;
39 bool gTraceTestValidation = false;
40 const char *gPerfCounters = nullptr;
41 const char *gUseANGLE = nullptr;
42 const char *gUseGL = nullptr;
43 bool gOffscreen = false;
44 bool gVsync = false;
45 int gFpsLimit = 0;
46 bool gRunToKeyFrame = false;
47 int gFixedTestTime = 0;
48 int gFixedTestTimeWithWarmup = 0;
49 const char *gTraceInterpreter = nullptr;
50 const char *gPrintExtensionsToFile = nullptr;
51 const char *gRequestedExtensions = nullptr;
52 bool gIncludeInactiveResources = false;
53
54 namespace
55 {
PerfTestArg(int * argc,char ** argv,int argIndex)56 bool PerfTestArg(int *argc, char **argv, int argIndex)
57 {
58 return ParseFlag("--run-to-key-frame", argc, argv, argIndex, &gRunToKeyFrame) ||
59 ParseFlag("--enable-trace", argc, argv, argIndex, &gEnableTrace) ||
60 ParseFlag("-v", argc, argv, argIndex, &gVerboseLogging) ||
61 ParseFlag("--verbose", argc, argv, argIndex, &gVerboseLogging) ||
62 ParseFlag("--verbose-logging", argc, argv, argIndex, &gVerboseLogging) ||
63 ParseFlag("--no-finish", argc, argv, argIndex, &gNoFinish) ||
64 ParseFlag("--warmup", argc, argv, argIndex, &gWarmup) ||
65 ParseCStringArg("--trace-file", argc, argv, argIndex, &gTraceFile) ||
66 ParseCStringArg("--perf-counters", argc, argv, argIndex, &gPerfCounters) ||
67 ParseIntArg("--steps-per-trial", argc, argv, argIndex, &gStepsPerTrial) ||
68 ParseIntArg("--max-steps-performed", argc, argv, argIndex, &gMaxStepsPerformed) ||
69 ParseIntArg("--fixed-test-time", argc, argv, argIndex, &gFixedTestTime) ||
70 ParseIntArg("--fixed-test-time-with-warmup", argc, argv, argIndex,
71 &gFixedTestTimeWithWarmup) ||
72 ParseIntArg("--trial-time", argc, argv, argIndex, &gTrialTimeSeconds) ||
73 ParseIntArg("--max-trial-time", argc, argv, argIndex, &gTrialTimeSeconds) ||
74 ParseIntArg("--trials", argc, argv, argIndex, &gTestTrials);
75 }
76
TraceTestArg(int * argc,char ** argv,int argIndex)77 bool TraceTestArg(int *argc, char **argv, int argIndex)
78 {
79 return ParseFlag("--retrace-mode", argc, argv, argIndex, &gRetraceMode) ||
80 ParseFlag("--validation", argc, argv, argIndex, &gTraceTestValidation) ||
81 ParseFlag("--save-screenshots", argc, argv, argIndex, &gSaveScreenshots) ||
82 ParseFlag("--offscreen", argc, argv, argIndex, &gOffscreen) ||
83 ParseFlag("--vsync", argc, argv, argIndex, &gVsync) ||
84 ParseFlag("--minimize-gpu-work", argc, argv, argIndex, &gMinimizeGPUWork) ||
85 ParseCStringArg("--trace-interpreter", argc, argv, argIndex, &gTraceInterpreter) ||
86 ParseIntArg("--screenshot-frame", argc, argv, argIndex, &gScreenshotFrame) ||
87 ParseIntArg("--fps-limit", argc, argv, argIndex, &gFpsLimit) ||
88 ParseCStringArgWithHandling("--render-test-output-dir", argc, argv, argIndex,
89 &gRenderTestOutputDir, ArgHandling::Preserve) ||
90 ParseCStringArg("--screenshot-dir", argc, argv, argIndex, &gScreenshotDir) ||
91 ParseCStringArg("--use-angle", argc, argv, argIndex, &gUseANGLE) ||
92 ParseCStringArg("--use-gl", argc, argv, argIndex, &gUseGL) ||
93 ParseCStringArg("--print-extensions-to-file", argc, argv, argIndex,
94 &gPrintExtensionsToFile) ||
95 ParseCStringArg("--request-extensions", argc, argv, argIndex, &gRequestedExtensions) ||
96 ParseFlag("--include-inactive-resources", argc, argv, argIndex,
97 &gIncludeInactiveResources);
98 }
99 } // namespace
100 } // namespace angle
101
102 using namespace angle;
103
ANGLEProcessPerfTestArgs(int * argc,char ** argv)104 void ANGLEProcessPerfTestArgs(int *argc, char **argv)
105 {
106 for (int argIndex = 1; argIndex < *argc;)
107 {
108 if (!PerfTestArg(argc, argv, argIndex))
109 {
110 argIndex++;
111 }
112 }
113
114 if (gRunToKeyFrame || gMaxStepsPerformed > 0)
115 {
116 // Ensure defaults were provided for params we're about to set
117 ASSERT(gTestTrials == kDefaultTestTrials && gTrialTimeSeconds == kDefaultTrialTimeSeconds);
118
119 gTestTrials = 1;
120 gTrialTimeSeconds = 36000;
121 }
122
123 if (gFixedTestTime != 0)
124 {
125 // Ensure defaults were provided for params we're about to set
126 ASSERT(gTrialTimeSeconds == kDefaultTrialTimeSeconds &&
127 gStepsPerTrial == kDefaultStepsPerTrial && gTestTrials == kDefaultTestTrials);
128
129 gTrialTimeSeconds = gFixedTestTime;
130 gStepsPerTrial = std::numeric_limits<int>::max();
131 gTestTrials = 1;
132 }
133
134 if (gFixedTestTimeWithWarmup != 0)
135 {
136 // Ensure defaults were provided for params we're about to set
137 ASSERT(gTrialTimeSeconds == kDefaultTrialTimeSeconds &&
138 gStepsPerTrial == kDefaultStepsPerTrial && gTestTrials == kDefaultTestTrials);
139
140 // This option is primarily useful for trace replays when you want to iterate once through
141 // the trace to warm caches, then run for a fixed amount of time. It is equivalent to:
142 // --trial-time X --steps-per-trial INF --trials 1 --warmup
143 gTrialTimeSeconds = gFixedTestTimeWithWarmup;
144 gStepsPerTrial = std::numeric_limits<int>::max();
145 gTestTrials = 1;
146 gWarmup = true;
147 }
148
149 if (gTrialTimeSeconds == 0)
150 {
151 gTrialTimeSeconds = 10;
152 }
153 }
154
ANGLEProcessTraceTestArgs(int * argc,char ** argv)155 void ANGLEProcessTraceTestArgs(int *argc, char **argv)
156 {
157 ANGLEProcessPerfTestArgs(argc, argv);
158
159 for (int argIndex = 1; argIndex < *argc;)
160 {
161 if (!TraceTestArg(argc, argv, argIndex))
162 {
163 argIndex++;
164 }
165 }
166
167 if (gScreenshotDir)
168 {
169 // implicitly set here but not when using kRenderTestOutputDir
170 gSaveScreenshots = true;
171 }
172
173 if (gRenderTestOutputDir)
174 {
175 gScreenshotDir = gRenderTestOutputDir;
176 }
177
178 if (gTraceTestValidation)
179 {
180 gTestTrials = 1;
181 gTrialTimeSeconds = 600;
182 }
183 }
184