Tests: Add damage tracking to MSAA
This lets compositors avoid re-rendering the entire buffer when only the
outside of the squares changed.
If glfwGetBufferAge() returns 0 for any reason (the buffer was just
created, there was an error, or the underlying API doesn’t track buffer
age), we swap the entire buffer again.
diff --git a/tests/msaa.c b/tests/msaa.c
index 33e2ccc..8421044 100644
--- a/tests/msaa.c
+++ b/tests/msaa.c
@@ -102,6 +102,19 @@
GLuint vertex_buffer, vertex_shader, fragment_shader, program;
GLint mvp_location, vpos_location;
+ // Minimum static damage for both squares.
+ GLFWrect rects[8] =
+ {{ 25, 25, 350, 90},
+ { 25, 285, 350, 90},
+ { 25, 115, 90, 170},
+ {285, 115, 90, 170},
+
+ {425, 25, 350, 90},
+ {425, 285, 350, 90},
+ {425, 115, 90, 170},
+ {685, 115, 90, 170},
+ };
+
while ((ch = getopt(argc, argv, "hs:")) != -1)
{
switch (ch)
@@ -178,11 +191,13 @@
while (!glfwWindowShouldClose(window))
{
float ratio;
+ int buffer_age;
int width, height;
mat4x4 m, p, mvp;
const double angle = glfwGetTime() * M_PI / 180.0;
glfwGetFramebufferSize(window, &width, &height);
+ buffer_age = glfwGetBufferAge(window);
ratio = width / (float) height;
glViewport(0, 0, width, height);
@@ -208,7 +223,12 @@
glEnable(GL_MULTISAMPLE);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- glfwSwapBuffers(window);
+ // If buffer_age is 0, we can’t assume anything about the previous buffer
+ // so swap the entire buffer.
+ if (buffer_age > 0)
+ glfwSwapBuffersWithDamage(window, rects, 8);
+ else
+ glfwSwapBuffers(window);
glfwPollEvents();
}