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 bool gRunToKeyFrame = false;
46 int gFixedTestTime = 0;
47 int gFixedTestTimeWithWarmup = 0;
48 const char *gTraceInterpreter = nullptr;
49 const char *gPrintExtensionsToFile = nullptr;
50 const char *gRequestedExtensions = nullptr;
51 bool gIncludeInactiveResources = false;
52
53 namespace
54 {
PerfTestArg(int * argc,char ** argv,int argIndex)55 bool PerfTestArg(int *argc, char **argv, int argIndex)
56 {
57 return ParseFlag("--run-to-key-frame", argc, argv, argIndex, &gRunToKeyFrame) ||
58 ParseFlag("--enable-trace", argc, argv, argIndex, &gEnableTrace) ||
59 ParseFlag("-v", argc, argv, argIndex, &gVerboseLogging) ||
60 ParseFlag("--verbose", argc, argv, argIndex, &gVerboseLogging) ||
61 ParseFlag("--verbose-logging", argc, argv, argIndex, &gVerboseLogging) ||
62 ParseFlag("--no-finish", argc, argv, argIndex, &gNoFinish) ||
63 ParseFlag("--warmup", argc, argv, argIndex, &gWarmup) ||
64 ParseCStringArg("--trace-file", argc, argv, argIndex, &gTraceFile) ||
65 ParseCStringArg("--perf-counters", argc, argv, argIndex, &gPerfCounters) ||
66 ParseIntArg("--steps-per-trial", argc, argv, argIndex, &gStepsPerTrial) ||
67 ParseIntArg("--max-steps-performed", argc, argv, argIndex, &gMaxStepsPerformed) ||
68 ParseIntArg("--fixed-test-time", argc, argv, argIndex, &gFixedTestTime) ||
69 ParseIntArg("--fixed-test-time-with-warmup", argc, argv, argIndex,
70 &gFixedTestTimeWithWarmup) ||
71 ParseIntArg("--trial-time", argc, argv, argIndex, &gTrialTimeSeconds) ||
72 ParseIntArg("--max-trial-time", argc, argv, argIndex, &gTrialTimeSeconds) ||
73 ParseIntArg("--trials", argc, argv, argIndex, &gTestTrials);
74 }
75
TraceTestArg(int * argc,char ** argv,int argIndex)76 bool TraceTestArg(int *argc, char **argv, int argIndex)
77 {
78 return ParseFlag("--retrace-mode", argc, argv, argIndex, &gRetraceMode) ||
79 ParseFlag("--validation", argc, argv, argIndex, &gTraceTestValidation) ||
80 ParseFlag("--save-screenshots", argc, argv, argIndex, &gSaveScreenshots) ||
81 ParseFlag("--offscreen", argc, argv, argIndex, &gOffscreen) ||
82 ParseFlag("--vsync", argc, argv, argIndex, &gVsync) ||
83 ParseFlag("--minimize-gpu-work", argc, argv, argIndex, &gMinimizeGPUWork) ||
84 ParseCStringArg("--trace-interpreter", argc, argv, argIndex, &gTraceInterpreter) ||
85 ParseIntArg("--screenshot-frame", argc, argv, argIndex, &gScreenshotFrame) ||
86 ParseCStringArgWithHandling("--render-test-output-dir", argc, argv, argIndex,
87 &gRenderTestOutputDir, ArgHandling::Preserve) ||
88 ParseCStringArg("--screenshot-dir", argc, argv, argIndex, &gScreenshotDir) ||
89 ParseCStringArg("--use-angle", argc, argv, argIndex, &gUseANGLE) ||
90 ParseCStringArg("--use-gl", argc, argv, argIndex, &gUseGL) ||
91 ParseCStringArg("--print-extensions-to-file", argc, argv, argIndex,
92 &gPrintExtensionsToFile) ||
93 ParseCStringArg("--request-extensions", argc, argv, argIndex, &gRequestedExtensions) ||
94 ParseFlag("--include-inactive-resources", argc, argv, argIndex,
95 &gIncludeInactiveResources);
96 }
97 } // namespace
98 } // namespace angle
99
100 using namespace angle;
101
ANGLEProcessPerfTestArgs(int * argc,char ** argv)102 void ANGLEProcessPerfTestArgs(int *argc, char **argv)
103 {
104 for (int argIndex = 1; argIndex < *argc;)
105 {
106 if (!PerfTestArg(argc, argv, argIndex))
107 {
108 argIndex++;
109 }
110 }
111
112 if (gRunToKeyFrame || gMaxStepsPerformed > 0)
113 {
114 // Ensure defaults were provided for params we're about to set
115 ASSERT(gTestTrials == kDefaultTestTrials && gTrialTimeSeconds == kDefaultTrialTimeSeconds);
116
117 gTestTrials = 1;
118 gTrialTimeSeconds = 36000;
119 }
120
121 if (gFixedTestTime != 0)
122 {
123 // Ensure defaults were provided for params we're about to set
124 ASSERT(gTrialTimeSeconds == kDefaultTrialTimeSeconds &&
125 gStepsPerTrial == kDefaultStepsPerTrial && gTestTrials == kDefaultTestTrials);
126
127 gTrialTimeSeconds = gFixedTestTime;
128 gStepsPerTrial = std::numeric_limits<int>::max();
129 gTestTrials = 1;
130 }
131
132 if (gFixedTestTimeWithWarmup != 0)
133 {
134 // Ensure defaults were provided for params we're about to set
135 ASSERT(gTrialTimeSeconds == kDefaultTrialTimeSeconds &&
136 gStepsPerTrial == kDefaultStepsPerTrial && gTestTrials == kDefaultTestTrials);
137
138 // This option is primarily useful for trace replays when you want to iterate once through
139 // the trace to warm caches, then run for a fixed amount of time. It is equivalent to:
140 // --trial-time X --steps-per-trial INF --trials 1 --warmup
141 gTrialTimeSeconds = gFixedTestTimeWithWarmup;
142 gStepsPerTrial = std::numeric_limits<int>::max();
143 gTestTrials = 1;
144 gWarmup = true;
145 }
146
147 if (gTrialTimeSeconds == 0)
148 {
149 gTrialTimeSeconds = 10;
150 }
151 }
152
ANGLEProcessTraceTestArgs(int * argc,char ** argv)153 void ANGLEProcessTraceTestArgs(int *argc, char **argv)
154 {
155 ANGLEProcessPerfTestArgs(argc, argv);
156
157 for (int argIndex = 1; argIndex < *argc;)
158 {
159 if (!TraceTestArg(argc, argv, argIndex))
160 {
161 argIndex++;
162 }
163 }
164
165 if (gScreenshotDir)
166 {
167 // implicitly set here but not when using kRenderTestOutputDir
168 gSaveScreenshots = true;
169 }
170
171 if (gRenderTestOutputDir)
172 {
173 gScreenshotDir = gRenderTestOutputDir;
174 }
175
176 if (gTraceTestValidation)
177 {
178 gTestTrials = 1;
179 gTrialTimeSeconds = 600;
180 }
181 }
182