X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=fft_pass_effect.cpp;h=b0006087cd2779282af2ec3750d5ba7761d084f5;hp=e3999b30682a1514b922ef64b825fe9096ab6065;hb=eff011224abc5dc81f801f3ea44572287a55bcac;hpb=60e4852ff1b04c525a9e3f1c98a1017db28b27bd diff --git a/fft_pass_effect.cpp b/fft_pass_effect.cpp index e3999b3..b000608 100644 --- a/fft_pass_effect.cpp +++ b/fft_pass_effect.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "effect_chain.h" @@ -25,6 +25,8 @@ FFTPassEffect::FFTPassEffect() register_int("direction", (int *)&direction); register_int("pass_number", &pass_number); register_int("inverse", &inverse); + register_uniform_float("num_repeats", &uniform_num_repeats); + register_uniform_sampler2d("support_tex", &uniform_support_tex); glGenTextures(1, &tex); } @@ -83,11 +85,11 @@ void FFTPassEffect::set_gl_state(GLuint glsl_program_num, const string &prefix, generate_support_texture(); } - set_uniform_int(glsl_program_num, prefix, "support_tex", *sampler_num); + uniform_support_tex = *sampler_num; ++*sampler_num; assert(input_size % fft_size == 0); - set_uniform_float(glsl_program_num, prefix, "num_repeats", input_size / fft_size); + uniform_num_repeats = input_size / fft_size; } void FFTPassEffect::generate_support_texture() @@ -119,8 +121,8 @@ void FFTPassEffect::generate_support_texture() // bit, so the stride is 8, and so on. assert((fft_size & (fft_size - 1)) == 0); // Must be power of two. - fp16_int_t *tmp = new fp16_int_t[fft_size * 4]; int subfft_size = 1 << pass_number; + fp16_int_t *tmp = new fp16_int_t[subfft_size * 4]; double mulfac; if (inverse) { mulfac = 2.0 * M_PI; @@ -165,10 +167,10 @@ void FFTPassEffect::generate_support_texture() support_texture_index = subfft_size - support_texture_index - 1; sign = -1.0; } - tmp[support_texture_index * 4 + 0] = fp64_to_fp16(sign * (src1 - i * stride) / double(input_size)); - tmp[support_texture_index * 4 + 1] = fp64_to_fp16(sign * (src2 - i * stride) / 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); + tmp[support_texture_index * 4 + 0] = fp32_to_fp16(sign * (src1 - i * stride) / double(input_size)); + tmp[support_texture_index * 4 + 1] = fp32_to_fp16(sign * (src2 - i * stride) / double(input_size)); + tmp[support_texture_index * 4 + 2] = fp32_to_fp16(twiddle_real); + tmp[support_texture_index * 4 + 3] = fp32_to_fp16(twiddle_imag); } // Supposedly FFTs are very sensitive to inaccuracies in the twiddle factors,