// 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);
}
}
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 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; ++i) {
- run_fft(data + i * fft_size * 4, expected_data + i * fft_size * 4, fft_size, false);
- }
+ for (int i = 0; i < num_repeats * fft_size * 4; ++i) {
+ data[i] = uniform_random();
+ }
- {
- // 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);
+ for (int i = 0; i < num_repeats; ++i) {
+ run_fft(data + i * fft_size * 4, expected_data + i * fft_size * 4, fft_size, false);
+ }
- 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);
+ {
+ // 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);
+ 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);
+ }
}
}