• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <gflags/gflags.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <ctime>
10 
11 #include "base/logging.h"
12 #include "base/strings/string_split.h"
13 #include "base/strings/string_util.h"
14 
15 #include "glinterface.h"
16 #include "main.h"
17 #include "utils.h"
18 
19 #include "all_tests.h"
20 #include "testbase.h"
21 
22 using std::string;
23 using std::vector;
24 
25 DEFINE_int32(duration, 0,
26              "Run all tests again and again in a loop for at least this many seconds.");
27 DEFINE_string(tests, "",
28               "Colon-separated list of tests to run; all tests if omitted.");
29 DEFINE_string(blacklist, "", "colon-separated list of tests to disable");
30 DEFINE_bool(hasty, false,
31             "Run a smaller set of tests with less accurate results. "
32             "Useful for running in BVT or debugging a failure.  Implies notemp");
33 DEFINE_bool(list, false, "List available tests");
34 DEFINE_bool(notemp, false, "Skip temperature checking");
35 DEFINE_bool(verbose, false, "Print extra debugging messages");
36 
37 bool g_verbose;
38 GLint g_max_texture_size;
39 bool g_hasty;
40 bool g_notemp;
41 
test_is_enabled(glbench::TestBase * test,const vector<string> & enabled_tests)42 bool test_is_enabled(glbench::TestBase* test,
43                      const vector<string>& enabled_tests) {
44   if (enabled_tests.empty())
45     return true;
46 
47   const char* test_name = test->Name();
48   for (vector<string>::const_iterator i = enabled_tests.begin();
49        i != enabled_tests.end(); ++i) {
50     // This is not very precise, but will do until there's a need for something
51     // more flexible.
52     if (strstr(test_name, i->c_str()))
53       return true;
54   }
55 
56   return false;
57 }
58 
test_is_disabled(glbench::TestBase * test,const vector<string> & disabled_tests)59 bool test_is_disabled(glbench::TestBase* test,
60                      const vector<string>& disabled_tests) {
61   if (disabled_tests.empty())
62     return false;
63 
64   const char* test_name = test->Name();
65   for (vector<string>::const_iterator i = disabled_tests.begin();
66        i != disabled_tests.end(); ++i) {
67     // This is not very precise, but will do until there's a need for something
68     // more flexible.
69     if (strstr(test_name, i->c_str()))
70       return true;
71   }
72 
73   return false;
74 }
75 
printDateTime(void)76 void printDateTime(void) {
77   struct tm *ttime;
78   time_t tm = time(0);
79   char time_string[64];
80   ttime = localtime(&tm);
81   strftime(time_string, 63, "%c",ttime);
82   printf("# DateTime: %s\n", time_string);
83 }
84 
PassesSanityCheck(void)85 bool PassesSanityCheck(void) {
86   GLint size[2];
87   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, size);
88   printf("# MAX_VIEWPORT_DIMS=(%d, %d)\n", size[0], size[1]);
89   if (size[0] < g_width || size[1] < g_height) {
90     printf("# Error: MAX_VIEWPORT_DIMS=(%d, %d) are too small.\n",
91            size[0], size[1]);
92     return false;
93   }
94   glGetIntegerv(GL_MAX_TEXTURE_SIZE, size);
95   printf("# GL_MAX_TEXTURE_SIZE=%d\n", size[0]);
96   if (size[0] < g_width || size[0] < g_height) {
97     printf("# Error: MAX_TEXTURE_SIZE=%d is too small.\n",
98            size[0]);
99     return false;
100   }
101   g_max_texture_size = size[0];
102 
103   return true;
104 }
105 
main(int argc,char * argv[])106 int main(int argc, char *argv[]) {
107   SetBasePathFromArgv0(argv[0], "src");
108   google::ParseCommandLineFlags(&argc, &argv, false);
109 
110   g_verbose = FLAGS_verbose;
111 
112   g_main_gl_interface.reset(GLInterface::Create());
113   if (!g_main_gl_interface->Init()) {
114     printf("# Error: Failed to initialize %s.\n", argv[0]);
115     return 1;
116   }
117 
118   printf("# board_id: %s - %s\n",
119          glGetString(GL_VENDOR), glGetString(GL_RENDERER));
120   if (!PassesSanityCheck())
121     return 1;
122   g_main_gl_interface->Cleanup();
123 
124   if (argc == 1) {
125     printf("# Usage: %s [-save [-outdir=<directory>]] to save images\n", argv[0]);
126   } else {
127     printf("# Running: ");
128     for (int i = 0; i < argc; i++) printf("%s ", argv[i]);
129     printf("\n");
130   }
131   printDateTime();
132 
133   g_hasty = FLAGS_hasty;
134   g_notemp = FLAGS_notemp || g_hasty;
135 
136   if (!g_notemp)
137     g_initial_temperature = GetMachineTemperature();
138 
139   vector<string> enabled_tests =
140       base::SplitString(FLAGS_tests, ":", base::TRIM_WHITESPACE,
141                         base::SPLIT_WANT_ALL);
142   vector<string> disabled_tests =
143       base::SplitString(FLAGS_blacklist, ":", base::TRIM_WHITESPACE,
144                         base::SPLIT_WANT_ALL);
145 
146   glbench::TestBase* tests[] = {
147     // Please add new tests at the end of this list as tests are known to bleed
148     // state. Reordering them or inserting a new test may cause a change in the
149     // output images and MD5 causing graphics_GLBench failures.
150     // TODO(ihf): Fix this.
151     glbench::GetSwapTest(),
152     glbench::GetContextTest(),
153     glbench::GetClearTest(),
154     glbench::GetFillRateTest(),
155     glbench::GetWindowManagerCompositingTest(false),
156     glbench::GetWindowManagerCompositingTest(true),
157     glbench::GetTriangleSetupTest(),
158     glbench::GetYuvToRgbTest(),
159     glbench::GetReadPixelTest(),
160     glbench::GetAttributeFetchShaderTest(),
161     glbench::GetVaryingsAndDdxyShaderTest(),
162     glbench::GetTextureReuseTest(),
163     glbench::GetTextureUpdateTest(),
164     glbench::GetTextureUploadTest(),
165     glbench::GetFboFillRateTest(),
166   };
167 
168   if (FLAGS_list) {
169     for (unsigned int i = 0; i < arraysize(tests); i++)
170       printf("%s\n", tests[i]->Name());
171     return 0;
172   }
173 
174   uint64_t done = GetUTime() + 1000000ULL * FLAGS_duration;
175   do {
176     for (unsigned int i = 0; i < arraysize(tests); i++) {
177       if (!test_is_enabled(tests[i], enabled_tests) ||
178           test_is_disabled(tests[i], disabled_tests))
179         continue;
180       if (!g_main_gl_interface->Init()) {
181         printf("Initialize failed\n");
182         return 1;
183       }
184       glbench::ClearBuffers();
185       tests[i]->Run();
186       g_main_gl_interface->Cleanup();
187     }
188   } while (GetUTime() < done);
189 
190   for (unsigned int i = 0; i < arraysize(tests); i++) {
191     delete tests[i];
192     tests[i] = NULL;
193   }
194 
195   printDateTime();
196   // Signal to harness that we finished normally.
197   printf("@TEST_END\n");
198 
199   return 0;
200 }
201