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, _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs