blob: eac5e15f60e12e3b326dd75d80985da712f788c1 [file] [log] [blame]
Alexey Marinichev592b8622010-02-04 15:20:10 -08001// 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
Alexey Marinichevf50ecb12010-06-14 15:21:41 -07005#include <gflags/gflags.h>
Alexey Marinichev592b8622010-02-04 15:20:10 -08006#include <stdio.h>
7#include <stdlib.h>
Ilja H. Friedel8faad302011-04-26 14:40:49 -07008#include <string.h>
9#include <ctime>
Alexey Marinichev592b8622010-02-04 15:20:10 -080010
Alexey Marinichevaf0b26d2010-02-24 13:03:13 -080011#include "base/logging.h"
Alexey Marinichevf50ecb12010-06-14 15:21:41 -070012#include "base/string_util.h"
Ilja H. Friedel8faad302011-04-26 14:40:49 -070013#include "base/string_split.h"
Alexey Marinichevaf0b26d2010-02-24 13:03:13 -080014
Simon Que7f840e72012-12-19 12:05:42 -080015#include "glinterface.h"
Alexey Marinichev592b8622010-02-04 15:20:10 -080016#include "main.h"
Alexey Marinichev3c199732010-03-11 10:33:35 -080017#include "utils.h"
Alexey Marinichev592b8622010-02-04 15:20:10 -080018
Alexey Marinichev9f9b8732010-05-20 19:33:44 -070019#include "all_tests.h"
20#include "testbase.h"
21
Alexey Marinichevf50ecb12010-06-14 15:21:41 -070022using std::string;
23using std::vector;
Alexey Marinichev592b8622010-02-04 15:20:10 -080024
Ilja Friedel6f72b2b2014-04-11 05:47:22 +000025DEFINE_int32(duration, 0, "run tests in a loop for at least this many seconds");
26DEFINE_string(tests, "", "colon-separated list of tests to run; "
27 "all tests if omitted");
Daniel Kurtz980f3242013-04-01 00:45:50 +080028DEFINE_string(blacklist, "", "colon-separated list of tests to disable");
Alexey Marinichev19b5a5d2010-02-18 11:37:26 -080029
Alexey Marinichevf50ecb12010-06-14 15:21:41 -070030bool test_is_enabled(glbench::TestBase* test,
31 const vector<string>& enabled_tests) {
32 if (enabled_tests.empty())
33 return true;
34
35 const char* test_name = test->Name();
36 for (vector<string>::const_iterator i = enabled_tests.begin();
37 i != enabled_tests.end(); ++i) {
38 // This is not very precise, but will do until there's a need for something
39 // more flexible.
40 if (strstr(test_name, i->c_str()))
41 return true;
Alexey Marinichev19b5a5d2010-02-18 11:37:26 -080042 }
Alexey Marinichev19b5a5d2010-02-18 11:37:26 -080043
Alexey Marinichevf50ecb12010-06-14 15:21:41 -070044 return false;
45}
Alexey Marinichev19b5a5d2010-02-18 11:37:26 -080046
Daniel Kurtz980f3242013-04-01 00:45:50 +080047bool test_is_disabled(glbench::TestBase* test,
48 const vector<string>& disabled_tests) {
49 if (disabled_tests.empty())
50 return false;
51
52 const char* test_name = test->Name();
53 for (vector<string>::const_iterator i = disabled_tests.begin();
54 i != disabled_tests.end(); ++i) {
55 // This is not very precise, but will do until there's a need for something
56 // more flexible.
57 if (strstr(test_name, i->c_str()))
58 return true;
59 }
60
61 return false;
62}
63
Ilja H. Friedel8faad302011-04-26 14:40:49 -070064void printDateTime(void) {
65 struct tm *ttime;
66 time_t tm = time(0);
67 char time_string[64];
68 ttime = localtime(&tm);
69 strftime(time_string, 63, "%c",ttime);
70 printf("# DateTime: %s\n", time_string);
71}
72
Ilja Friedelc04bdd42013-01-30 18:55:49 -080073bool PassesSanityCheck(void) {
Ilja Friedel6f72b2b2014-04-11 05:47:22 +000074 GLint viewport[2];
75 glGetIntegerv(GL_MAX_VIEWPORT_DIMS, viewport);
76 printf("# MAX_VIEWPORT_DIMS=(%d, %d)\n", viewport[0], viewport[1]);
77 if (viewport[0] < g_width || viewport[1] < g_height) {
Ilja Friedelc04bdd42013-01-30 18:55:49 -080078 printf("# Error: MAX_VIEWPORT_DIMS=(%d, %d) are too small.\n",
Ilja Friedel6f72b2b2014-04-11 05:47:22 +000079 viewport[0], viewport[1]);
Ilja Friedelc04bdd42013-01-30 18:55:49 -080080 return false;
81 }
82 return true;
83}
84
Alexey Marinichev592b8622010-02-04 15:20:10 -080085int main(int argc, char *argv[]) {
Antoine Labourec7eb532010-03-12 11:01:34 -080086 SetBasePathFromArgv0(argv[0], "src");
Ilja H. Friedel8faad302011-04-26 14:40:49 -070087 google::ParseCommandLineFlags(&argc, &argv, false);
Simon Que7f840e72012-12-19 12:05:42 -080088
89 g_main_gl_interface.reset(GLInterface::Create());
90 if (!g_main_gl_interface->Init()) {
Ilja H. Friedel8faad302011-04-26 14:40:49 -070091 printf("# Error: Failed to initialize %s.\n", argv[0]);
Alexey Marinichev592b8622010-02-04 15:20:10 -080092 return 1;
93 }
94
Alexey Marinichev0f3605d2010-08-25 14:31:19 -070095 printf("# board_id: %s - %s\n",
Alexey Marinichevc587a0e2010-07-14 14:51:12 -070096 glGetString(GL_VENDOR), glGetString(GL_RENDERER));
Ilja Friedel1b180392013-03-12 17:09:06 -070097 if (!PassesSanityCheck())
98 return 1;
Simon Que06860822012-12-18 13:17:56 -080099 g_main_gl_interface->Cleanup();
Alexey Marinichev1876c6c2010-06-28 12:41:05 -0700100
Ilja H. Friedel8faad302011-04-26 14:40:49 -0700101 if (argc == 1) {
102 printf("# Usage: %s [-save [-outdir=<directory>]] to save images\n", argv[0]);
103 } else {
104 printf("# Running: ");
105 for (int i = 0; i < argc; i++) printf("%s ", argv[i]);
106 printf("\n");
107 }
108 printDateTime();
Alexey Marinichevf50ecb12010-06-14 15:21:41 -0700109
Daniel Kurtz980f3242013-04-01 00:45:50 +0800110 vector<string> enabled_tests, disabled_tests;
Ilja H. Friedel8faad302011-04-26 14:40:49 -0700111 base::SplitString(FLAGS_tests, ':', &enabled_tests);
Daniel Kurtz980f3242013-04-01 00:45:50 +0800112 base::SplitString(FLAGS_blacklist, ':', &disabled_tests);
Alexey Marinichev9f9b8732010-05-20 19:33:44 -0700113 glbench::TestBase* tests[] = {
Ilja Friedelb4efb4a2014-04-07 22:58:10 -0700114 glbench::GetSwapTest(),
Ilja Friedel6f72b2b2014-04-11 05:47:22 +0000115 glbench::GetContextTest(),
116 glbench::GetClearTest(),
117 glbench::GetFillRateTest(),
118 glbench::GetWindowManagerCompositingTest(false),
119 glbench::GetWindowManagerCompositingTest(true),
120 glbench::GetTriangleSetupTest(),
121 glbench::GetYuvToRgbTest(),
122 glbench::GetReadPixelTest(),
123 glbench::GetAttributeFetchShaderTest(),
124 glbench::GetVaryingsAndDdxyShaderTest(),
Simon Que3562e0a2012-12-28 12:01:12 -0800125 glbench::GetTextureReuseTest(),
Alexey Marinichev9c891ef2010-05-21 15:28:59 -0700126 glbench::GetTextureUpdateTest(),
Simon Quecd8cfe32012-12-27 10:37:45 -0800127 glbench::GetTextureUploadTest(),
Alexey Marinichev592b8622010-02-04 15:20:10 -0800128 };
129
Alexey Marinichevf50ecb12010-06-14 15:21:41 -0700130 uint64_t done = GetUTime() + 1000000ULL * FLAGS_duration;
131 do {
132 for (unsigned int i = 0; i < arraysize(tests); i++) {
Daniel Kurtz980f3242013-04-01 00:45:50 +0800133 if (!test_is_enabled(tests[i], enabled_tests) ||
134 test_is_disabled(tests[i], disabled_tests))
Alexey Marinichevf50ecb12010-06-14 15:21:41 -0700135 continue;
Simon Que06860822012-12-18 13:17:56 -0800136 if (!g_main_gl_interface->Init()) {
137 printf("Initialize failed\n");
Stuart Abercrombieddd7fae2012-06-04 11:55:24 -0700138 return 1;
139 }
Stuart Abercrombie7a3fa0b2012-07-30 17:47:40 -0700140 glbench::ClearBuffers();
Alexey Marinichevf50ecb12010-06-14 15:21:41 -0700141 tests[i]->Run();
Simon Que06860822012-12-18 13:17:56 -0800142 g_main_gl_interface->Cleanup();
Alexey Marinichevf50ecb12010-06-14 15:21:41 -0700143 }
144 } while (GetUTime() < done);
145
Alexey Marinichev9f9b8732010-05-20 19:33:44 -0700146 for (unsigned int i = 0; i < arraysize(tests); i++) {
Alexey Marinichev9f9b8732010-05-20 19:33:44 -0700147 delete tests[i];
148 tests[i] = NULL;
149 }
Alexey Marinichev592b8622010-02-04 15:20:10 -0800150
Ilja H. Friedel8faad302011-04-26 14:40:49 -0700151 printDateTime();
152
Alexey Marinichev592b8622010-02-04 15:20:10 -0800153 return 0;
154}