Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc')
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
new file mode 100644
index 00000000000..a437717f7f6
--- /dev/null
+++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "workbench_private.hh"
+
+#include "smaa_textures.h"
+
+namespace blender::workbench {
+
+AntiAliasingPass::AntiAliasingPass()
+{
+ smaa_edge_detect_sh = GPU_shader_create_from_info_name("workbench_smaa_stage_0");
+ smaa_aa_weight_sh = GPU_shader_create_from_info_name("workbench_smaa_stage_1");
+ smaa_resolve_sh = GPU_shader_create_from_info_name("workbench_smaa_stage_2");
+
+ smaa_search_tx.ensure_2d(GPU_R8, {SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT});
+ GPU_texture_update(smaa_search_tx, GPU_DATA_UBYTE, searchTexBytes);
+ GPU_texture_filter_mode(smaa_search_tx, true);
+
+ smaa_area_tx.ensure_2d(GPU_RG8, {AREATEX_WIDTH, AREATEX_HEIGHT});
+ GPU_texture_update(smaa_area_tx, GPU_DATA_UBYTE, areaTexBytes);
+ GPU_texture_filter_mode(smaa_area_tx, true);
+}
+
+AntiAliasingPass::~AntiAliasingPass()
+{
+ if (smaa_edge_detect_sh) {
+ GPU_shader_free(smaa_edge_detect_sh);
+ }
+ if (smaa_aa_weight_sh) {
+ GPU_shader_free(smaa_aa_weight_sh);
+ }
+ if (smaa_resolve_sh) {
+ GPU_shader_free(smaa_resolve_sh);
+ }
+}
+
+void AntiAliasingPass::sync(SceneResources &resources)
+{
+ {
+ smaa_edge_detect_ps_.init();
+ smaa_edge_detect_ps_.state_set(DRW_STATE_WRITE_COLOR);
+ smaa_edge_detect_ps_.shader_set(smaa_edge_detect_sh);
+ smaa_edge_detect_ps_.bind_texture("colorTex", &resources.color_tx);
+ smaa_edge_detect_ps_.push_constant("viewportMetrics", &smaa_viewport_metrics, 1);
+ smaa_edge_detect_ps_.clear_color(float4(0.0f));
+ smaa_edge_detect_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
+ }
+ {
+ smaa_aa_weight_ps_.init();
+ smaa_aa_weight_ps_.state_set(DRW_STATE_WRITE_COLOR);
+ smaa_aa_weight_ps_.shader_set(smaa_aa_weight_sh);
+ smaa_aa_weight_ps_.bind_texture("edgesTex", &smaa_edge_tx);
+ smaa_aa_weight_ps_.bind_texture("areaTex", smaa_area_tx);
+ smaa_aa_weight_ps_.bind_texture("searchTex", smaa_search_tx);
+ smaa_aa_weight_ps_.push_constant("viewportMetrics", &smaa_viewport_metrics, 1);
+ smaa_aa_weight_ps_.clear_color(float4(0.0f));
+ smaa_aa_weight_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
+ }
+ {
+ smaa_resolve_ps_.init();
+ smaa_resolve_ps_.state_set(DRW_STATE_WRITE_COLOR);
+ smaa_resolve_ps_.shader_set(smaa_resolve_sh);
+ smaa_resolve_ps_.bind_texture("blendTex", &smaa_weight_tx);
+ smaa_resolve_ps_.bind_texture("colorTex", &resources.color_tx);
+ smaa_resolve_ps_.push_constant("viewportMetrics", &smaa_viewport_metrics, 1);
+ smaa_resolve_ps_.push_constant("mixFactor", &smaa_mix_factor, 1);
+ smaa_resolve_ps_.push_constant("taaAccumulatedWeight", &taa_weight_accum, 1);
+ smaa_resolve_ps_.clear_color(float4(0.0f));
+ smaa_resolve_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
+ }
+}
+
+void AntiAliasingPass::draw(Manager &manager,
+ View &view,
+ GPUTexture *depth_tx,
+ GPUTexture *color_tx)
+{
+ int2 size = {GPU_texture_width(depth_tx), GPU_texture_height(depth_tx)};
+
+ taa_weight_accum = 1.0f; /* TODO */
+
+ smaa_viewport_metrics = float4(1.0f / size.x, 1.0f / size.y, size.x, size.y);
+ smaa_mix_factor = 1.0f; /* TODO */
+
+ smaa_edge_tx.acquire(size, GPU_RG8);
+ smaa_edge_fb.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(smaa_edge_tx));
+ smaa_edge_fb.bind();
+ manager.submit(smaa_edge_detect_ps_, view);
+
+ smaa_weight_tx.acquire(size, GPU_RGBA8);
+ smaa_weight_fb.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(smaa_weight_tx));
+ smaa_weight_fb.bind();
+ manager.submit(smaa_aa_weight_ps_, view);
+ smaa_edge_tx.release();
+
+ smaa_resolve_fb.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(color_tx));
+ smaa_resolve_fb.bind();
+ manager.submit(smaa_resolve_ps_, view);
+ smaa_weight_tx.release();
+}
+
+} // namespace blender::workbench