summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2012-11-15 16:14:53 -0800
committerPaul Berry <stereotype441@gmail.com>2012-11-26 13:09:04 -0800
commit5c032680d944b44b0eda2754e1874baae7ba4721 (patch)
tree2d447b247e1a55cd1d85c073fd3e73a45c0c6106
parent1103e66f2487bdb4f19162b47d963d8eecf13364 (diff)
time-elapsed: Spend time in the FS rather than do a lot of draws.
The time-elapsed test needs to consume a lot of GPU time so that it can validate GPU time queries against elapsed wall-clock time. Previously we did this by painting the window thousands of times. That sometimes caused false failures due to the CPU time consumed in preparing the draw calls. This patch changes the test so that it consumes time by using a slow fragment shader rather than by painting the window over and over.
-rw-r--r--tests/spec/ext_timer_query/time-elapsed.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/tests/spec/ext_timer_query/time-elapsed.c b/tests/spec/ext_timer_query/time-elapsed.c
index 8b93d890..942d7375 100644
--- a/tests/spec/ext_timer_query/time-elapsed.c
+++ b/tests/spec/ext_timer_query/time-elapsed.c
@@ -41,11 +41,51 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
PIGLIT_GL_TEST_CONFIG_END
+static char *vs_text =
+ "#version 110\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = gl_Vertex;\n"
+ "}\n";
+
+/**
+ * Time-wasting fragment shader. This fragment shader computes:
+ *
+ * x = (sum(i=0..(iters-1): 2*i) % iters) / iters
+ *
+ * This value should always work out to 0.0, but it's highly unlikely
+ * that an optimizer will figure this out. Hence we can use this
+ * shader to waste an arbitrary amount of time (by suitable choice of
+ * the value of iters).
+ *
+ * The shader outputs a color of (x, 1.0, 0.0, 0.0).
+ */
+static char *fs_text =
+ "#version 110\n"
+ "uniform int iters;\n"
+ "void main()\n"
+ "{\n"
+ " int cumulative_sum = 0;\n"
+ " for (int i = 0; i < iters; ++i) {\n"
+ " cumulative_sum += i;\n"
+ " if (cumulative_sum >= iters)\n"
+ " cumulative_sum -= iters;\n"
+ " cumulative_sum += i;\n"
+ " if (cumulative_sum >= iters)\n"
+ " cumulative_sum -= iters;\n"
+ " }\n"
+ " float x = float(cumulative_sum) / float(iters);\n"
+ " gl_FragColor = vec4(x, 1.0, 0.0, 0.0);\n"
+ "}\n";
+
enum {
TIME_ELAPSED,
TIMESTAMP
} test = TIME_ELAPSED;
+GLuint prog;
+GLint iters_loc;
+
static float
get_time(void)
{
@@ -72,7 +112,9 @@ static float
draw(GLuint *q, int iters)
{
float start_time, end_time;
- int i;
+
+ glUseProgram(prog);
+ glUniform1i(iters_loc, iters);
start_time = get_time();
@@ -81,9 +123,7 @@ draw(GLuint *q, int iters)
} else {
glBeginQuery(GL_TIME_ELAPSED, q[0]);
}
- for (i = 0; i < iters; i++) {
- piglit_draw_rect(-1, -1, 2, 2);
- }
+ piglit_draw_rect(-1, -1, 2, 2);
if (test == TIMESTAMP) {
glQueryCounter(q[1], GL_TIMESTAMP);
} else {
@@ -270,8 +310,17 @@ retry:
void
piglit_init(int argc, char **argv)
{
+ GLint vs, fs;
+
piglit_require_gl_version(20);
+ vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text);
+ fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_text);
+ prog = piglit_link_simple_program(vs, fs);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+ iters_loc = glGetUniformLocation(prog, "iters");
+
piglit_require_extension("GL_EXT_timer_query");
if (argc == 2 && strcmp(argv[1], "timestamp") == 0) {