OLD | NEW |
| (Empty) |
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 "main.h" | |
6 #include "testbase.h" | |
7 | |
8 uint64_t TimeTest(glbench::TestBase* test, int iter) { | |
9 SwapBuffers(); | |
10 glFinish(); | |
11 uint64_t time1 = GetUTime(); | |
12 test->TestFunc(iter); | |
13 glFinish(); | |
14 uint64_t time2 = GetUTime(); | |
15 return time2 - time1; | |
16 } | |
17 | |
18 // Benchmark some draw commands, by running it many times. | |
19 // We want to measure the marginal cost, so we try more and more iterations | |
20 // until we get a somewhat linear response (to eliminate constant cost), and we | |
21 // do a linear regression on a few samples. | |
22 bool Bench(glbench::TestBase* test, float *slope, int64_t *bias) { | |
23 // Do one iteration in case the driver needs to set up states. | |
24 if (TimeTest(test, 1) > MAX_ITERATION_DURATION_MS) | |
25 return false; | |
26 int64_t count = 0; | |
27 int64_t sum_x = 0; | |
28 int64_t sum_y = 0; | |
29 int64_t sum_xy = 0; | |
30 int64_t sum_x2 = 0; | |
31 uint64_t last_time = 0; | |
32 bool do_count = false; | |
33 uint64_t iter; | |
34 for (iter = 8; iter < 1<<30; iter *= 2) { | |
35 uint64_t time = TimeTest(test, iter); | |
36 if (last_time > 0 && (time > last_time * 1.8)) | |
37 do_count = true; | |
38 last_time = time; | |
39 if (do_count) { | |
40 ++count; | |
41 sum_x += iter; | |
42 sum_y += time; | |
43 sum_xy += iter * time; | |
44 sum_x2 += iter * iter; | |
45 } | |
46 if ((time >= 500000 && count > 4)) | |
47 break; | |
48 } | |
49 if (count < 2) { | |
50 *slope = 0.f; | |
51 *bias = 0; | |
52 } | |
53 *slope = static_cast<float>(sum_x * sum_y - count * sum_xy) / | |
54 (sum_x * sum_x - count * sum_x2); | |
55 *bias = (sum_x * sum_xy - sum_x2 * sum_y) / (sum_x * sum_x - count * sum_x2); | |
56 return true; | |
57 } | |
OLD | NEW |