Index: client/deps/glbench/src/windowmanagertest.cc |
diff --git a/client/deps/glbench/src/windowmanagertest.cc b/client/deps/glbench/src/windowmanagertest.cc |
index 934fb10b12b0cfc15455c2eeff215165d591be95..2fb4541c63649479c45f3c14623ab58cc0e52fca 100644 |
--- a/client/deps/glbench/src/windowmanagertest.cc |
+++ b/client/deps/glbench/src/windowmanagertest.cc |
@@ -51,26 +51,31 @@ unsigned char* CreateBitmap(int w, int h) { |
const char kVertexShader[] = |
- "attribute vec4 c;" |
+ "attribute vec4 vertices;" |
"void main() {" |
- " gl_Position = c;" |
- " gl_TexCoord[0] = vec4(c.y, c.x, 0.0, 0.0);" |
+ " gl_Position = vertices;" |
+ " gl_TexCoord[0] = vec4(vertices.y, vertices.x, 0.0, 0.0);" |
"}"; |
const char kFragmentShader[] = |
"uniform sampler2D tex;" |
+ "uniform vec4 color;" |
"void main() {" |
- " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy);" |
+ " gl_FragColor = color * texture2D(tex, gl_TexCoord[0].xy);" |
"}"; |
- |
-// If refresh is set to zero, we enable vsync. Otherwise we redraw that many |
-// times a second. |
-DEFINE_int32(seconds_to_run, 10, "seconds to run application for"); |
+// Command line flags |
+DEFINE_double(screenshot1_sec, 2.f, "seconds delay before screenshot1_cmd"); |
+DEFINE_double(screenshot2_sec, 1.f, "seconds delay before screenshot2_cmd"); |
+DEFINE_string(screenshot1_cmd, "", "system command to take a screen shot 1"); |
+DEFINE_string(screenshot2_cmd, "", "system command to take a screen shot 2"); |
+DEFINE_double(cooldown_sec, 1.f, "seconds delay after all screenshots"); |
int main(int argc, char* argv[]) { |
+ // Configure full screen |
g_width = -1; |
g_height = -1; |
+ |
google::ParseCommandLineFlags(&argc, &argv, true); |
if (!Init()) { |
@@ -94,19 +99,64 @@ int main(int argc, char* argv[]) { |
}; |
GLuint program = InitShaderProgram(kVertexShader, kFragmentShader); |
- int attribute_index = glGetAttribLocation(program, "c"); |
+ int attribute_index = glGetAttribLocation(program, "vertices"); |
glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, vertices); |
glEnableVertexAttribArray(attribute_index); |
int texture_sampler = glGetUniformLocation(program, "tex"); |
- glUniform1f(texture_sampler, 0); |
+ glUniform1i(texture_sampler, 0); |
+ |
+ int display_color = glGetUniformLocation(program, "color"); |
+ float white[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
+ float blue[4] = {0.5f, 0.5f, 1.0f, 1.0f}; |
+ |
+ uint64_t last_event_time = GetUTime(); |
+ enum State { |
+ kStateScreenShot1, |
+ kStateScreenShot2, |
+ kStateCooldown, |
+ kStateExit |
+ } state = kStateScreenShot1; |
+ float seconds_delay_for_next_state[] = { |
+ FLAGS_screenshot1_sec, |
+ FLAGS_screenshot2_sec, |
+ FLAGS_cooldown_sec, |
+ 0 |
+ }; |
- uint64_t wait_until_done = GetUTime() + 1000000ULL * FLAGS_seconds_to_run; |
do { |
+ // Draw |
glClear(GL_COLOR_BUFFER_BIT); |
+ if (state == kStateScreenShot1) |
+ glUniform4fv(display_color, 1, white); |
+ else |
+ glUniform4fv(display_color, 1, blue); |
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
SwapBuffers(); |
- } while (GetUTime() < wait_until_done); |
+ |
+ // Loop until next event |
+ float seconds_since_last_event = |
+ static_cast<float>(GetUTime() - last_event_time) / 1000000ULL; |
+ if (seconds_since_last_event < seconds_delay_for_next_state[state]) |
+ continue; |
+ |
+ // State change. Perform action. |
+ switch(state) { |
+ case kStateScreenShot1: |
+ system(FLAGS_screenshot1_cmd.c_str()); |
+ break; |
+ case kStateScreenShot2: |
+ system(FLAGS_screenshot2_cmd.c_str()); |
+ break; |
+ default: |
+ break; |
+ } |
+ |
+ // Advance to next state |
+ last_event_time = GetUTime(); |
+ state = static_cast<State>(state + 1); |
+ |
+ } while (state != kStateExit); |
glDeleteTextures(1, &texture); |
DestroyContext(); |