[Bf-blender-cvs] [8501e93deaa] tmp-workbench-rewrite2: Refactor

Miguel Pozo noreply at git.blender.org
Mon Oct 10 13:48:56 CEST 2022


Commit: 8501e93deaaf22a5f25c77967e861153e53dd560
Author: Miguel Pozo
Date:   Mon Oct 10 13:45:45 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB8501e93deaaf22a5f25c77967e861153e53dd560

Refactor

Split workbench_engine.cc into multiple files.
Move all the SceneResources loading logic directly into Instance.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
M	source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
R084	source/blender/draw/engines/workbench/workbench_defines.h	source/blender/draw/engines/workbench/workbench_defines.hh
A	source/blender/draw/engines/workbench/workbench_effect_antialiasing.cc
M	source/blender/draw/engines/workbench/workbench_engine.cc
A	source/blender/draw/engines/workbench/workbench_enums.hh
A	source/blender/draw/engines/workbench/workbench_materials.cc
A	source/blender/draw/engines/workbench/workbench_mesh_passes.cc
A	source/blender/draw/engines/workbench/workbench_private.hh
A	source/blender/draw/engines/workbench/workbench_shader_cache.cc

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 95ebbd054c0..d84f0df816b 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -155,15 +155,19 @@ set(SRC
   engines/eevee_next/eevee_world.cc
   engines/workbench/workbench_data.c
   engines/workbench/workbench_effect_antialiasing.c
+  engines/workbench/workbench_effect_antialiasing.cc
   engines/workbench/workbench_effect_cavity.c
   engines/workbench/workbench_effect_dof.c
   engines/workbench/workbench_effect_outline.c
   engines/workbench/workbench_engine.c
   engines/workbench/workbench_engine.cc
   engines/workbench/workbench_materials.c
+  engines/workbench/workbench_materials.cc
+  engines/workbench/workbench_mesh_passes.cc
   engines/workbench/workbench_opaque.c
   engines/workbench/workbench_render.c
   engines/workbench/workbench_shader.cc
+  engines/workbench/workbench_shader_cache.cc
   engines/workbench/workbench_shadow.c
   engines/workbench/workbench_transparent.c
   engines/workbench/workbench_volume.c
@@ -678,6 +682,7 @@ set(GLSL_SRC
 )
 
 set(GLSL_C)
+
 foreach(GLSL_FILE ${GLSL_SRC})
   data_to_c_simple(${GLSL_FILE} GLSL_C)
 endforeach()
@@ -689,6 +694,7 @@ list(APPEND LIB
 )
 
 set(GLSL_SOURCE_CONTENT "")
+
 foreach(GLSL_FILE ${GLSL_SRC})
   get_filename_component(GLSL_FILE_NAME ${GLSL_FILE} NAME)
   string(REPLACE "." "_" GLSL_FILE_NAME_UNDERSCORES ${GLSL_FILE_NAME})
@@ -733,7 +739,6 @@ if(WITH_GTESTS)
   endif()
 endif()
 
-
 blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
 
 # Needed so we can use dna_type_offsets.h for defaults initialization.
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
index 2cd795d3f7e..f2e996a1f0f 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
 #include "gpu_shader_create_info.hh"
-#include "workbench_defines.h"
+#include "workbench_defines.hh"
 
 /* -------------------------------------------------------------------- */
 /** \name Base Composite
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
index ab4a2a2ac33..f4db7bc522f 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
 #include "gpu_shader_create_info.hh"
-#include "workbench_defines.h"
+#include "workbench_defines.hh"
 
 /* -------------------------------------------------------------------- */
 /** \name Object Type
diff --git a/source/blender/draw/engines/workbench/workbench_defines.h b/source/blender/draw/engines/workbench/workbench_defines.hh
similarity index 84%
rename from source/blender/draw/engines/workbench/workbench_defines.h
rename to source/blender/draw/engines/workbench/workbench_defines.hh
index 33fe189c9ff..2b85c19b0a3 100644
--- a/source/blender/draw/engines/workbench/workbench_defines.h
+++ b/source/blender/draw/engines/workbench/workbench_defines.hh
@@ -5,3 +5,5 @@
 #define WB_TILEMAP_SLOT 2
 #define WB_MATERIAL_SLOT 0
 #define WB_WORLD_SLOT 4
+
+#define WB_RESOLVE_GROUP_SIZE 8
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
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 509c82ea572..2f11ed48723 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -2,625 +2,14 @@
 
 #include "BKE_studiolight.h"
 #include "DEG_depsgraph_query.h"
-#include "DRW_render.h"
 #include "GPU_capabilities.h"
 
-#include "smaa_textures.h"
-
-#include "draw_manager.hh"
-#include "draw_pass.hh"
-
-#include "workbench_defines.h"
-#include "workbench_shader_shared.h"
+#include "workbench_private.hh"
 
 namespace blender::workbench {
 
 using namespace draw;
 
-#define WB_RESOLVE_GROUP_SIZE 8
-
-enum class eGeometryType {
-  MESH = 0,
-  CURVES,
-  POINTCLOUD,
-};
-static constexpr int geometry_type_len = static_cast<int>(eGeometryType::POINTCLOUD) + 1;
-
-static inline const char *get_name(eGeometryType type)
-{
-  switch (type) {
-    case eGeometryType::MESH:
-      return "Mesh";
-    case eGeometryType::CURVES:
-      return "Curves";
-    case eGeometryType::POINTCLOUD:
-      return "PointCloud";
-    default:
-      BLI_assert_unreachable();
-      return "";
-  }
-}
-
-static inline eGeometryType geometry_type_from_object(Object *ob)
-{
-  switch (ob->type) {
-    case OB_CURVES:
-      return eGeometryType::CURVES;
-    case OB_POINTCLOUD:
-      return eGeometryType::POINTCLOUD;
-    default:
-      return eGeometryType::MESH;
-  }
-}
-
-enum class ePipelineType {
-  OPAQUE = 0,
-  TRANSPARENT,
-  SHADOW,
-};
-static constexpr int pipeline_type_len = static_cast<int>(ePipelineType::SHADOW) + 1;
-
-enum class eShadingType {
-  FLAT = 0, /* V3D_LIGHTING_STUDIO */
-  STUDIO,   /* V3D_LIGHTING_MATCAP */
-  MATCAP,   /* V3D_LIGHTING_FLAT */
-};
-static constexpr int shading_type_len = static_cast<int>(eShadingType::MATCAP) + 1;
-
-enum class eColorType {
-  MATERIAL = 0,
-  TEXTURE,
-};
-static constexpr int color_type_len = static_cast<int>(eColorType::TEXTURE) + 1;
-
-enum class eMaterialSubType {
-  NONE = 0,
-  MATERIAL,
-  RANDOM,
-  SINGLE,
-  OBJECT,
-  ATTRIBUTE,
-};
-static constexpr int material_subtype_len = static_cast<int>(eMaterialSubType::ATTRIBUTE) + 1;
-
-struct Material {
-  float3 base_color;
-  /* Packed data into a int. Decoded in the shader. */
-  uint packed_data;
-
-  Material() = default;
-
-  Material(float3 color)
-  {
-    base_color = color;
-    packed_data = Material::pack_data(0.0f, 0.4f, 1.0f);
-  }
-  Material(::Object &ob, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list