X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=main.cpp;h=287e19a681a23e11e515fa42ecd9fd415dbe5d4c;hp=9a9a3eac7b7df1c380d28879ac4b12401abb4615;hb=2b4a7d868112b4995bf6699f5b3aa68e9ec2b308;hpb=92fa0d98d417d77e991d88f63d9851271592131a diff --git a/main.cpp b/main.cpp index 9a9a3ea..287e19a 100644 --- a/main.cpp +++ b/main.cpp @@ -3,11 +3,11 @@ #define WIDTH 1280 #define HEIGHT 720 -#define BUFFER_OFFSET(i) ((char *)NULL + (i)) #include #include #include +#include #include #include @@ -91,7 +91,7 @@ unsigned char *load_image(const char *filename, unsigned *w, unsigned *h) SDL_PixelFormat *fmt = img->format; SDL_LockSurface(img); unsigned char *src_pixels = (unsigned char *)img->pixels; - unsigned char *dst_pixels = (unsigned char *)malloc(img->w * img->h * 3); + unsigned char *dst_pixels = (unsigned char *)malloc(img->w * img->h * 4); for (int i = 0; i < img->w * img->h; ++i) { unsigned char r, g, b; unsigned int temp; @@ -112,9 +112,10 @@ unsigned char *load_image(const char *filename, unsigned *w, unsigned *h) temp = temp << fmt->Bloss; b = temp; - dst_pixels[i * 3 + 0] = r; - dst_pixels[i * 3 + 1] = g; - dst_pixels[i * 3 + 2] = b; + dst_pixels[i * 4 + 0] = b; + dst_pixels[i * 4 + 1] = g; + dst_pixels[i * 4 + 2] = r; + dst_pixels[i * 4 + 3] = 255; } SDL_UnlockSurface(img); @@ -167,7 +168,7 @@ int main(int argc, char **argv) EffectChain chain(WIDTH, HEIGHT); ImageFormat inout_format; - inout_format.pixel_format = FORMAT_RGB; + inout_format.pixel_format = FORMAT_BGRA; inout_format.color_space = COLORSPACE_sRGB; inout_format.gamma_curve = GAMMA_sRGB; @@ -227,9 +228,14 @@ int main(int argc, char **argv) make_hsv_wheel_texture(); - struct timespec start, now; int frame = 0, screenshot = 0; +#if _POSIX_C_SOURCE >= 199309L + struct timespec start, now; clock_gettime(CLOCK_MONOTONIC, &start); +#else + struct timeval start, now; + gettimeofday(&start, NULL); +#endif while (!quit) { SDL_Event event; @@ -254,8 +260,12 @@ int main(int argc, char **argv) vignette_effect->set_float("inner_radius", inner_radius); chain.render_to_screen(src_img); + glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 1); + check_error(); glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, BUFFER_OFFSET(0)); check_error(); + glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); + check_error(); draw_hsv_wheel(0.0f, lift_rad, lift_theta, lift_v); draw_hsv_wheel(0.2f, gamma_rad, gamma_theta, gamma_v); @@ -267,6 +277,8 @@ int main(int argc, char **argv) SDL_GL_SwapBuffers(); check_error(); + glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 1); + check_error(); unsigned char *screenbuf = (unsigned char *)glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); check_error(); if (screenshot) { @@ -278,11 +290,19 @@ int main(int argc, char **argv) } glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); check_error(); + glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); + check_error(); #if 1 +#if _POSIX_C_SOURCE >= 199309L clock_gettime(CLOCK_MONOTONIC, &now); double elapsed = now.tv_sec - start.tv_sec + 1e-9 * (now.tv_nsec - start.tv_nsec); +#else + gettimeofday(&now, NULL); + double elapsed = now.tv_sec - start.tv_sec + + 1e-6 * (now.tv_usec - start.tv_usec); +#endif printf("%d frames in %.3f seconds = %.1f fps (%.1f ms/frame)\n", frame, elapsed, frame / elapsed, 1e3 * elapsed / frame);