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