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