]> git.sesse.net Git - movit/commitdiff
Merge branch 'master' into epoxy
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 15 Mar 2014 02:12:53 +0000 (03:12 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 15 Mar 2014 02:12:53 +0000 (03:12 +0100)
1  2 
fft_pass_effect.cpp
fft_pass_effect_test.cpp

diff --combined fft_pass_effect.cpp
index 0ffaa9e9918de2d5fdc4dcd271bf948cecbc5465,4069be93f636d72a7682cb4971a2d9822afc4f98..ee0b983ae92002875d5b8e86538e21b09846991b
@@@ -1,4 -1,4 +1,4 @@@
 -#include <GL/glew.h>
 +#include <epoxy/gl.h>
  #include <math.h>
  
  #include "effect_chain.h"
@@@ -117,15 -117,17 +117,17 @@@ void FFTPassEffect::set_gl_state(GLuin
                // is that we can have multiple FFTs along the same line,
                // and want to reuse the support texture by repeating it.
                int base = k * stride * 2 + offset;
-               int support_texture_index;
+               int support_texture_index = i;
+               int src1 = base;
+               int src2 = base + stride;
                if (direction == FFTPassEffect::VERTICAL) {
                        // Compensate for OpenGL's bottom-left convention.
-                       support_texture_index = fft_size - i - 1;
-               } else {
-                       support_texture_index = i;
+                       support_texture_index = fft_size - support_texture_index - 1;
+                       src1 = fft_size - src1 - 1;
+                       src2 = fft_size - src2 - 1;
                }
-               tmp[support_texture_index * 4 + 0] = fp64_to_fp16((base - support_texture_index) / double(input_size));
-               tmp[support_texture_index * 4 + 1] = fp64_to_fp16((base + stride - support_texture_index) / double(input_size));
+               tmp[support_texture_index * 4 + 0] = fp64_to_fp16((src1 - support_texture_index) / double(input_size));
+               tmp[support_texture_index * 4 + 1] = fp64_to_fp16((src2 - support_texture_index) / double(input_size));
                tmp[support_texture_index * 4 + 2] = fp64_to_fp16(twiddle_real);
                tmp[support_texture_index * 4 + 3] = fp64_to_fp16(twiddle_imag);
        }
diff --combined fft_pass_effect_test.cpp
index 01527b8b804e01901e38e8ae63e52ebb29ed4940,284aa5fd28ee815af0ea976006e3837d661cea31..015847ad72838c880eb107ac9b71559ddc494b14
@@@ -3,11 -3,11 +3,11 @@@
  #include <math.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <epoxy/gl.h>
 +#include <gtest/gtest.h>
  
  #include "effect_chain.h"
  #include "fft_pass_effect.h"
 -#include "glew.h"
 -#include "gtest/gtest.h"
  #include "image_format.h"
  #include "multiply_effect.h"
  #include "test_util.h"
@@@ -125,35 -125,36 +125,36 @@@ TEST(FFTPassEffectTest, SingleFrequency
  }
  
  TEST(FFTPassEffectTest, Repeat) {
-       const int fft_size = 64;
-       const int num_repeats = 31;  // Prime, to make things more challenging.
-       float data[num_repeats * fft_size * 4] = { 0 };
-       float expected_data[num_repeats * fft_size * 4], out_data[num_repeats * fft_size * 4];
        srand(12345);
-       for (int i = 0; i < num_repeats * fft_size * 4; ++i) {
-               data[i] = uniform_random();
-       }
-       for (int i = 0; i < num_repeats; ++i) {
-               run_fft(data + i * fft_size * 4, expected_data + i * fft_size * 4, fft_size, false);
-       }
-       {
-               // Horizontal.
-               EffectChainTester tester(data, num_repeats * fft_size, 1, FORMAT_RGBA_PREMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
-               setup_fft(tester.get_chain(), fft_size, false);
-               tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
-               expect_equal(expected_data, out_data, 4, num_repeats * fft_size);
-       }
-       {
-               // Vertical.
-               EffectChainTester tester(data, 1, num_repeats * fft_size, FORMAT_RGBA_PREMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
-               setup_fft(tester.get_chain(), fft_size, false, false, FFTPassEffect::VERTICAL);
-               tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
-               expect_equal(expected_data, out_data, 4, num_repeats * fft_size);
+       for (int fft_size = 2; fft_size < 512; fft_size *= 2) {
+               const int num_repeats = 31;  // Prime, to make things more challenging.
+               float data[num_repeats * fft_size * 4];
+               float expected_data[num_repeats * fft_size * 4], out_data[num_repeats * fft_size * 4];
+               for (int i = 0; i < num_repeats * fft_size * 4; ++i) {
+                       data[i] = uniform_random();
+               }
+               for (int i = 0; i < num_repeats; ++i) {
+                       run_fft(data + i * fft_size * 4, expected_data + i * fft_size * 4, fft_size, false);
+               }
+               {
+                       // Horizontal.
+                       EffectChainTester tester(data, num_repeats * fft_size, 1, FORMAT_RGBA_PREMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
+                       setup_fft(tester.get_chain(), fft_size, false);
+                       tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
+                       expect_equal(expected_data, out_data, 4, num_repeats * fft_size);
+               }
+               {
+                       // Vertical.
+                       EffectChainTester tester(data, 1, num_repeats * fft_size, FORMAT_RGBA_PREMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
+                       setup_fft(tester.get_chain(), fft_size, false, false, FFTPassEffect::VERTICAL);
+                       tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
+                       expect_equal(expected_data, out_data, 4, num_repeats * fft_size);
+               }
        }
  }