| Index: client/deps/glbench/src/testbase.cc
|
| diff --git a/client/deps/glbench/src/testbase.cc b/client/deps/glbench/src/testbase.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..48a2fc4df91386b6e6bf8640e08e387068b54c25
|
| --- /dev/null
|
| +++ b/client/deps/glbench/src/testbase.cc
|
| @@ -0,0 +1,141 @@
|
| +// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include "testbase.h"
|
| +
|
| +namespace glbench {
|
| +
|
| +uint64_t TimeTest(TestBase* test, int iter) {
|
| + SwapBuffers();
|
| + glFinish();
|
| + uint64_t time1 = GetUTime();
|
| + test->TestFunc(iter);
|
| + glFinish();
|
| + uint64_t time2 = GetUTime();
|
| + return time2 - time1;
|
| +}
|
| +
|
| +#define MAX_ITERATION_DURATION_MS 100000
|
| +
|
| +// Benchmark some draw commands, by running it many times.
|
| +// We want to measure the marginal cost, so we try more and more iterations
|
| +// until we get a somewhat linear response (to eliminate constant cost), and we
|
| +// do a linear regression on a few samples.
|
| +bool Bench(TestBase* test, float *slope, int64_t *bias) {
|
| + // Do one iteration in case the driver needs to set up states.
|
| + if (TimeTest(test, 1) > MAX_ITERATION_DURATION_MS)
|
| + return false;
|
| + int64_t count = 0;
|
| + int64_t sum_x = 0;
|
| + int64_t sum_y = 0;
|
| + int64_t sum_xy = 0;
|
| + int64_t sum_x2 = 0;
|
| + uint64_t last_time = 0;
|
| + bool do_count = false;
|
| + uint64_t iter;
|
| + for (iter = 8; iter < 1<<30; iter *= 2) {
|
| + uint64_t time = TimeTest(test, iter);
|
| + if (last_time > 0 && (time > last_time * 1.8))
|
| + do_count = true;
|
| + last_time = time;
|
| + if (do_count) {
|
| + ++count;
|
| + sum_x += iter;
|
| + sum_y += time;
|
| + sum_xy += iter * time;
|
| + sum_x2 += iter * iter;
|
| + }
|
| + if ((time >= 500000 && count > 4))
|
| + break;
|
| + }
|
| + if (count < 2) {
|
| + *slope = 0.f;
|
| + *bias = 0;
|
| + }
|
| + *slope = static_cast<float>(sum_x * sum_y - count * sum_xy) /
|
| + (sum_x * sum_x - count * sum_x2);
|
| + *bias = (sum_x * sum_xy - sum_x2 * sum_y) / (sum_x * sum_x - count * sum_x2);
|
| + return true;
|
| +}
|
| +
|
| +void RunTest(TestBase* test, const char *name,
|
| + float coefficient, bool inverse) {
|
| + float slope;
|
| + int64_t bias;
|
| +
|
| + GLenum err = glGetError();
|
| + if (err != 0) {
|
| + printf("# %s failed, glGetError returned 0x%x.\n", name, err);
|
| + // float() in python will happily parse Nan.
|
| + printf("%s: Nan\n", name);
|
| + } else {
|
| + if (Bench(test, &slope, &bias)) {
|
| + printf("%s: %g\n", name, coefficient * (inverse ? 1.f / slope : slope));
|
| + } else {
|
| + printf("# %s is too slow, returning zero.\n", name);
|
| + printf("%s: 0\n", name);
|
| + }
|
| + }
|
| +}
|
| +
|
| +bool DrawArraysTestFunc::TestFunc(int iter) {
|
| + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| + glFlush();
|
| + for (int i = 0; i < iter-1; ++i) {
|
| + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +
|
| +void DrawArraysTestFunc::FillRateTestNormal(const char* name) {
|
| + FillRateTestNormalSubWindow(name, g_width, g_height);
|
| +}
|
| +
|
| +
|
| +void DrawArraysTestFunc::FillRateTestNormalSubWindow(const char* name,
|
| + float width, float height)
|
| +{
|
| + const int buffer_len = 64;
|
| + char buffer[buffer_len];
|
| + snprintf(buffer, buffer_len, "mpixels_sec_%s", name);
|
| + RunTest(this, buffer, width * height, true);
|
| +}
|
| +
|
| +
|
| +#ifndef USE_EGL
|
| +void DrawArraysTestFunc::FillRateTestBlendDepth(const char *name) {
|
| + const int buffer_len = 64;
|
| + char buffer[buffer_len];
|
| +
|
| + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
| + glEnable(GL_BLEND);
|
| + snprintf(buffer, buffer_len, "mpixels_sec_%s_blended", name);
|
| + RunTest(this, buffer, g_width * g_height, true);
|
| + glDisable(GL_BLEND);
|
| +
|
| + glEnable(GL_DEPTH_TEST);
|
| + glDepthFunc(GL_NOTEQUAL);
|
| + snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_neq", name);
|
| + RunTest(this, buffer, g_width * g_height, true);
|
| + glDepthFunc(GL_NEVER);
|
| + snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_never", name);
|
| + RunTest(this, buffer, g_width * g_height, true);
|
| + glDisable(GL_DEPTH_TEST);
|
| +}
|
| +#endif
|
| +
|
| +
|
| +bool DrawElementsTestFunc::TestFunc(int iter) {
|
| + glDrawElements(GL_TRIANGLES, count_, GL_UNSIGNED_INT, 0);
|
| + glFlush();
|
| + for (int i = 0 ; i < iter-1; ++i) {
|
| + glDrawElements(GL_TRIANGLES, count_, GL_UNSIGNED_INT, 0);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace glbench
|
|
|