• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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