]> git.sesse.net Git - nageru/blobdiff - flow.cpp
Write a .flo file for easier evaluation.
[nageru] / flow.cpp
index 47cebba7918c84471583629367192795b7aff19b..43daa787905c87584b9bbdc54cb31063733b05ac 100644 (file)
--- a/flow.cpp
+++ b/flow.cpp
@@ -455,6 +455,10 @@ int main(void)
        MotionSearch motion_search;
        Densify densify;
 
+       GLuint query;
+       glGenQueries(1, &query);
+       glBeginQuery(GL_TIME_ELAPSED, query);
+
        for (int level = coarsest_level; level >= int(finest_level); --level) {
                int level_width = WIDTH >> level;
                int level_height = HEIGHT >> level;
@@ -494,7 +498,7 @@ int main(void)
 
                // Densification.
 
-               // Set up an output texture.
+               // Set up an output texture (initially zero).
                GLuint dense_flow_tex;
                glCreateTextures(GL_TEXTURE_2D, 1, &dense_flow_tex);
                //glTextureStorage2D(dense_flow_tex, 1, GL_RGB16F, level_width, level_height);
@@ -507,6 +511,15 @@ int main(void)
 
                prev_level_flow_tex = dense_flow_tex;
        }
+       glEndQuery(GL_TIME_ELAPSED);
+
+       GLint available;
+       do {
+               glGetQueryObjectiv(query, GL_QUERY_RESULT_AVAILABLE, &available);
+       } while (!available);
+       GLuint64 time_elapsed;
+       glGetQueryObjectui64v(query, GL_QUERY_RESULT, &time_elapsed);
+       fprintf(stderr, "GPU time used = %.1f ms\n", time_elapsed / 1e6);
 
        int level_width = WIDTH >> finest_level;
        int level_height = HEIGHT >> finest_level;
@@ -514,7 +527,11 @@ int main(void)
        glGetTextureImage(prev_level_flow_tex, 0, GL_RGB, GL_FLOAT, level_width * level_height * 3 * sizeof(float), dense_flow.get());
 
        FILE *fp = fopen("flow.ppm", "wb");
+       FILE *flowfp = fopen("flow.flo", "wb");
        fprintf(fp, "P6\n%d %d\n255\n", level_width, level_height);
+       fprintf(flowfp, "FEIH");
+       fwrite(&level_width, 4, 1, flowfp);
+       fwrite(&level_height, 4, 1, flowfp);
        for (unsigned y = 0; y < unsigned(level_height); ++y) {
                int yy = level_height - y - 1;
                for (unsigned x = 0; x < unsigned(level_width); ++x) {
@@ -523,7 +540,10 @@ int main(void)
                        float w = dense_flow[(yy * level_width + x) * 3 + 2];
 
                        du = (du / w) * level_width;
-                       dv = (dv / w) * level_height;
+                       dv = (-dv / w) * level_height;
+
+                       fwrite(&du, 4, 1, flowfp);
+                       fwrite(&dv, 4, 1, flowfp);
 
                        uint8_t r, g, b;
                        flow2rgb(du, dv, &r, &g, &b);
@@ -533,6 +553,7 @@ int main(void)
                }
        }
        fclose(fp);
+       fclose(flowfp);
 
        fprintf(stderr, "err = %d\n", glGetError());
 }