[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