69static inline __attribute__((always_inline)) uint8_t scale_type(
const int s,
const int scales)
78static inline void guide_laplacians(
const float *
const restrict high_freq,
const float *
const restrict low_freq,
79 const float *
const restrict clipping_mask,
float *
const restrict output,
80 const size_t width,
const size_t height,
const int mult,
81 const float noise_level,
const int salt,
const uint8_t scale,
82 const float radius_sq)
89 const dt_aligned_pixel_simd_t inv_patch =
dt_simd_set1(1.f / 9.f);
90 const dt_aligned_pixel_simd_t scale_multiplier =
dt_simd_set1(1.f / radius_sq);
91 const float eps = 1e-12f;
97 const float *
const row0 = HF + 4 * ((size_t)
MAX(
i - mult, 0) *
width);
98 const float *
const row1 = HF + 4 * ((size_t)
i *
width);
101 const int max_col = (int)
width - 1;
103 for(
int j = 0; j <
width; ++j)
105 const size_t idx = (
i *
width + j);
106 const size_t index = idx * 4;
107 const float alpha = clipping_mask[index +
ALPHA];
108 const float alpha_comp = 1.f - alpha;
109 dt_aligned_pixel_simd_t high_frequency = dt_load_simd_aligned(HF + index);
113 const int col_offsets[3] = { 4 *
MAX(j - mult, 0), 4 * j, 4 *
MIN(j + mult, max_col) };
114 dt_aligned_pixel_simd_t sum = zero;
115 dt_aligned_pixel_simd_t sum_sq = zero;
116 dt_aligned_pixel_simd_t prod_r = zero;
117 dt_aligned_pixel_simd_t prod_g = zero;
118 dt_aligned_pixel_simd_t prod_b = zero;
123#if defined(__GNUC__) && !defined(__clang__)
126 for(
int jj = 0; jj < 3; ++jj)
128 const float *
const row_ptr = rows[jj];
129#if defined(__GNUC__) && !defined(__clang__)
132 for(
int ii = 0; ii < 3; ++ii)
134 const dt_aligned_pixel_simd_t sample = dt_load_simd_aligned(row_ptr + col_offsets[ii]);
137 sum_sq += sample * sample;
144 dt_aligned_pixel_simd_t means = sum * inv_patch;
145 dt_aligned_pixel_simd_t variance = sum_sq * inv_patch - means * means;
146 variance = dt_simd_max_zero(variance);
147 variance[
ALPHA] = 0.f;
149 size_t guiding_channel =
RED;
150 float guide_variance = variance[
RED];
151 if(variance[
GREEN] > guide_variance)
153 guiding_channel =
GREEN;
154 guide_variance = variance[
GREEN];
156 if(variance[
BLUE] > guide_variance)
158 guiding_channel =
BLUE;
159 guide_variance = variance[
BLUE];
162 if(guide_variance >
eps)
164 const float guide_mean = means[guiding_channel];
165 dt_aligned_pixel_simd_t covariance
166 = (guiding_channel ==
RED ? prod_r : (guiding_channel ==
GREEN ? prod_g : prod_b)) * inv_patch
168 dt_aligned_pixel_simd_t slope = covariance /
dt_simd_set1(guide_variance);
169 slope = dt_simd_max_zero(slope);
170 dt_aligned_pixel_simd_t intercept = means - slope *
dt_simd_set1(guide_mean);
171 const dt_aligned_pixel_simd_t blend = dt_load_simd_aligned(clipping_mask + index) * scale_multiplier;
172 const dt_aligned_pixel_simd_t guide =
dt_simd_set1(high_frequency[guiding_channel]);
173 high_frequency = blend * (slope * guide + intercept) + (ones - blend) * high_frequency;
177 dt_aligned_pixel_simd_t out_pixel = high_frequency;
185 out_pixel += dt_load_simd_aligned(
out + index);
191 out_pixel = dt_simd_max_zero(out_pixel + dt_load_simd_aligned(LF + index));
195 if((scale &
LAST_SCALE) && salt && alpha > 0.f)
221 out_pixel[
RED] = fmaxf(alpha *
noise[
RED] + alpha_comp * current[
RED], 0.f);
230 const float norm = fmaxf(sqrtf(sqf(out_pixel[
RED]) + sqf(out_pixel[
GREEN]) + sqf(out_pixel[
BLUE])), 1e-6f);
232 out_pixel[
ALPHA] = norm;
241static inline void heat_PDE_diffusion(
const float *
const restrict high_freq,
const float *
const restrict low_freq,
242 const float *
const restrict clipping_mask,
float *
const restrict output,
243 const size_t width,
const size_t height,
const int mult,
const uint8_t scale,
244 const float first_order_factor)
265 const size_t i_neighbours[3] = {
MAX((
int)(
i - mult), (
int)0) *
width,
270 = { 0.25f, 0.5f, 0.25f, 0.5f, -3.f, 0.5f, 0.25f, 0.5f, 0.25f };
272 for(
size_t j = 0; j <
width; ++j)
274 const size_t idx = (
i *
width + j);
275 const size_t index = idx * 4;
279 clipping_mask[index +
BLUE], clipping_mask[index +
ALPHA] };
281 dt_aligned_pixel_t high_frequency = { HF[index + 0], HF[index + 1], HF[index + 2], HF[index + 3] };
287 const float norm_backup = high_frequency[3];
289 if(alpha[
ALPHA] > 0.f)
292 const size_t j_neighbours[3] = {
MAX((
int)(j - mult), (
int)0),
294 MIN((
int)(j + mult), (
int)
width - 1) };
300 neighbour_pixel_HF[3 * 0 + 0][c] = HF[4 * (i_neighbours[0] + j_neighbours[0]) + c];
301 neighbour_pixel_HF[3 * 0 + 1][c] = HF[4 * (i_neighbours[0] + j_neighbours[1]) + c];
302 neighbour_pixel_HF[3 * 0 + 2][c] = HF[4 * (i_neighbours[0] + j_neighbours[2]) + c];
304 neighbour_pixel_HF[3 * 1 + 0][c] = HF[4 * (i_neighbours[1] + j_neighbours[0]) + c];
305 neighbour_pixel_HF[3 * 1 + 1][c] = HF[4 * (i_neighbours[1] + j_neighbours[1]) + c];
306 neighbour_pixel_HF[3 * 1 + 2][c] = HF[4 * (i_neighbours[1] + j_neighbours[2]) + c];
308 neighbour_pixel_HF[3 * 2 + 0][c] = HF[4 * (i_neighbours[2] + j_neighbours[0]) + c];
309 neighbour_pixel_HF[3 * 2 + 1][c] = HF[4 * (i_neighbours[2] + j_neighbours[1]) + c];
310 neighbour_pixel_HF[3 * 2 + 2][c] = HF[4 * (i_neighbours[2] + j_neighbours[2]) + c];
316 for(
int k = 0;
k < 9;
k++)
319 aligned(anisotropic_kernel_isophote : 64)) laplacian_HF[c]
320 += neighbour_pixel_HF[
k][c] * anisotropic_kernel_isophote[
k];
326 for_each_channel(c, aligned(high_frequency, multipliers_HF, laplacian_HF, alpha)) high_frequency[c]
327 += alpha[c] * multipliers_HF[c] * (laplacian_HF[c] - first_order_factor * high_frequency[c]);
330 high_frequency[3] = norm_backup;
348 = fmaxf(
out[index + c] + LF[index + c], 0.f);
351 if(alpha[
ALPHA] > 0.f)
355 /= (c !=
ALPHA && norm > 1e-4f) ? norm : 1.f;
367static inline int wavelets_process(
const float *
const restrict in,
float *
const restrict reconstructed,
368 const float *
const restrict clipping_mask,
const size_t width,
369 const size_t height,
const int scales,
float *
const restrict HF,
370 float *
const restrict LF_odd,
float *
const restrict LF_even,
372 const int salt,
const float first_order_factor)
383 for(
int s = 0; s < scales; ++s)
386 const int mult = 1 << s;
388 const float *restrict buffer_in;
389 float *restrict buffer_out;
399 buffer_out = LF_even;
409 uint8_t current_scale_type = scale_type(s, scales);
414 current_scale_type, radius);
445 const size_t ds_size = ds_height * ds_width;
447 float *
const restrict interpolated
449 float *
const restrict clipping_mask
458 const float final_radius = (float)((
int)(1 << data->
scales)) / scale;
459 const int scales = CLAMP((
int)ceilf(log2f(final_radius)), 1,
MAX_NUM_SCALES);
461 const float noise_level = data->
noise_level / scale;
475 const float *
const restrict input = (
const float *
const restrict)ivoid;
476 float *
const restrict output = (
float *
const restrict)
ovoid;
495 if(
wavelets_process(ds_interpolated, temp, ds_clipping_mask, ds_width, ds_height, scales, HF, LF_odd, LF_even,
501 if(
wavelets_process(temp, ds_interpolated, ds_clipping_mask, ds_width, ds_height, scales, HF, LF_odd, LF_even,
536 const uint8_t(*
const xtrans)[6] = (
const uint8_t(*
const)[6])piece->
dsc_in.
xtrans;
544 const size_t ds_size = ds_height * ds_width;
553 const float final_radius = (float)((
int)(1 << data->
scales)) / scale;
554 const int scales = CLAMP((
int)ceilf(log2f(final_radius)), 1,
MAX_NUM_SCALES);
555 const float noise_level = data->
noise_level / scale;
568 const float *
const restrict input = (
const float *
const restrict)ivoid;
569 float *
const restrict output = (
float *
const restrict)
ovoid;
571 int32_t
lookup[6][6][32] = { { { 0 } } };
589 if(
wavelets_process(ds_interpolated, temp, ds_clipping_mask, ds_width, ds_height, scales, HF, LF_odd, LF_even,
595 if(
wavelets_process(temp, ds_interpolated, ds_clipping_mask, ds_width, ds_height, scales, HF, LF_odd, LF_even,
621 cl_mem reconstructed_scratch, cl_mem clipping_mask,
const size_t sizes[3],
624 cl_mem LF_odd, cl_mem LF_even,
626 const int salt,
const float solid_color)
629 cl_mem reconstruct_read = reconstructed_scratch;
634 for(
int s = 0; s < scales; ++s)
637 const int mult = 1 << s;
650 buffer_out = LF_even;
659 const int clamp_lf = 1;
665 .cellsize = 4 *
sizeof(float),
670 hblocksize = hlocopt.
sizex;
677 const size_t horizontal_local[3] = { hblocksize, 1, 1 };
687 (hblocksize + 4 * mult) * 4 *
sizeof(
float), NULL);
689 horizontal_sizes, horizontal_local);
701 if(err != CL_SUCCESS)
return err;
708 .cellsize = 4 *
sizeof(float),
713 vblocksize = vlocopt.
sizey;
720 const size_t vertical_local[3] = { 1, vblocksize, 1 };
723 (
void *)&buffer_out);
729 (vblocksize + 4 * mult) * 4 *
sizeof(
float), NULL);
743 if(err != CL_SUCCESS)
return err;
745 uint8_t current_scale_type = scale_type(s, scales);
747 cl_mem reconstruct_write = (s == scales - 1)
749 : (reconstruct_read == reconstructed ? reconstructed_scratch : reconstructed);
758 (
void *)&buffer_out);
760 (
void *)&clipping_mask);
762 (
void *)&reconstruct_read);
764 (
void *)&reconstruct_write);
769 (
void *)&noise_level);
772 (
void *)¤t_scale_type);
775 if(err != CL_SUCCESS)
return err;
782 (
void *)&clipping_mask);
784 (
void *)&reconstruct_read);
786 (
void *)&reconstruct_write);
791 (
void *)¤t_scale_type);
794 if(err != CL_SUCCESS)
return err;
797 reconstruct_read = reconstruct_write;
816 const int devid = pipe->
devid;
837 cl_mem normalization = NULL;
838 cl_mem normalization_tmp = NULL;
839 cl_mem normalization_partials = NULL;
840 cl_mem normalization_final = NULL;
849 const float final_radius = (float)((
int)(1 << data->
scales)) / scale;
850 const int scales = CLAMP((
int)ceilf(log2f(final_radius)), 1,
MAX_NUM_SCALES);
852 const float noise_level = data->
noise_level / scale;
858 cl_mem reconstructed_scratch =
dt_opencl_alloc_device(devid, ds_sizes[0], ds_sizes[1],
sizeof(
float) * 4);
871 .cellsize = 4 *
sizeof(float),
880 const int bufsize = (int)((bwidth / flocopt.
sizex) * (bheight / flocopt.
sizey));
885 if(!normalization_partials || !normalization || !normalization_tmp)
goto error;
887 size_t fsizes[3] = { bwidth, bheight, 1 };
888 size_t flocal[3] = { flocopt.
sizex, flocopt.
sizey, 1 };
893 &normalization_partials);
898 sizeof(
float) * 4 * flocopt.
sizex * flocopt.
sizey, NULL);
901 if(err != CL_SUCCESS)
goto error;
907 .cellsize = 4 *
sizeof(float),
914 int current_length = bufsize;
915 cl_mem reduce_in = normalization_partials;
916 cl_mem reduce_out = normalization;
921 size_t ssizes[3] = { (size_t)reducesize * slocopt.
sizex, 1, 1 };
922 size_t slocal[3] = { slocopt.
sizex, 1, 1 };
929 sizeof(
float) * 4 * slocopt.
sizex, NULL);
932 if(err != CL_SUCCESS)
goto error;
934 if(reducesize == 1)
break;
935 current_length = reducesize;
936 cl_mem
swap = reduce_in;
937 reduce_in = reduce_out;
938 reduce_out = (
swap == normalization_partials) ? normalization_tmp : normalization;
941 normalization_final = reduce_out;
946 (
void *)&interpolated);
950 (
void *)&normalization_final);
952 (
void *)&filters_shifted);
955 (
void *)&roi_out->
height);
957 if(err != CL_SUCCESS)
goto error;
964 if(err != CL_SUCCESS)
goto error;
967 const int RGBa =
TRUE;
976 if(err != CL_SUCCESS)
goto error;
986 if(err != CL_SUCCESS)
goto error;
991 err =
wavelets_process_cl(devid, ds_interpolated, temp, reconstructed_scratch, ds_clipping_mask, ds_sizes,
994 if(err != CL_SUCCESS)
goto error;
996 err =
wavelets_process_cl(devid, temp, ds_interpolated, reconstructed_scratch, ds_clipping_mask, ds_sizes,
999 if(err != CL_SUCCESS)
goto error;
1010 if(err != CL_SUCCESS)
goto error;
1013 const int clip_floor_off =
FALSE;
1017 (
void *)&interpolated);
1019 (
void *)&clipping_mask);
1022 (
void *)&normalization_final);
1025 (
void *)&clip_floor_off);
1027 (
void *)&filters_shifted);
1031 if(err != CL_SUCCESS)
goto error;
1083 const uint8_t(*
const xtrans)[6] = (
const uint8_t(*
const)[6])piece->
dsc_in.
xtrans;
1084 const int devid = pipe->
devid;
1096 cl_mem normalization = NULL;
1097 cl_mem normalization_tmp = NULL;
1098 cl_mem normalization_partials = NULL;
1099 cl_mem normalization_final = NULL;
1105 const float final_radius = (float)((
int)(1 << data->
scales)) / scale;
1106 const int scales = CLAMP((
int)ceilf(log2f(final_radius)), 1,
MAX_NUM_SCALES);
1107 const float noise_level = data->
noise_level / scale;
1112 cl_mem reconstructed_scratch =
dt_opencl_alloc_device(devid, ds_sizes[0], ds_sizes[1],
sizeof(
float) * 4);
1117 int32_t
lookup[6][6][32] = { { { 0 } } };
1132 .cellsize = 4 *
sizeof(float),
1142 const int bufsize = (int)((bwidth / flocopt.
sizex) * (bheight / flocopt.
sizey));
1147 if(!normalization_partials || !normalization || !normalization_tmp)
goto error;
1149 size_t fsizes[3] = { bwidth, bheight, 1 };
1150 size_t flocal[3] = { flocopt.
sizex, flocopt.
sizey, 1 };
1156 &normalization_partials);
1164 sizeof(
float) * 4 * flocopt.
sizex * flocopt.
sizey, NULL);
1167 if(err != CL_SUCCESS)
goto error;
1173 .cellsize = 4 *
sizeof(float),
1180 int current_length = bufsize;
1181 cl_mem reduce_in = normalization_partials;
1182 cl_mem reduce_out = normalization;
1187 size_t ssizes[3] = { (size_t)reducesize * slocopt.
sizex, 1, 1 };
1188 size_t slocal[3] = { slocopt.
sizex, 1, 1 };
1195 sizeof(
float) * 4 * slocopt.
sizex, NULL);
1198 if(err != CL_SUCCESS)
goto error;
1200 if(reducesize == 1)
break;
1201 current_length = reducesize;
1202 cl_mem
swap = reduce_in;
1203 reduce_in = reduce_out;
1204 reduce_out = (
swap == normalization_partials) ? normalization_tmp : normalization;
1207 normalization_final = reduce_out;
1213 (
void *)&interpolated);
1218 (
void *)&normalization_final);
1222 (
void *)&roi_in->
x);
1224 (
void *)&roi_in->
y);
1226 (
void *)&dev_xtrans);
1228 (
void *)&lookup_cl);
1230 if(err != CL_SUCCESS)
goto error;
1237 if(err != CL_SUCCESS)
goto error;
1239 const int RGBa =
TRUE;
1248 if(err != CL_SUCCESS)
goto error;
1258 if(err != CL_SUCCESS)
goto error;
1263 err =
wavelets_process_cl(devid, ds_interpolated, temp, reconstructed_scratch, ds_clipping_mask, ds_sizes,
1266 if(err != CL_SUCCESS)
goto error;
1268 err =
wavelets_process_cl(devid, temp, ds_interpolated, reconstructed_scratch, ds_clipping_mask, ds_sizes,
1271 if(err != CL_SUCCESS)
goto error;
1281 if(err != CL_SUCCESS)
goto error;
1283 const int clip_floor_off =
FALSE;
1289 (
void *)&interpolated);
1291 (
void *)&clipping_mask);
1295 (
void *)&normalization_final);
1299 (
void *)&clip_floor_off);
1305 (
void *)&roi_in->
x);
1307 (
void *)&roi_in->
y);
1309 (
void *)&dev_xtrans);
1311 if(err != CL_SUCCESS)
goto error;
static void error(char *msg)
int dt_box_mean(float *const buf, const size_t height, const size_t width, const int ch, const int radius, const unsigned iterations)
static float equivalent_sigma_at_step(const float sigma, const unsigned int s)
#define B_SPLINE_TO_LAPLACIAN
static void decompose_2D_Bspline(const float *const restrict in, float *const restrict HF, float *const restrict LF, const size_t width, const size_t height, const int mult, float *const tempbuf, size_t padded_size)
return vector dt_simd_set1(valid ?(scaling+NORM_MIN) :NORM_MIN)
static float lookup(read_only image2d_t lut, const float x)
const dt_colormatrix_t dt_aligned_pixel_t out
dt_store_simd_aligned(out, dt_mat3x4_mul_vec4(vin, dt_colormatrix_row_to_simd(matrix, 0), dt_colormatrix_row_to_simd(matrix, 1), dt_colormatrix_row_to_simd(matrix, 2)))
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_print(dt_debug_thread_t thread, const char *msg,...)
static const dt_aligned_pixel_simd_t const dt_aligned_pixel_simd_t row1
#define for_each_channel(_var,...)
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Enable aggressive floating-point arithmetic optimizations, in denormals handling. Set through user pr...
#define dt_pixelpipe_cache_free_align(mem)
#define dt_pixelpipe_cache_alloc_align_float(pixels, pipe)
#define __DT_CLONE_TARGETS__
static const dt_aligned_pixel_simd_t const dt_aligned_pixel_simd_t const dt_aligned_pixel_simd_t row2
#define for_four_channels(_var,...)
#define __OMP_PARALLEL_FOR__(...)
#define dt_pixelpipe_cache_alloc_perthread_float(n, padded_size)
static const dt_aligned_pixel_simd_t row0
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
static float4 dt_noise_generator_simd(const dt_noise_distribution_t distribution, const float4 mu, const float4 param, uint state[4])
static unsigned int splitmix32(const unsigned long seed)
static float xoshiro128plus(uint state[4])
static int dwt_interleave_rows(const int rowid, const int height, const int stride)
static __DT_CLONE_TARGETS__ void interpolate_bilinear(const float *const restrict in, const size_t width_in, const size_t height_in, float *const restrict out, const size_t width_out, const size_t height_out, const size_t ch)
__DT_CLONE_TARGETS__ void _compute_laplacian_normalization(const float *const restrict input, const dt_iop_roi_t *const roi_in, const uint32_t filters, const uint8_t(*const xtrans)[6], dt_aligned_pixel_t normalization)
__DT_CLONE_TARGETS__ void _remosaic_and_replace_xtrans(const float *const restrict input, const float *const restrict input_raw, const float *const restrict interpolated, const float *const restrict clipping_mask, float *const restrict output, const dt_aligned_pixel_t white_balance, const dt_aligned_pixel_t clips, const int clip_is_floor, const dt_iop_roi_t *const roi_in, const uint8_t(*const xtrans)[6], const size_t width, const size_t height)
__DT_CLONE_TARGETS__ void _interpolate_and_mask(const float *const restrict input, float *const restrict interpolated, float *const restrict clipping_mask, const dt_aligned_pixel_t clips_in, const dt_aligned_pixel_t det_scale, const dt_aligned_pixel_t white_balance, const uint32_t filters, const size_t width, const size_t height)
__DT_CLONE_TARGETS__ void _remosaic_and_replace(const float *const restrict input, const float *const restrict input_raw, const float *const restrict interpolated, const float *const restrict clipping_mask, float *const restrict output, const dt_aligned_pixel_t white_balance, const dt_aligned_pixel_t clips, const int clip_is_floor, const uint32_t filters, const size_t width, const size_t height)
__DT_CLONE_TARGETS__ void _interpolate_and_mask_xtrans(const float *const restrict input, float *const restrict interpolated, float *const restrict clipping_mask, const dt_aligned_pixel_t clips, const dt_aligned_pixel_t white_balance, const dt_iop_roi_t *const roi_in, const int32_t lookup[6][6][32], const uint8_t(*const xtrans)[6], const size_t width, const size_t height)
__DT_CLONE_TARGETS__ void _build_xtrans_bilinear_lookup(int32_t lookup[6][6][32], const dt_iop_roi_t *const roi_in, const uint8_t(*const xtrans)[6])
uint32_t dt_dev_get_roi_filters(const dt_dev_pixelpipe_iop_t *const piece, const dt_iop_roi_t *const roi_in)
float dt_dev_get_module_scale(const dt_dev_pixelpipe_t *const pipe, const dt_iop_roi_t *const roi_in)
__DT_CLONE_TARGETS__ int process_laplacian_bayer(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const restrict ivoid, void *const restrict ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
static __DT_CLONE_TARGETS__ void heat_PDE_diffusion(const float *const restrict high_freq, const float *const restrict low_freq, const float *const restrict clipping_mask, float *const restrict output, const size_t width, const size_t height, const int mult, const uint8_t scale, const float first_order_factor)
static int wavelets_process(const float *const restrict in, float *const restrict reconstructed, const float *const restrict clipping_mask, const size_t width, const size_t height, const int scales, float *const restrict HF, float *const restrict LF_odd, float *const restrict LF_even, const diffuse_reconstruct_variant_t variant, const float noise_level, const int salt, const float first_order_factor)
cl_int process_laplacian_bayer_cl(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
cl_int process_laplacian_xtrans_cl(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
__DT_CLONE_TARGETS__ int process_laplacian_xtrans(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const restrict ivoid, void *const restrict ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
static __DT_CLONE_TARGETS__ void guide_laplacians(const float *const restrict high_freq, const float *const restrict low_freq, const float *const restrict clipping_mask, float *const restrict output, const size_t width, const size_t height, const int mult, const float noise_level, const int salt, const uint8_t scale, const float radius_sq)
static cl_int wavelets_process_cl(const int devid, cl_mem in, cl_mem reconstructed, cl_mem reconstructed_scratch, cl_mem clipping_mask, const size_t sizes[3], const int width, const int height, dt_iop_highlights_global_data_t *const gd, const int scales, cl_mem HF, cl_mem LF_odd, cl_mem LF_even, const diffuse_reconstruct_variant_t variant, const float noise_level, const int salt, const float solid_color)
static void swap(float *x, float *y)
float *const restrict const size_t k
float dt_aligned_pixel_t[4]
int dt_opencl_local_buffer_opt(const int devid, const int kernel, dt_opencl_local_buffer_t *factors)
int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
void * dt_opencl_alloc_device_buffer(const int devid, const size_t size)
void * dt_opencl_alloc_device(const int devid, const int width, const int height, const int bpp)
void * dt_opencl_copy_host_to_device_constant(const int devid, const size_t size, void *host)
int dt_opencl_set_kernel_arg(const int dev, const int kernel, const int num, const size_t size, const void *arg)
int dt_opencl_enqueue_kernel_2d_with_local(const int dev, const int kernel, const size_t *sizes, const size_t *local)
void dt_opencl_release_mem_object(cl_mem mem)
#define DT_OPENCL_DEFAULT_ERROR
const float uint32_t state[4]
const float const int flip
diffuse_reconstruct_variant_t
@ DIFFUSE_RECONSTRUCT_RGB
@ DIFFUSE_RECONSTRUCT_CHROMA
dt_iop_buffer_dsc_t dsc_in
struct dt_iop_module_t *void * data
int kernel_highlights_diffuse_color
int kernel_highlights_guide_laplacians
int kernel_highlights_remosaic_and_replace
int kernel_filmic_bspline_horizontal_local
int kernel_highlights_normalize_reduce_first
int kernel_highlights_bilinear_and_mask_xtrans
int kernel_highlights_normalize_reduce_first_xtrans
int kernel_interpolate_bilinear
int kernel_filmic_bspline_horizontal
int kernel_highlights_box_blur
int kernel_filmic_bspline_vertical
int kernel_highlights_normalize_reduce_second
int kernel_highlights_remosaic_and_replace_xtrans
int kernel_highlights_bilinear_and_mask
int kernel_filmic_bspline_vertical_local
dt_atrous_wavelets_scales_t scales
dt_iop_global_data_t * global_data
Region of interest passed through the pixelpipe.