From 0e5afa519a4ec5d3cd3dca699c965fa3ad73d74a Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Sat, 24 Mar 2012 09:18:41 +0100 Subject: wimmel_gl: Use GL_BGRA_EXT in readpixels That is the native format graphics cards use, so we reach a fastpath for the copy, which saves around 1s. --- wimmel.frag | 2 +- wimmel_gl.c | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/wimmel.frag b/wimmel.frag index 22adcf9..58d633e 100644 --- a/wimmel.frag +++ b/wimmel.frag @@ -22,7 +22,7 @@ main() } } - gl_FragColor = vec4(float(diff < barrier), 0.0, 0.0, 1.0); + gl_FragColor = vec4(0.0, 0.0, float(diff < barrier), 1.0); } // vim:ft=c: diff --git a/wimmel_gl.c b/wimmel_gl.c index 0f271af..64fdda3 100644 --- a/wimmel_gl.c +++ b/wimmel_gl.c @@ -1,4 +1,6 @@ +#include #include +#include #include #include @@ -8,6 +10,7 @@ #include #include +#include #else @@ -355,16 +358,29 @@ main(int argc, char **argv) draw(); glPixelStorei(GL_PACK_ALIGNMENT, 1); - stride = width * 4; + stride = width * sizeof(GLushort); buffer = malloc(stride * height); + +#ifndef GLUT + if (!strstr((char *) glGetString(GL_EXTENSIONS), + "GL_EXT_read_format_bgra")) { + fprintf(stderr, "GL_EXT_read_format_bgra not available\n"); + exit(EXIT_FAILURE); + } +#endif glReadPixels(0, 0, width, height, - GL_RGBA, GL_UNSIGNED_BYTE, + GL_BGRA_EXT, +#ifdef GL_EXT_read_format_bgra + GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, +#else + GL_UNSIGNED_SHORT_4_4_4_4_REV, +#endif buffer); for (int j = 0; j < height; ++j) { - guchar *row = buffer + (height - 1 - j) * stride; + GLushort *row = (GLushort *) (buffer + (height - 1 - j) * stride); for (int i = 0; i < width; ++i) { - if (*(row + i*4)) { + if (row[i] & 0x0f) { color_t color = COLOR(255, 0, 0, 0); for (int k = i; k < i+mwidth; k++) { put_pixel(pixbuf, POINT(k, j), color); -- cgit