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 namespace angle
15 {
16 bool gCalibration              = false;
17 int gStepsPerTrial             = 0;
18 int gMaxStepsPerformed         = 0;
19 bool gEnableTrace              = false;
20 const char *gTraceFile         = "ANGLETrace.json";
21 const char *gScreenShotDir     = nullptr;
22 int gScreenShotFrame           = 1;
23 bool gVerboseLogging           = false;
24 double gCalibrationTimeSeconds = 1.0;
25 double gMaxTrialTimeSeconds    = 10.0;
26 int gTestTrials                = 3;
27 bool gNoFinish                 = false;
28 bool gEnableAllTraceTests      = false;
29 bool gRetraceMode              = false;
30 bool gMinimizeGPUWork          = false;
31 
32 // Default to three warmup loops. There's no science to this. More than two loops was experimentally
33 // helpful on a Windows NVIDIA setup when testing with Vulkan and native trace tests.
34 int gWarmupLoops = 3;
35 }  // namespace angle
36 
37 namespace
38 {
ReadIntArgument(const char * arg)39 int ReadIntArgument(const char *arg)
40 {
41     std::stringstream strstr;
42     strstr << arg;
43 
44     int value;
45     strstr >> value;
46     return value;
47 }
48 
49 // The same as --screenshot-dir, but used by Chrome tests.
50 constexpr char kRenderTestDirArg[] = "--render-test-output-dir=";
51 }  // namespace
52 
53 using namespace angle;
54 
ANGLEProcessPerfTestArgs(int * argc,char ** argv)55 void ANGLEProcessPerfTestArgs(int *argc, char **argv)
56 {
57     for (int argIndex = 0; argIndex < *argc; argIndex++)
58     {
59         if (strcmp("--one-frame-only", argv[argIndex]) == 0)
60         {
61             gStepsPerTrial = 1;
62             gWarmupLoops   = 0;
63         }
64         else if (strcmp("--enable-trace", argv[argIndex]) == 0)
65         {
66             gEnableTrace = true;
67         }
68         else if (strcmp("--trace-file", argv[argIndex]) == 0 && argIndex < *argc - 1)
69         {
70             gTraceFile = argv[argIndex + 1];
71             // Skip an additional argument.
72             argIndex++;
73         }
74         else if (strcmp("--calibration", argv[argIndex]) == 0)
75         {
76             gCalibration = true;
77             gTestTrials  = 0;
78         }
79         else if (strcmp("--steps-per-trial", argv[argIndex]) == 0 && argIndex < *argc - 1)
80         {
81             gStepsPerTrial = ReadIntArgument(argv[argIndex + 1]);
82             // Skip an additional argument.
83             argIndex++;
84         }
85         else if (strcmp("--max-steps-performed", argv[argIndex]) == 0 && argIndex < *argc - 1)
86         {
87             gMaxStepsPerformed   = ReadIntArgument(argv[argIndex + 1]);
88             gWarmupLoops         = 0;
89             gTestTrials          = 1;
90             gMaxTrialTimeSeconds = 36000;
91             // Skip an additional argument.
92             argIndex++;
93         }
94         else if (strcmp("--fixed-test-time", argv[argIndex]) == 0 && argIndex < *argc - 1)
95         {
96             gMaxTrialTimeSeconds = ReadIntArgument(argv[argIndex + 1]);
97             gStepsPerTrial       = std::numeric_limits<int>::max();
98             gTestTrials          = 1;
99             gWarmupLoops         = 0;
100             // Skip an additional argument.
101             argIndex++;
102         }
103         else if (strcmp("--screenshot-dir", argv[argIndex]) == 0 && argIndex < *argc - 1)
104         {
105             gScreenShotDir = argv[argIndex + 1];
106             argIndex++;
107         }
108         else if (strcmp("--screenshot-frame", argv[argIndex]) == 0 && argIndex < *argc - 1)
109         {
110             gScreenShotFrame = ReadIntArgument(argv[argIndex + 1]);
111             argIndex++;
112         }
113         else if (strcmp("--verbose-logging", argv[argIndex]) == 0 ||
114                  strcmp("--verbose", argv[argIndex]) == 0 || strcmp("-v", argv[argIndex]) == 0)
115         {
116             gVerboseLogging = true;
117         }
118         else if (strcmp("--warmup-loops", argv[argIndex]) == 0)
119         {
120             gWarmupLoops = ReadIntArgument(argv[argIndex + 1]);
121             // Skip an additional argument.
122             argIndex++;
123         }
124         else if (strcmp("--no-warmup", argv[argIndex]) == 0)
125         {
126             gWarmupLoops = 0;
127         }
128         else if (strncmp(kRenderTestDirArg, argv[argIndex], strlen(kRenderTestDirArg)) == 0)
129         {
130             gScreenShotDir = argv[argIndex] + strlen(kRenderTestDirArg);
131         }
132         else if (strcmp("--calibration-time", argv[argIndex]) == 0)
133         {
134             gCalibrationTimeSeconds = ReadIntArgument(argv[argIndex + 1]);
135             // Skip an additional argument.
136             argIndex++;
137         }
138         else if (strcmp("--max-trial-time", argv[argIndex]) == 0)
139         {
140             gMaxTrialTimeSeconds = ReadIntArgument(argv[argIndex + 1]);
141             // Skip an additional argument.
142             argIndex++;
143         }
144         else if (strcmp("--trials", argv[argIndex]) == 0)
145         {
146             gTestTrials = ReadIntArgument(argv[argIndex + 1]);
147             // Skip an additional argument.
148             argIndex++;
149         }
150         else if (strcmp("--no-finish", argv[argIndex]) == 0)
151         {
152             gNoFinish = true;
153         }
154         else if (strcmp("--enable-all-trace-tests", argv[argIndex]) == 0)
155         {
156             gEnableAllTraceTests = true;
157         }
158         else if (strcmp("--retrace-mode", argv[argIndex]) == 0)
159         {
160             gRetraceMode = true;
161         }
162         else if (strcmp("--minimize-gpu-work", argv[argIndex]) == 0)
163         {
164             gMinimizeGPUWork = true;
165         }
166     }
167 }
168