=== added file 'data/fade.frag'
@@ -0,0 +1,14 @@
+#ifdef GL_ES
+precision mediump float;
+#endif
+
+uniform float alpha_bias;
+uniform sampler2D Texture0;
+varying vec2 TextureCoord;
+
+void main(void)
+{
+ float alpha = 1.0 - alpha_bias;
+ vec4 texel = texture2D(Texture0, TextureCoord);
+ gl_FragColor = vec4(texel.xyz, alpha);
+}
=== added file 'src/composite-test-simple-fade.cc'
@@ -0,0 +1,128 @@
+/*
+ * Copyright © 2011 Linaro Limited
+ *
+ * This file is part of glcompbench.
+ *
+ * glcompbench is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * glcompbench is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with glcompbench. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ * Alexandros Frantzis <alexandros.frantzis@linaro.org>
+ * Jesse Barker <jesse.barker@linaro.org>
+ */
+
+#include "gl-headers.h"
+#include "composite-test.h"
+#include "options.h"
+#include "log.h"
+#include <sstream>
+
+using std::string;
+
+const string CompositeTestSimpleFade::fade_bias_name_("alpha_bias");
+
+// We want to fade smoothly across the test duration, so take a timestamp
+// at the beginning of the test (beginning of the first draw), and take one
+// each time we'll update the fade bias to see if we should. We know based
+// upon the fade increment constant how many times we should fade.
+class Fader
+{
+ uint64_t start_time_;
+ uint64_t last_eof_;
+ float bias_;
+ float duration_;
+ Fader();
+public:
+ Fader(const string& duration) :
+ last_eof_(0),
+ bias_(0.0)
+ {
+ // Convert the string representation of the duration in seconds
+ // to microseconds as that's what we'll need to track the time.
+ std::stringstream ss(duration);
+ ss >> duration_;
+ duration_ *= 1000000;
+ start_time_ = Profiler::get_timestamp_us();
+ }
+ ~Fader() {}
+ void update()
+ {
+ last_eof_ = Profiler::get_timestamp_us();
+ uint64_t howLong(last_eof_ - start_time_);
+ if (howLong < duration_)
+ {
+ // Still inside of the test duration. Compute the bias.
+ bias_ = howLong / duration_;
+ return;
+ }
+ // Reset back to the beginning.
+ start_time_ = last_eof_;
+ bias_ = 0.0;
+ }
+ float bias() const { return bias_; }
+};
+
+void
+CompositeTestSimpleFade::draw(std::list<CompositeWindow *> &window_list)
+{
+ vboData_.bind();
+ glActiveTexture(GL_TEXTURE0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Set up the position of the attributes in the vertex array */
+ glVertexAttribPointer(vertexIndex_, 3, GL_FLOAT, GL_FALSE, 0, vboData_.vertexOffset());
+ glVertexAttribPointer(texcoordIndex_, 2, GL_FLOAT, GL_FALSE, 0, vboData_.texcoordOffset());
+
+ /* Enable the attributes */
+ glEnableVertexAttribArray(vertexIndex_);
+ glEnableVertexAttribArray(texcoordIndex_);
+
+ program_[projection_matrix_name_] = projection_matrix.getCurrent();
+ static Fader fader(options_["duration"].value);
+ program_[fade_bias_name_] = fader.bias();
+
+ /* Find out how many windows are visible and calculate the angular step */
+ GLuint visible_windows(num_visible_windows(window_list));
+ GLfloat angular_step(2 * M_PI / visible_windows);
+
+ /* Draw the windows in a circle using the calculated angular step */
+ GLint i(0);
+ for(std::list<CompositeWindow*>::iterator iter = window_list.begin();
+ iter != window_list.end(); ++iter)
+ {
+ CompositeWindow *comp_win = *iter;
+ GLuint tex = comp_win->get_texture().i;
+ if (tex) {
+ model_view_matrix.push();
+ model_view_matrix.translate(cos(angular_step * i),
+ sin(angular_step * i), 0);
+
+ /* Load shader ModelView uniform */
+ program_[model_view_matrix_name_] = model_view_matrix.getCurrent();
+
+ Log::debug("Drawing Win: 0x%x Tex: 0x%x\n",
+ comp_win->get_xwindow(), comp_win->get_texture().i);
+
+ glBindTexture(GL_TEXTURE_2D, tex);
+ vboData_.draw();
+ model_view_matrix.pop();
+ ++i;
+ }
+ }
+
+ // Disable the attributes
+ glDisableVertexAttribArray(vertexIndex_);
+ glDisableVertexAttribArray(texcoordIndex_);
+ vboData_.unbind();
+ fader.update();
+}
=== modified file 'src/composite-test.h'
@@ -209,4 +209,17 @@
};
+class CompositeTestSimpleFade : public CompositeTestSimpleBase
+{
+ static const std::string fade_bias_name_;
+public:
+ CompositeTestSimpleFade() :
+ CompositeTestSimpleBase("fade",
+ GLCOMPBENCH_DATA_PATH"/default.vert",
+ GLCOMPBENCH_DATA_PATH"/fade.frag")
+ {}
+
+ virtual void draw(std::list<CompositeWindow*> &window_list);
+};
+
#endif // COMPOSITE_TEST_H_
=== modified file 'src/glcompbench.cc'
@@ -38,6 +38,7 @@
static const char *default_benchmarks[] = {
"default",
+ "fade",
"brick",
"pixman",
"xrender",
@@ -157,6 +158,7 @@
Benchmark::register_test(*new CompositeTestDefaultOptions());
Benchmark::register_test(*new CompositeTestSimpleDefault());
+ Benchmark::register_test(*new CompositeTestSimpleFade());
Benchmark::register_test(*new CompositeTestSimpleBrick());
Benchmark::register_test(*new CompositeTestPixman());
Benchmark::register_test(*new CompositeTestXRender());
=== modified file 'src/profiler.h'
@@ -135,6 +135,7 @@
void reset_point(Point p);
void reset(void);
Point get_num_points() { return points_.size(); }
+ static uint64_t get_timestamp_us();
/**
* Gets the profiler singleton
@@ -147,7 +148,6 @@
private:
bool is_valid_point(Point p);
- uint64_t get_timestamp_us();
std::vector<ProfilerPoint *> points_;
};