xref: /aosp_15_r20/external/angle/src/tests/perf_tests/ANGLEPerfTestArgs.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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