Blender  V3.3
integrator_adaptive_sampling_test.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #include "testing/testing.h"
5 
7 #include "util/vector.h"
8 
10 
11 TEST(AdaptiveSampling, schedule_samples)
12 {
13  AdaptiveSampling adaptive_sampling;
14  adaptive_sampling.use = true;
15  adaptive_sampling.min_samples = 0;
16  adaptive_sampling.adaptive_step = 4;
17 
18  for (int sample = 2; sample < 32; ++sample) {
19  for (int num_samples = 8; num_samples < 32; ++num_samples) {
20  const int num_samples_aligned = adaptive_sampling.align_samples(sample, num_samples);
21  /* NOTE: `sample + num_samples_aligned` is the number of samples after rendering, so need
22  * to convert this to the 0-based index of the last sample. */
23  EXPECT_TRUE(adaptive_sampling.need_filter(sample + num_samples_aligned - 1));
24  }
25  }
26 }
27 
28 TEST(AdaptiveSampling, align_samples)
29 {
30  AdaptiveSampling adaptive_sampling;
31  adaptive_sampling.use = true;
32  adaptive_sampling.min_samples = 11 /* rounded of sqrt(128) */;
33  adaptive_sampling.adaptive_step = 4;
34 
35  /* Filtering will happen at the following samples:
36  * 15, 19, 23, 27, 31, 35, 39, 43 */
37 
38  /* Requested sample and number of samples will result in number of samples lower than
39  * `min_samples`. */
40  EXPECT_EQ(adaptive_sampling.align_samples(0, 4), 4);
41  EXPECT_EQ(adaptive_sampling.align_samples(0, 7), 7);
42 
43  /* Request number of samples higher than the minimum samples before filter, but prior to the
44  * first sample at which filtering will happen. */
45  EXPECT_EQ(adaptive_sampling.align_samples(0, 15), 15);
46 
47  /* When rendering many samples from the very beginning, limit number of samples by the first
48  * sample at which filtering is to happen. */
49  EXPECT_EQ(adaptive_sampling.align_samples(0, 16), 16);
50  EXPECT_EQ(adaptive_sampling.align_samples(0, 17), 16);
51  EXPECT_EQ(adaptive_sampling.align_samples(0, 20), 16);
52  EXPECT_EQ(adaptive_sampling.align_samples(0, 60), 16);
53 
54  /* Similar to above, but start sample is not 0. */
55  EXPECT_EQ(adaptive_sampling.align_samples(9, 8), 7);
56  EXPECT_EQ(adaptive_sampling.align_samples(9, 20), 7);
57  EXPECT_EQ(adaptive_sampling.align_samples(9, 60), 7);
58 
59  /* Start sample is past the minimum required samples, but prior to the first filter sample. */
60  EXPECT_EQ(adaptive_sampling.align_samples(12, 6), 4);
61  EXPECT_EQ(adaptive_sampling.align_samples(12, 20), 4);
62  EXPECT_EQ(adaptive_sampling.align_samples(12, 60), 4);
63 
64  /* Start sample is the sample which is to be filtered. */
65  EXPECT_EQ(adaptive_sampling.align_samples(15, 4), 1);
66  EXPECT_EQ(adaptive_sampling.align_samples(15, 6), 1);
67  EXPECT_EQ(adaptive_sampling.align_samples(15, 10), 1);
68  EXPECT_EQ(adaptive_sampling.align_samples(58, 2), 2);
69 
70  /* Start sample is past the sample which is to be filtered. */
71  EXPECT_EQ(adaptive_sampling.align_samples(16, 3), 3);
72  EXPECT_EQ(adaptive_sampling.align_samples(16, 4), 4);
73  EXPECT_EQ(adaptive_sampling.align_samples(16, 5), 4);
74  EXPECT_EQ(adaptive_sampling.align_samples(16, 10), 4);
75 
76  /* Should never exceed requested number of samples. */
77  EXPECT_EQ(adaptive_sampling.align_samples(15, 2), 1);
78  EXPECT_EQ(adaptive_sampling.align_samples(16, 2), 2);
79  EXPECT_EQ(adaptive_sampling.align_samples(17, 2), 2);
80  EXPECT_EQ(adaptive_sampling.align_samples(18, 2), 2);
81 }
82 
83 TEST(AdaptiveSampling, need_filter)
84 {
85  AdaptiveSampling adaptive_sampling;
86  adaptive_sampling.use = true;
87  adaptive_sampling.min_samples = 11 /* rounded of sqrt(128) */;
88  adaptive_sampling.adaptive_step = 4;
89 
90  const vector<int> expected_samples_to_filter = {
91  {15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59}};
92 
93  vector<int> actual_samples_to_filter;
94  for (int sample = 0; sample < 60; ++sample) {
95  if (adaptive_sampling.need_filter(sample)) {
96  actual_samples_to_filter.push_back(sample);
97  }
98  }
99 
100  EXPECT_EQ(actual_samples_to_filter, expected_samples_to_filter);
101 }
102 
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
bool need_filter(int sample) const
int align_samples(int start_sample, int num_samples) const
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
CCL_NAMESPACE_BEGIN TEST(AdaptiveSampling, schedule_samples)
ccl_gpu_kernel_postfix ccl_global float int int int int ccl_global const float int int int int int int int int int int int int num_samples