[Bf-blender-cvs] [6e1b895ee70] cycles-x: Remove accurate cryptomatte implementation

Sergey Sharybin noreply at git.blender.org
Tue Aug 24 17:05:11 CEST 2021


Commit: 6e1b895ee706a446d22252b7644e1fad62ac7259
Author: Sergey Sharybin
Date:   Tue Jul 20 16:18:28 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB6e1b895ee706a446d22252b7644e1fad62ac7259

Remove accurate cryptomatte implementation

Affects both Cycles and EEVEE.

The motivation:

- For EEVEE it is a performance penalty to do GPU transfers for every
  sample rendered.

- With big tile rendering in Cycles the accurate mode can have a very
  high memory footprint.

- Feature parity between CPU and GPU: the GPU code paths should provide
  results which are usable by production.

If there are cases when the accurate is really a must-have we'd need to
have a demo file and investigate how it can be supported on both CPU
and GPU.

Note that for comparison of accurate vs. non-accurate in the regular
Cycles should be done very carefully: CPU does not implement sorting
for non-accurate mode, so doesn't OptiX; and GPU does not support
accurate modes; CUDA doesn't implement sorting properly when adaptive
sampling is involved (what a mess!).

Differential Revision: https://developer.blender.org/D11975

===================================================================

M	intern/cycles/blender/addon/version_update.py
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/device/cpu/device_impl.cpp
M	intern/cycles/device/cpu/kernel_thread_globals.cpp
M	intern/cycles/kernel/device/cpu/globals.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/render/CMakeLists.txt
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h
D	intern/cycles/render/coverage.cpp
D	intern/cycles/render/coverage.h
M	release/scripts/modules/rna_manual_reference.py
M	release/scripts/startup/bl_ui/properties_view_layer.py
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/draw/engines/eevee/eevee_cryptomatte.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py
index d81ce9c23b5..48cbc156f0c 100644
--- a/intern/cycles/blender/addon/version_update.py
+++ b/intern/cycles/blender/addon/version_update.py
@@ -195,7 +195,6 @@ def do_versions(self):
                     view_layer.use_pass_cryptomatte_material = cview_layer.get("use_pass_crypto_material", False)
                     view_layer.use_pass_cryptomatte_asset = cview_layer.get("use_pass_crypto_asset", False)
                     view_layer.pass_cryptomatte_depth = cview_layer.get("pass_crypto_depth", 6)
-                    view_layer.use_pass_cryptomatte_accurate = cview_layer.get("pass_crypto_accurate", True)
 
             if version <= (2, 93, 7):
                 if scene.render.engine == 'CYCLES':
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 76cf754381d..3672588e09a 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -657,9 +657,6 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
     }
     cryptomatte_passes = (CryptomatteType)(cryptomatte_passes | CRYPT_ASSET);
   }
-  if (b_view_layer.use_pass_cryptomatte_accurate() && cryptomatte_passes != CRYPT_NONE) {
-    cryptomatte_passes = (CryptomatteType)(cryptomatte_passes | CRYPT_ACCURATE);
-  }
   scene->film->set_cryptomatte_passes(cryptomatte_passes);
 
   /* Denoising passes. */
diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp
index a1601a6461f..3b0db6bdd0e 100644
--- a/intern/cycles/device/cpu/device_impl.cpp
+++ b/intern/cycles/device/cpu/device_impl.cpp
@@ -48,7 +48,6 @@
 #include "bvh/bvh_embree.h"
 
 #include "render/buffers.h"
-#include "render/coverage.h"
 
 #include "util/util_debug.h"
 #include "util/util_foreach.h"
diff --git a/intern/cycles/device/cpu/kernel_thread_globals.cpp b/intern/cycles/device/cpu/kernel_thread_globals.cpp
index e2d0c4a3400..988b00cd1f0 100644
--- a/intern/cycles/device/cpu/kernel_thread_globals.cpp
+++ b/intern/cycles/device/cpu/kernel_thread_globals.cpp
@@ -32,10 +32,6 @@ CPUKernelThreadGlobals::CPUKernelThreadGlobals(const KernelGlobals &kernel_globa
 {
   reset_runtime_memory();
 
-  coverage_asset = nullptr;
-  coverage_object = nullptr;
-  coverage_material = nullptr;
-
 #ifdef WITH_OSL
   OSLShader::thread_init(this, reinterpret_cast<OSLGlobals *>(osl_globals_memory));
 #else
diff --git a/intern/cycles/kernel/device/cpu/globals.h b/intern/cycles/kernel/device/cpu/globals.h
index 541255ffdc6..98b036e269d 100644
--- a/intern/cycles/kernel/device/cpu/globals.h
+++ b/intern/cycles/kernel/device/cpu/globals.h
@@ -21,9 +21,6 @@
 #include "kernel/kernel_profiling.h"
 #include "kernel/kernel_types.h"
 
-#include "util/util_map.h"
-#include "util/util_vector.h"
-
 CCL_NAMESPACE_BEGIN
 
 /* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in
@@ -37,8 +34,6 @@ struct OSLThreadData;
 struct OSLShadingSystem;
 #endif
 
-typedef unordered_map<float, float> CoverageMap;
-
 typedef struct KernelGlobals {
 #define KERNEL_TEX(type, name) texture<type> name;
 #include "kernel/kernel_textures.h"
@@ -55,11 +50,6 @@ typedef struct KernelGlobals {
 
   /* **** Run-time data ****  */
 
-  /* A buffer for storing per-pixel coverage for Cryptomatte. */
-  CoverageMap *coverage_object;
-  CoverageMap *coverage_material;
-  CoverageMap *coverage_asset;
-
   ProfilingState profiler;
 } KernelGlobals;
 
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 3c302387b4d..a67dc6f6391 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -153,27 +153,13 @@ ccl_device_forceinline void kernel_write_shadow_catcher_bounce_data(
 
 #endif /* __SHADOW_CATCHER__ */
 
-#ifdef __KERNEL_CPU__
-#  define WRITE_ID_SLOT(buffer, depth, id, matte_weight, name) \
-    kernel_write_id_pass_cpu(buffer, depth * 2, id, matte_weight, kg->coverage_##name)
-ccl_device_inline size_t kernel_write_id_pass_cpu(
-    float *ccl_restrict buffer, size_t depth, float id, float matte_weight, CoverageMap *map)
+ccl_device_inline size_t kernel_write_id_pass(float *ccl_restrict buffer,
+                                              size_t depth,
+                                              float id,
+                                              float matte_weight)
 {
-  if (map) {
-    (*map)[id] += matte_weight;
-    return 0;
-  }
-#else /* __KERNEL_CPU__ */
-#  define WRITE_ID_SLOT(buffer, depth, id, matte_weight, name) \
-    kernel_write_id_slots_gpu(buffer, depth * 2, id, matte_weight)
-ccl_device_inline size_t kernel_write_id_slots_gpu(ccl_global float *ccl_restrict buffer,
-                                                   size_t depth,
-                                                   float id,
-                                                   float matte_weight)
-{
-#endif /* __KERNEL_CPU__ */
-  kernel_write_id_slots(buffer, depth, id, matte_weight);
-  return depth * 2;
+  kernel_write_id_slots(buffer, depth * 2, id, matte_weight);
+  return depth * 4;
 }
 
 ccl_device_inline void kernel_write_data_passes(INTEGRATOR_STATE_ARGS,
@@ -247,18 +233,18 @@ ccl_device_inline void kernel_write_data_passes(INTEGRATOR_STATE_ARGS,
       ccl_global float *cryptomatte_buffer = buffer + kernel_data.film.pass_cryptomatte;
       if (kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
         const float id = object_cryptomatte_id(kg, sd->object);
-        cryptomatte_buffer += WRITE_ID_SLOT(
-            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, object);
+        cryptomatte_buffer += kernel_write_id_pass(
+            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
       }
       if (kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
         const float id = shader_cryptomatte_id(kg, sd->shader);
-        cryptomatte_buffer += WRITE_ID_SLOT(
-            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, material);
+        cryptomatte_buffer += kernel_write_id_pass(
+            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
       }
       if (kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
         const float id = object_cryptomatte_asset_id(kg, sd->object);
-        cryptomatte_buffer += WRITE_ID_SLOT(
-            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, asset);
+        cryptomatte_buffer += kernel_write_id_pass(
+            cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
       }
     }
   }
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 87770664811..6edb5261b32 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -32,7 +32,6 @@ set(SRC
   camera.cpp
   colorspace.cpp
   constant_fold.cpp
-  coverage.cpp
   denoising.cpp
   film.cpp
   geometry.cpp
@@ -78,7 +77,6 @@ set(SRC_HEADERS
   camera.h
   colorspace.h
   constant_fold.h
-  coverage.h
   denoising.h
   film.h
   geometry.h
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 00f0f14ae2e..a2917ba69e5 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -115,29 +115,6 @@ bool BufferParams::modified(const BufferParams &other) const
   return memcmp(pass_offset_, other.pass_offset_, sizeof(pass_offset_)) != 0;
 }
 
-/* Render Buffer Task */
-
-RenderTile::RenderTile()
-{
-  x = 0;
-  y = 0;
-  w = 0;
-  h = 0;
-
-  sample = 0;
-  start_sample = 0;
-  num_samples = 0;
-  resolution = 0;
-
-  offset = 0;
-  stride = 0;
-
-  buffer = 0;
-
-  buffers = NULL;
-  stealing_state = NO_STEALING;
-}
-
 /* Render Buffers */
 
 RenderBuffers::RenderBuffers(Device *device) : buffer(device, "RenderBuffers", MEM_READ_WRITE)
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 4387d5ba657..70a6b441b0c 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -113,78 +113,6 @@ void render_buffers_host_copy_denoised(RenderBuffers *dst,
                                        const BufferParams &src_params,
                                        const size_t src_offset = 0);
 
-/* Render Tile
- * Rendering task on a buffer */
-
-class RenderTile {
- public:
-  typedef enum { PATH_TRACE = (1 << 0), BAKE = (1 << 1), DENOISE = (1 << 2) } Task;
-
-  Task task;
-  int x, y, w, h;
-  int start_sample;
-  int num_samples;
-  int sample;
-  int resolution;
-  int offset;
-  int stride;
-  int tile_index;
-
-  device_ptr buffer;
-  int device_size;
-
-  typedef enum { NO_STEALING = 0, CAN_BE_STOLEN = 1, WAS_STOLEN = 2 } StealingState;
-  StealingState stealing_state;
-
-  RenderBuffers *buffers;
-
-  RenderTile();
-
-  int4 bounds() const
-  {
-    return make_int4(x,      /* xmin */
-                     y,      /* ymin */
-                     x + w,  /* xmax */
-                     y + h); /* ymax */
-  }
-};
-
-/* Render Tile Neighbors
- * Set of neighboring tiles used for denoising. Tile order:
- *  0 1 2
- *  3 4 5
- *  6 7 8 */
-
-class RenderTileNeighbors {
- public:
-  static const int SIZE = 9;
-  static const int CENTER = 4;
-
-  RenderTile tiles[SIZE];
-  RenderTile target;
-
-  RenderTileNeighbors(const RenderTile &center)
-  {
-    tiles[CENTER] = center;
-  }
-
-  int4 bounds() const
-  {
-    return make_int4(tiles[3].x,               /* xmin */
-                     tiles[1].y,               /* ymin */
-                     tiles[5].x + tiles[5].w,  /* xmax */
-                     tiles[7].y + tiles[7].h); /* ymax */
-  }
-
-  void set_bounds_from_center()
-  {
-    tiles[3].x = tiles[CENTER].x;
-    tiles[1].y = tiles[CENTER].y;
-    tiles[5].x = tiles[CENTER].x + tiles[CENTER].w;
-    tiles[7].y = tiles[CENTER].y + tiles[CENTER].h;
-  }
-};
-
 CCL_NAMESPACE_END
 
 #endif /* __BUFFERS_H__ */
diff --git a/intern/cycles/render/coverage.cpp b/intern/cycles/render/coverage.cpp
deleted file mode 100644
index ddca11e342e..00000000000
--- a/intern/cycles/render/coverage.cpp
+++ /dev/n

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list