[Bf-blender-cvs] [0d73947b899] temp-eevee-next-cryptomatte: Move sample sorting to film.

Jeroen Bakker noreply at git.blender.org
Mon Aug 29 15:51:33 CEST 2022


Commit: 0d73947b899e69acd68ccdee5ddc1651631d8f0e
Author: Jeroen Bakker
Date:   Mon Aug 29 15:49:42 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rB0d73947b899e69acd68ccdee5ddc1651631d8f0e

Move sample sorting to film.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
M	source/blender/draw/engines/eevee_next/eevee_film.cc
M	source/blender/draw/engines/eevee_next/eevee_film.hh
M	source/blender/draw/engines/eevee_next/eevee_instance.cc
M	source/blender/draw/engines/eevee_next/eevee_shader.cc
M	source/blender/draw/engines/eevee_next/eevee_shader.hh
R100	source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_post_comp.glsl	source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl
D	source/blender/draw/engines/eevee_next/shaders/infos/eevee_cryptomatte_info.hh
M	source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh
M	source/blender/gpu/CMakeLists.txt

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 94b3d1ead4a..6410175bb2d 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -386,7 +386,6 @@ set(GLSL_SRC
   engines/eevee_next/shaders/eevee_camera_lib.glsl
   engines/eevee_next/shaders/eevee_colorspace_lib.glsl
   engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl
-  engines/eevee_next/shaders/eevee_cryptomatte_post_comp.glsl
   engines/eevee_next/shaders/eevee_depth_of_field_accumulator_lib.glsl
   engines/eevee_next/shaders/eevee_depth_of_field_bokeh_lut_comp.glsl
   engines/eevee_next/shaders/eevee_depth_of_field_downsample_comp.glsl
@@ -403,6 +402,7 @@ set(GLSL_SRC
   engines/eevee_next/shaders/eevee_depth_of_field_tiles_dilate_comp.glsl
   engines/eevee_next/shaders/eevee_depth_of_field_tiles_flatten_comp.glsl
   engines/eevee_next/shaders/eevee_film_comp.glsl
+  engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl
   engines/eevee_next/shaders/eevee_film_frag.glsl
   engines/eevee_next/shaders/eevee_film_lib.glsl
   engines/eevee_next/shaders/eevee_geom_curves_vert.glsl
diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
index d06c4c8cc76..2e22a237e53 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
@@ -22,31 +22,9 @@ void Cryptomatte::init()
 
 void Cryptomatte::begin_sync()
 {
-  post_ps_ = nullptr;
-
   if (object_offset_ == -1 && asset_offset_ == -1) {
     cryptomatte_object_buf.resize(16);
   }
-
-  if (layer_len_ == 0) {
-    return;
-  }
-
-  const bool do_sorting = inst_.is_viewport() == false;
-  if (!do_sorting) {
-    return;
-  }
-
-  post_ps_ = DRW_pass_create("Cryptomatte.Sort", DRW_STATE_NO_DRAW);
-  GPUShader *sh = inst_.shaders.static_shader_get(CRYPTOMATTE_POST);
-  DRWShadingGroup *grp = DRW_shgroup_create(sh, post_ps_);
-  Texture &cryptomatte_tx = inst_.film.cryptomatte_tx_get();
-  DRW_shgroup_uniform_image_ref(grp, "cryptomatte_img", &cryptomatte_tx);
-  DRW_shgroup_uniform_int_copy(grp, "cryptomatte_layer_len", layer_len_);
-  DRW_shgroup_uniform_int_copy(
-      grp, "cryptomatte_samples_per_layer", inst_.view_layer->cryptomatte_levels);
-  int3 dispatch_size = math::divide_ceil(cryptomatte_tx.size(), int3(FILM_GROUP_SIZE));
-  DRW_shgroup_call_compute(grp, UNPACK2(dispatch_size), 1);
 }
 
 void Cryptomatte::sync_object(Object *ob)
@@ -91,11 +69,5 @@ void Cryptomatte::bind_resources(DRWShadingGroup *grp)
   DRW_shgroup_storage_block_ref(grp, "cryptomatte_object_buf", &cryptomatte_object_buf);
 }
 
-void Cryptomatte::sort()
-{
-  if (post_ps_) {
-    DRW_draw_pass(post_ps_);
-  }
-}
 
 }  // namespace blender::eevee
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
index e96cace9e20..17c8e9ebcc0 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
@@ -45,8 +45,6 @@ class Cryptomatte {
   /** Contains per object hashes (object and asset hash). Indexed by resource ID. */
   CryptomatteObjectBuf cryptomatte_object_buf;
 
-  DRWPass *post_ps_ = nullptr;
-
  public:
   Cryptomatte(Instance &inst) : inst_(inst){};
   ~Cryptomatte(){};
@@ -57,7 +55,6 @@ class Cryptomatte {
   void end_sync();
 
   void bind_resources(DRWShadingGroup *grp);
-  void sort();
 
   float hash(const ID &id) const;
 };
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc
index 0bd88e1e47d..b3164bc7783 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@ -466,6 +466,25 @@ void Film::sync()
   else {
     DRW_shgroup_call_procedural_triangles(grp, nullptr, 1);
   }
+
+  const int cryptomatte_layer_count = cryptomatte_layer_len_get();
+  const bool is_cryptomatte_pass_enabled = cryptomatte_layer_count > 0;
+  const bool do_cryptomatte_sorting = inst_.is_viewport() == false;
+  if (is_cryptomatte_pass_enabled && do_cryptomatte_sorting) {
+    cryptomatte_post_ps_ = DRW_pass_create("Film.Cryptomatte.Post", DRW_STATE_NO_DRAW);
+    GPUShader *sh = inst_.shaders.static_shader_get(FILM_CRYPTOMATTE_POST);
+    DRWShadingGroup *grp = DRW_shgroup_create(sh, cryptomatte_post_ps_);
+    Texture &cryptomatte_tx = inst_.film.cryptomatte_tx_get();
+    DRW_shgroup_uniform_image_ref(grp, "cryptomatte_img", &cryptomatte_tx);
+    DRW_shgroup_uniform_int_copy(grp, "cryptomatte_layer_len", cryptomatte_layer_count);
+    DRW_shgroup_uniform_int_copy(
+        grp, "cryptomatte_samples_per_layer", inst_.view_layer->cryptomatte_levels);
+    int3 dispatch_size = math::divide_ceil(cryptomatte_tx.size(), int3(FILM_GROUP_SIZE));
+    DRW_shgroup_call_compute(grp, UNPACK2(dispatch_size), 1);
+  }
+  else {
+    cryptomatte_post_ps_ = nullptr;
+  }
 }
 
 void Film::end_sync()
@@ -670,6 +689,13 @@ void Film::display()
   /* IMPORTANT: Do not swap! No accumulation has happened. */
 }
 
+void Film::cryptomatte_sort()
+{
+  if (cryptomatte_post_ps_) {
+    DRW_draw_pass(cryptomatte_post_ps_);
+  }
+}
+
 float *Film::read_pass(eViewLayerEEVEEPassType pass_type, int layer_offset)
 {
   // TODO(jbakker): readback cryptomatte?
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh
index add1f975fca..b2543ebede9 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_film.hh
@@ -61,6 +61,7 @@ class Film {
   bool force_disable_reprojection_ = false;
 
   DRWPass *accumulate_ps_ = nullptr;
+  DRWPass *cryptomatte_post_ps_ = nullptr;
 
   FilmDataBuf data_;
 
@@ -78,6 +79,9 @@ class Film {
   /** Accumulate the newly rendered sample contained in #RenderBuffers and blit to display. */
   void accumulate(const DRWView *view, GPUTexture *combined_final_tx);
 
+  /** Sort and normalize cryptomatte samples. */
+  void cryptomatte_sort();
+
   /** Blit to display. No rendered sample needed. */
   void display();
 
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc
index bb6ffb8fd9e..1b9691a7cdd 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc
@@ -296,7 +296,7 @@ void Instance::render_frame(RenderLayer *render_layer, const char *view_name)
 #endif
   }
 
-  cryptomatte.sort();
+  this->film.cryptomatte_sort();
 
   this->render_read_result(render_layer, view_name);
 }
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.cc b/source/blender/draw/engines/eevee_next/eevee_shader.cc
index 551d4cada8c..6da2e09c9e5 100644
--- a/source/blender/draw/engines/eevee_next/eevee_shader.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_shader.cc
@@ -82,8 +82,8 @@ const char *ShaderModule::static_shader_create_info_name_get(eShaderType shader_
       return "eevee_film_frag";
     case FILM_COMP:
       return "eevee_film_comp";
-    case CRYPTOMATTE_POST:
-      return "eevee_cryptomatte_post";
+    case FILM_CRYPTOMATTE_POST:
+      return "eevee_film_cryptomatte_post";
     case HIZ_DEBUG:
       return "eevee_hiz_debug";
     case HIZ_UPDATE:
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.hh b/source/blender/draw/engines/eevee_next/eevee_shader.hh
index 1bc8eeff9fe..88538557c07 100644
--- a/source/blender/draw/engines/eevee_next/eevee_shader.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_shader.hh
@@ -28,8 +28,7 @@ namespace blender::eevee {
 enum eShaderType {
   FILM_FRAG = 0,
   FILM_COMP,
-
-  CRYPTOMATTE_POST,
+  FILM_CRYPTOMATTE_POST,
 
   DOF_BOKEH_LUT,
   DOF_DOWNSAMPLE,
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_post_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl
similarity index 100%
rename from source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_post_comp.glsl
rename to source/blender/draw/engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl
diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_cryptomatte_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_cryptomatte_info.hh
deleted file mode 100644
index 46068910143..00000000000
--- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_cryptomatte_info.hh
+++ /dev/null
@@ -1,12 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-
-#include "eevee_defines.hh"
-#include "gpu_shader_create_info.hh"
-
-GPU_SHADER_CREATE_INFO(eevee_cryptomatte_post)
-    .do_static_compilation(true)
-    .image(0, GPU_RGBA32F, Qualifier::READ_WRITE, ImageType::FLOAT_2D_ARRAY, "cryptomatte_img")
-    .push_constant(Type::INT, "cryptomatte_layer_len")
-    .push_constant(Type::INT, "cryptomatte_samples_per_layer")
-    .local_group_size(FILM_GROUP_SIZE, FILM_GROUP_SIZE)
-    .compute_source("eevee_cryptomatte_post_comp.glsl");
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh
index 98ef502750d..05d2d2f5bf0 100644
--- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh
+++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh
@@ -46,3 +46,11 @@ GPU_SHADER_CREATE_INFO(eevee_film_comp)
     .local_group_size(FILM_GROUP_SIZE, FILM_GROUP_SIZE)
     .compute_source("eevee_film_comp.glsl")
     .additional_info("eevee_film");
+
+GPU_SHADER_CREATE_INFO(eevee_film_cryptomatte_post)
+    .do_static_compilation(true)
+    .image(0, GPU_RGBA32F, Qualifier::READ_WRITE, ImageType::FLOAT_2D_ARRAY, "cryptomatte_img")
+    .push_constant(Type::INT, "cryptomatte_layer_len")
+    .push_constant(Type::INT, "cryptomatte_samples_per_layer")
+    .local_group_size(FILM_GROUP_SIZE, FILM_GROUP_SIZE)
+    .compute_source("eevee_film_cryptomatte_post_comp.glsl");
diff --git a/sour

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list