import lib.util; [[vk::binding(0, 0)]] StructuredBuffer input; [[vk::binding(1, 0)]] RWStructuredBuffer output; [[vk::binding(2, 0)]] StructuredBuffer twiddles; [[vk::binding(3, 0)]] cbuffer Uniforms { // Note: stride * big_n always = N, where N = input length uint stride; uint big_n; }; [shader("compute")] [numthreads(256, 1, 1)] void fft_v0_basic(uint3 globalId : SV_DispatchThreadID) { const uint id = globalId.x; const uint stride = Uniforms.stride; const uint big_n = Uniforms.big_n; const uint half_big_n = big_n / 2; const uint start_idx = id % stride; const uint k = id / stride; // Get odd and even elements. let p = input[start_idx + 2 * k * stride]; let q = input[start_idx + (2 * k + 1) * stride]; // Combine. let factor = twiddles[k * stride]; let qf = cmul(q, factor); output[start_idx + k * stride] = p + qf; output[start_idx + (k + half_big_n) * stride] = p - qf; }