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