[Bf-blender-cvs] [646613c23da] tmp-worbench-rewrite2-optimizations: Optimize Workbench Next Shadows

Miguel Pozo noreply at git.blender.org
Sun Jan 1 15:39:55 CET 2023


Commit: 646613c23da8a4bcb3e43aa2257c3f88090ba98f
Author: Miguel Pozo
Date:   Wed Dec 28 18:07:31 2022 +0100
Branches: tmp-worbench-rewrite2-optimizations
https://developer.blender.org/rB646613c23da8a4bcb3e43aa2257c3f88090ba98f

Optimize Workbench Next Shadows

Don't use push constants. Use the same object handle for all passes.

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

M	source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M	source/blender/draw/engines/workbench/workbench_shadow.cc

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

diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
index d1e7e0046d8..7ebebdf8c2b 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
@@ -11,7 +11,8 @@
 GPU_SHADER_INTERFACE_INFO(workbench_shadow_iface, "vData")
     .smooth(Type::VEC3, "pos")
     .smooth(Type::VEC4, "frontPosition")
-    .smooth(Type::VEC4, "backPosition");
+    .smooth(Type::VEC4, "backPosition")
+    .flat(Type::VEC3, "light_direction_os"); /*Workbench Next*/
 
 GPU_SHADER_CREATE_INFO(workbench_shadow_common)
     .vertex_in(0, Type::VEC3, "pos")
@@ -31,7 +32,8 @@ GPU_SHADER_CREATE_INFO(workbench_next_shadow_common)
     .vertex_out(workbench_shadow_iface)
     .define("WORKBENCH_NEXT")
     .uniform_buf(1, "ShadowPassData", "pass_data")
-    .push_constant(Type::VEC3, "lightDirection")
+    //.push_constant(Type::VEC3, "lightDirection")
+    .define("lightDirection", "vData[0].light_direction_os")
     .typedef_source("workbench_shader_shared.h")
     .additional_info("draw_view")
     .additional_info("draw_modelmat_new")
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
index c3664da66ad..1df514c9081 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -6,6 +6,7 @@ void main()
   vData.pos = pos;
   vData.frontPosition = point_object_to_ndc(pos);
 #ifdef WORKBENCH_NEXT
+  vData.light_direction_os = normal_world_to_object(pass_data.light_direction_ws);
   vec3 pos_ws = point_object_to_world(pos);
   float extrude_distance = 1e5f;
   float LDoFP = dot(pass_data.light_direction_ws, pass_data.far_plane.xyz);
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 0259233cb9f..aaba9a76877 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -420,31 +420,18 @@ void ShadowPass::object_sync(Manager &manager,
 
   PassType fail_type = force_fail_pass ? ForcedFail : Fail;
 
-  /* TODO(Miguel Pozo): Compute on the visibility compute shader ? */
-  float3 light_direction_os = float4x4(ob->world_to_object).ref_3x3() *
-                              pass_data_.light_direction_ws;
-
   /* Unless we force the Fail Method we add draw commands to both methods,
    * then the visibility compute shader selects the one needed */
 
+  ResourceHandle handle = manager.resource_handle(ob_ref);
+
   if (!force_fail_pass) {
     PassMain::Sub &ps = *get_pass_ptr(Pass, is_manifold);
-    ps.push_constant("lightDirection", light_direction_os);
-    ResourceHandle handle = manager.resource_handle(ob_ref);
-    ps.draw(geom_shadow, handle);
-  }
-  {
-    PassMain::Sub &ps = *get_pass_ptr(fail_type, is_manifold, true);
-    ps.push_constant("lightDirection", light_direction_os);
-    ResourceHandle handle = manager.resource_handle(ob_ref);
-    ps.draw(DRW_cache_object_surface_get(ob), handle);
-  }
-  {
-    PassMain::Sub &ps = *get_pass_ptr(fail_type, is_manifold, false);
-    ps.push_constant("lightDirection", light_direction_os);
-    ResourceHandle handle = manager.resource_handle(ob_ref);
     ps.draw(geom_shadow, handle);
   }
+
+  get_pass_ptr(fail_type, is_manifold, true)->draw(DRW_cache_object_surface_get(ob), handle);
+  get_pass_ptr(fail_type, is_manifold, false)->draw(geom_shadow, handle);
 }
 
 void ShadowPass::draw(Manager &manager,



More information about the Bf-blender-cvs mailing list