[Bf-blender-cvs] [2ea0ba8854f] tmp-workbench-rewrite2: move samples and samples_len to scene_state

Miguel Pozo noreply at git.blender.org
Wed Nov 2 23:43:27 CET 2022


Commit: 2ea0ba8854f77a9bea330f58dd7bc53273d16b76
Author: Miguel Pozo
Date:   Wed Nov 2 13:55:25 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB2ea0ba8854f77a9bea330f58dd7bc53273d16b76

move samples and samples_len to scene_state

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

M	source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
M	source/blender/draw/engines/workbench/workbench_effect_cavity.cc
M	source/blender/draw/engines/workbench/workbench_effect_dof.cc
M	source/blender/draw/engines/workbench/workbench_engine.cc
M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_state.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
index 78e01fe90bf..6a56585f72c 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
+++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
@@ -130,22 +130,13 @@ AntiAliasingPass::~AntiAliasingPass()
 
 void AntiAliasingPass::init(const SceneState &scene_state)
 {
-  if (scene_state.reset_taa) {
-    sample_ = 0;
-  }
-  sample_len_ = scene_state.aa_samples;
-
-  /*TODO(Miguel Pozo): This can probably be removed.*/
-  /*
-  if (sample_len > 0 && valid_history == false) {
-    sample = 0;
-  }
-  */
+  sample_ = scene_state.sample;
+  samples_len_ = scene_state.samples_len;
 }
 
 void AntiAliasingPass::sync(SceneResources &resources, int2 resolution)
 {
-  if (sample_len_ > 0) {
+  if (samples_len_ > 0) {
     taa_accumulation_tx_.ensure_2d(GPU_RGBA16F, resolution);
     sample0_depth_tx_.ensure_2d(GPU_DEPTH24_STENCIL8, resolution);
   }
@@ -156,7 +147,7 @@ void AntiAliasingPass::sync(SceneResources &resources, int2 resolution)
 
   taa_accumulation_ps_.init();
   taa_accumulation_ps_.state_set(sample_ == 0 ? DRW_STATE_WRITE_COLOR :
-                                               DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
+                                                DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
   taa_accumulation_ps_.shader_set(taa_accumulation_sh_);
   taa_accumulation_ps_.bind_texture("colorBuffer", &resources.color_tx);
   taa_accumulation_ps_.push_constant("samplesWeights", weights_, 9);
@@ -194,18 +185,18 @@ void AntiAliasingPass::sync(SceneResources &resources, int2 resolution)
 
 bool AntiAliasingPass::setup_view(View &view, int2 resolution)
 {
-  if (sample_len_ == 0) {
+  if (samples_len_ == 0) {
     /* AA disabled. */
     return true;
   }
 
-  if (sample_ >= sample_len_) {
+  if (sample_ >= samples_len_) {
     /* TAA accumulation has finished. Just copy the result back */
     return false;
   }
 
   float2 sample_offset;
-  switch (sample_len_) {
+  switch (samples_len_) {
     default:
     case 5:
       sample_offset = TAA_SAMPLES.x5[sample_];
@@ -249,23 +240,20 @@ void AntiAliasingPass::draw(Manager &manager,
                             GPUTexture *depth_tx,
                             GPUTexture *color_tx)
 {
-  if (sample_len_ == 0) {
-    /* AA disabled. */
-    // valid_history = false;
+  if (samples_len_ == 0) {
     /* TODO(Miguel Pozo): Should render to the input color_tx and depth_tx in the first place */
     GPU_texture_copy(color_tx, resources.color_tx);
     GPU_texture_copy(depth_tx, resources.depth_tx);
     return;
   }
-  // valid_history = true;
 
   /**
    * We always do SMAA on top of TAA accumulation, unless the number of samples of TAA is already
    * high. This ensure a smoother transition.
    * If TAA accumulation is finished, we only blit the result.
    */
-  const bool last_sample = sample_ + 1 == sample_len_;
-  const bool taa_finished = sample_ >= sample_len_; /* TODO(Miguel Pozo): Why is this ever true ? */
+  const bool last_sample = sample_ + 1 == samples_len_;
+  const bool taa_finished = sample_ >= samples_len_;
 
   if (!taa_finished) {
     if (sample_ == 0) {
@@ -313,14 +301,6 @@ void AntiAliasingPass::draw(Manager &manager,
     manager.submit(smaa_resolve_ps_, view);
     smaa_weight_tx_.release();
   }
-
-  if (!taa_finished) {
-    sample_++;
-  }
-
-  if (!DRW_state_is_image_render() && sample_ < sample_len_) {
-    DRW_viewport_request_redraw();
-  }
 }
 
 }  // namespace blender::workbench
diff --git a/source/blender/draw/engines/workbench/workbench_effect_cavity.cc b/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
index d1c5c7abffb..4a8e20e49b7 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
+++ b/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
@@ -24,19 +24,14 @@ void CavityEffect::init(const SceneState &scene_state, UniformBuffer<WorldData>
   curvature_enabled_ = scene_state.draw_curvature;
 
   const int ssao_samples = scene_state.scene->display.matcap_ssao_samples;
-  int sample_count = min_ii(max_ii(1, scene_state.aa_samples) * ssao_samples, max_samples_);
+  int sample_count = min_ii(max_ii(1, scene_state.samples_len) * ssao_samples, max_samples_);
   const int max_iter_count = sample_count / ssao_samples;
 
-  if (scene_state.reset_taa) {
-    sample_ = 0;
-  }
-  sample_ %= max_iter_count;
+  sample_ = scene_state.sample % max_iter_count;
 
   world_buf.cavity_sample_start = ssao_samples * sample_;
   world_buf.cavity_sample_end = ssao_samples * (sample_ + 1);
 
-  sample_++;
-
   world_buf.cavity_sample_count_inv = 1.0f / (world_buf.cavity_sample_end -
                                               world_buf.cavity_sample_start);
   world_buf.cavity_jitter_scale = 1.0f / 64.0f;
diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.cc b/source/blender/draw/engines/workbench/workbench_effect_dof.cc
index 22ff78b6652..3c3ff803d98 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_dof.cc
+++ b/source/blender/draw/engines/workbench/workbench_effect_dof.cc
@@ -103,6 +103,16 @@ void DofPass::init(const SceneState &scene_state)
     return;
   }
 
+  if (prepare_sh_ == nullptr) {
+    prepare_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_prepare");
+    downsample_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_downsample");
+    blur1_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur1");
+    blur2_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur2");
+    resolve_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_resolve");
+  }
+
+  offset_ = scene_state.sample / (float)max_ii(1, scene_state.samples_len);
+
   int2 half_res = scene_state.resolution / 2;
   half_res = {max_ii(half_res.x, 1), max_ii(half_res.y, 1)};
 
@@ -157,14 +167,6 @@ void DofPass::sync(SceneResources &resources)
     return;
   }
 
-  if (prepare_sh_ == nullptr) {
-    prepare_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_prepare");
-    downsample_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_downsample");
-    blur1_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur1");
-    blur2_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_blur2");
-    resolve_sh_ = GPU_shader_create_from_info_name("workbench_effect_dof_resolve");
-  }
-
   eGPUSamplerState sampler_state = GPU_SAMPLER_FILTER | GPU_SAMPLER_MIPMAP;
 
   down_ps_.init();
@@ -184,9 +186,6 @@ void DofPass::sync(SceneResources &resources)
   down2_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state);
   down2_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
 
-  float offset = 0; /*TODO(Miguel Pozo)*/
-  // float offset = wpd->taa_sample / (float)max_ii(1, wpd->taa_sample_len);
-
   /* TODO(Miguel Pozo): Move jitter_tx to SceneResources */
   /* We reuse the same noise texture. Ensure it is up to date. */
   // workbench_cavity_samples_ubo_ensure(wpd);
@@ -199,7 +198,7 @@ void DofPass::sync(SceneResources &resources)
   blur_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state);
   blur_ps_.bind_texture("halfResColorTex", &source_tx_, sampler_state);
   blur_ps_.push_constant("invertedViewportSize", float2(DRW_viewport_invert_size_get()));
-  blur_ps_.push_constant("noiseOffset", offset);
+  blur_ps_.push_constant("noiseOffset", offset_);
   blur_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
 
   blur2_ps_.init();
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 6f5b7e3b6e5..3be0f8f4360 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -63,6 +63,10 @@ class Instance {
 
   void object_sync(Manager &manager, ObjectRef &ob_ref)
   {
+    if (scene_state.render_finished) {
+      return;
+    }
+
     Object *ob = ob_ref.object;
     if (!DRW_object_is_renderable(ob)) {
       return;
@@ -290,6 +294,12 @@ class Instance {
   {
     int2 resolution = scene_state.resolution;
 
+    if (scene_state.render_finished) {
+      /* Just copy back the already rendered result */
+      anti_aliasing_ps.draw(manager, view, resources, resolution, depth_tx, color_tx);
+      return;
+    }
+
     anti_aliasing_ps.setup_view(view, resolution);
 
     if (!scene_state.clip_planes.is_empty()) {
@@ -339,6 +349,10 @@ class Instance {
   void draw_viewport(Manager &manager, View &view, GPUTexture *depth_tx, GPUTexture *color_tx)
   {
     this->draw(manager, view, depth_tx, color_tx);
+
+    if (scene_state.sample + 1 < scene_state.samples_len) {
+      DRW_viewport_request_redraw();
+    }
   }
 };
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index fca158b4eec..b905d182cf5 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -81,9 +81,10 @@ struct SceneState {
   bool draw_object_id;
   bool draw_transparent_depth;
 
-  int aa_samples;
-  bool reset_taa;
+  int sample;
+  int samples_len;
   bool reset_taa_next_sample;
+  bool render_finished;
 
   /** Used when material_subtype == eMaterialSubType::SINGLE */
   Material material_override = Material(float3(1.0f));
@@ -252,6 +253,8 @@ class OutlinePass {
 class DofPass {
   bool enabled_;
 
+  float offset_;
+
   static const int kernel_radius_ = 3;
   static const int samples_len_ = (kernel_radius_ * 2 + 1) * (kernel_radius_ * 2 + 1);
 
@@ -291,18 +294,16 @@ class DofPass {
 
 class AntiAliasingPass {
  private:
-  /** Total number of samples to after which TAA stops accumulating samples. */
-  int sample_len_;
-  /** Current TAA sample index in [0..sample_len] range. */
+  /** Current TAA sample index in [0..samples_len_] range. */
   int sample_;
+  /** Total number of samples to after which TAA stops accumulating samples. */
+  int samples_len_;
   /** Weight accumulated. */
   float weight_accum_;


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list