diff options
Diffstat (limited to 'intern/cycles/filter/filter_reconstruction.h')
-rw-r--r-- | intern/cycles/filter/filter_reconstruction.h | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/intern/cycles/filter/filter_reconstruction.h b/intern/cycles/filter/filter_reconstruction.h index 15e84b5d054..a308964fb4f 100644 --- a/intern/cycles/filter/filter_reconstruction.h +++ b/intern/cycles/filter/filter_reconstruction.h @@ -18,17 +18,21 @@ CCL_NAMESPACE_BEGIN ccl_device_inline void kernel_filter_construct_gramian(int x, int y, int storage_stride, - int dx, int dy, int w, int h, + int dx, int dy, + int w, int h, float ccl_readonly_ptr buffer, - int color_pass, int variance_pass, + float *color_pass, + float *variance_pass, float ccl_readonly_ptr transform, - int *rank, float weight, - float *XtWX, float3 *XtWY) + int *rank, + float weight, + float *XtWX, + float3 *XtWY) { const int pass_stride = w*h; - float ccl_readonly_ptr p_buffer = buffer + y*w + x; - float ccl_readonly_ptr q_buffer = buffer + (y+dy)*w + (x+dx); + int p_offset = y *w + x; + int q_offset = (y+dy)*w + (x+dx); #ifdef __KERNEL_CPU__ const int stride = 1; @@ -37,21 +41,21 @@ ccl_device_inline void kernel_filter_construct_gramian(int x, int y, const int stride = storage_stride; #endif - float3 p_color = filter_get_pixel_color(p_buffer, color_pass, pass_stride); - float3 q_color = filter_get_pixel_color(q_buffer, color_pass, pass_stride); + float3 p_color = filter_get_pixel_color(color_pass + p_offset, pass_stride); + float3 q_color = filter_get_pixel_color(color_pass + q_offset, pass_stride); - float p_std_dev = sqrtf(filter_get_pixel_variance(p_buffer, variance_pass, pass_stride)); - float q_std_dev = sqrtf(filter_get_pixel_variance(q_buffer, variance_pass, pass_stride)); + float p_std_dev = sqrtf(filter_get_pixel_variance(variance_pass + p_offset, pass_stride)); + float q_std_dev = sqrtf(filter_get_pixel_variance(variance_pass + q_offset, pass_stride)); if(average(fabs(p_color - q_color)) > 3.0f*(p_std_dev + q_std_dev + 1e-3f)) { return; } float feature_means[DENOISE_FEATURES], features[DENOISE_FEATURES]; - filter_get_features(make_int3(x, y, 0), p_buffer, feature_means, NULL, pass_stride); + filter_get_features(make_int3(x, y, 0), buffer + p_offset, feature_means, NULL, pass_stride); float design_row[DENOISE_FEATURES+1]; - filter_get_design_row_transform(make_int3(x+dx, y+dy, 0), q_buffer, feature_means, pass_stride, features, *rank, design_row, transform, stride); + filter_get_design_row_transform(make_int3(x+dx, y+dy, 0), buffer + q_offset, feature_means, pass_stride, features, *rank, design_row, transform, stride); math_trimatrix_add_gramian_strided(XtWX, (*rank)+1, design_row, weight, stride); math_vec3_add_strided(XtWY, (*rank)+1, design_row, weight * q_color, stride); |