53 const Result &first_non_causal_input,
54 const Result &second_causal_input,
55 const Result &second_non_causal_input,
60 output.allocate_texture(transposed_domain);
64 float4 filter_output = first_causal_input.load_pixel<float4>(texel) +
65 first_non_causal_input.load_pixel<float4>(texel) +
66 second_causal_input.load_pixel<float4>(texel) +
67 second_non_causal_input.load_pixel<float4>(texel);
71 output.store_pixel(int2(texel.y, texel.x), filter_output);
185 Result &first_causal_output,
186 Result &first_non_causal_output,
187 Result &second_causal_output,
188 Result &second_non_causal_output,
192 context.cache_manager().van_vliet_gaussian_coefficients.get(context, sigma);
195 const float2 first_causal_feedforward_coefficients =
float2(
197 const float2 first_non_causal_feedforward_coefficients =
float2(
200 const float2 second_causal_feedforward_coefficients =
float2(
202 const float2 second_non_causal_feedforward_coefficients =
float2(
204 const float first_causal_boundary_coefficient = float(
206 const float first_non_causal_boundary_coefficient = float(
208 const float second_causal_boundary_coefficient = float(
210 const float second_non_causal_boundary_coefficient = float(
237 int y = invocation.y;
238 int width =
input.domain().size.x;
248 bool is_causal = invocation.x % 2 == 0;
249 float2 first_feedforward_coefficients = is_causal ? first_causal_feedforward_coefficients :
250 first_non_causal_feedforward_coefficients;
251 float first_boundary_coefficient = is_causal ? first_causal_boundary_coefficient :
252 first_non_causal_boundary_coefficient;
253 float2 second_feedforward_coefficients = is_causal ?
254 second_causal_feedforward_coefficients :
255 second_non_causal_feedforward_coefficients;
256 float second_boundary_coefficient = is_causal ? second_causal_boundary_coefficient :
257 second_non_causal_boundary_coefficient;
259 bool is_first_filter = invocation.x < 2;
260 float2 feedforward_coefficients = is_first_filter ? first_feedforward_coefficients :
261 second_feedforward_coefficients;
262 float2 feedback_coefficients = is_first_filter ? first_feedback_coefficients :
263 second_feedback_coefficients;
264 float boundary_coefficient = is_first_filter ? first_boundary_coefficient :
265 second_boundary_coefficient;
270 int2 boundary_texel = is_causal ?
int2(0,
y) :
int2(width - 1,
y);
279 float4 output_boundary = input_boundary * boundary_coefficient;
280 float4 outputs[
FILTER_ORDER + 1] = {output_boundary, output_boundary, output_boundary};
282 for (
int x = 0;
x < width;
x++) {
298 outputs[0] =
float4(0.0f);
299 int first_input_index = is_causal ? 0 : 1;
301 outputs[0] += feedforward_coefficients[
i] * inputs[first_input_index +
i];
302 outputs[0] -= feedback_coefficients[
i] * outputs[
i + 1];
308 if (is_first_filter) {
309 first_causal_output.
store_pixel(texel, outputs[0]);
312 second_causal_output.
store_pixel(texel, outputs[0]);
316 if (is_first_filter) {
317 first_non_causal_output.
store_pixel(texel, outputs[0]);
320 second_non_causal_output.
store_pixel(texel, outputs[0]);
328 inputs[
i] = inputs[
i - 1];
335 outputs[
i] = outputs[
i - 1];
348 if (context.use_gpu()) {
352 first_non_causal_result,
353 second_causal_result,
354 second_non_causal_result,
361 first_non_causal_result,
362 second_causal_result,
363 second_non_causal_result,
369 first_non_causal_result,
370 second_causal_result,
371 second_non_causal_result,
374 first_non_causal_result.
release();
375 second_causal_result.
release();
376 second_non_causal_result.
release();