[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