[Bf-blender-cvs] [60aebfceaa3] cycles-x: Fix tile size calculation in Cycles X
Sergey Sharybin
noreply at git.blender.org
Mon Aug 30 16:02:07 CEST 2021
Commit: 60aebfceaa3bd5ec9bf1c5d97df12ec26da99613
Author: Sergey Sharybin
Date: Mon Aug 30 16:00:59 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB60aebfceaa3bd5ec9bf1c5d97df12ec26da99613
Fix tile size calculation in Cycles X
Was not behaving correct when number of samples is way above
number of available path states.
Reported by Alaska in the Cycles room in the blender.chat.
===================================================================
M intern/cycles/integrator/tile.cpp
M intern/cycles/test/integrator_tile_test.cpp
===================================================================
diff --git a/intern/cycles/integrator/tile.cpp b/intern/cycles/integrator/tile.cpp
index 87524f329af..3387b7bedf1 100644
--- a/intern/cycles/integrator/tile.cpp
+++ b/intern/cycles/integrator/tile.cpp
@@ -76,8 +76,13 @@ TileSize tile_calculate_best_size(const int2 &image_size,
* The idea here is to keep tiles as small as possible, and keep device occupied by scheduling
* multiple tiles with the same coordinates rendering different samples. */
const int num_path_states_per_sample = max_num_path_states / num_samples;
- tile_size.width = round_down_to_power_of_two(lround(sqrt(num_path_states_per_sample)));
- tile_size.height = tile_size.width;
+ if (num_path_states_per_sample != 0) {
+ tile_size.width = round_down_to_power_of_two(lround(sqrt(num_path_states_per_sample)));
+ tile_size.height = tile_size.width;
+ }
+ else {
+ tile_size.width = tile_size.height = 1;
+ }
if (num_samples == 1) {
tile_size.num_samples = 1;
@@ -87,8 +92,14 @@ TileSize tile_calculate_best_size(const int2 &image_size,
* [32 <38 times>, 8] over [1024, 200]. This allows to greedily add more tiles early on. */
tile_size.num_samples = min(round_up_to_power_of_two(lround(sqrt(num_samples / 2))),
static_cast<uint>(num_samples));
+
+ const int tile_area = tile_size.width / tile_size.height;
+ tile_size.num_samples = min(tile_size.num_samples, max_num_path_states / tile_area);
}
+ DCHECK_GE(tile_size.width, 1);
+ DCHECK_GE(tile_size.height, 1);
+ DCHECK_GE(tile_size.num_samples, 1);
DCHECK_LE(tile_size.width * tile_size.height * tile_size.num_samples, max_num_path_states);
return tile_size;
diff --git a/intern/cycles/test/integrator_tile_test.cpp b/intern/cycles/test/integrator_tile_test.cpp
index 32a323683c7..5bb57b48c3c 100644
--- a/intern/cycles/test/integrator_tile_test.cpp
+++ b/intern/cycles/test/integrator_tile_test.cpp
@@ -34,4 +34,14 @@ TEST(tile_calculate_best_size, Basic)
TileSize(1920, 1080, 100));
}
+TEST(tile_calculate_best_size, Extreme)
+{
+ EXPECT_EQ(tile_calculate_best_size(make_int2(32, 32), 262144, 131072), TileSize(1, 1, 512));
+ EXPECT_EQ(tile_calculate_best_size(make_int2(32, 32), 1048576, 131072), TileSize(1, 1, 1024));
+ EXPECT_EQ(tile_calculate_best_size(make_int2(32, 32), 10485760, 131072), TileSize(1, 1, 4096));
+
+ EXPECT_EQ(tile_calculate_best_size(make_int2(32, 32), 8192 * 8192 * 2, 1024),
+ TileSize(1, 1, 1024));
+}
+
CCL_NAMESPACE_END
More information about the Bf-blender-cvs
mailing list