[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