[Bf-blender-cvs] [15b2caab21a] tmp-workbench-rewrite2: Don't create an extra handle for shadows

Miguel Pozo noreply at git.blender.org
Mon Jan 16 19:27:19 CET 2023


Commit: 15b2caab21abfb3556d1f57b28d571519c707f89
Author: Miguel Pozo
Date:   Mon Jan 16 19:23:39 2023 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB15b2caab21abfb3556d1f57b28d571519c707f89

Don't create an extra handle for shadows

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

M	source/blender/draw/engines/workbench/workbench_engine.cc
M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_shadow.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index b63f63f7109..afa8281d1e0 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -165,6 +165,7 @@ class Instance {
 
   void mesh_sync(Manager &manager, ObjectRef &ob_ref, const ObjectState &object_state)
   {
+    ResourceHandle handle = manager.resource_handle(ob_ref);
     bool has_transparent_material = false;
 
     if (object_state.sculpt_pbvh) {
@@ -193,8 +194,8 @@ class Instance {
             /* TODO(fclem): This create a cull-able instance for each sub-object. This is done
              * for simplicity to reduce complexity. But this increase the overhead per object.
              * Instead, we should use an indirection buffer to the material buffer. */
+            ResourceHandle handle = i == 0 ? handle : manager.resource_handle(ob_ref);
 
-            ResourceHandle handle = manager.resource_handle(ob_ref);
             Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
 
             if (::Material *_mat = BKE_object_material_get_eval(ob_ref.object, i + 1)) {
@@ -235,7 +236,6 @@ class Instance {
         }
 
         if (batch) {
-          ResourceHandle handle = manager.resource_handle(ob_ref);
           Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
 
           if (object_state.color_type == V3D_SHADING_OBJECT_COLOR) {
@@ -267,7 +267,7 @@ class Instance {
     }
 
     if (object_state.draw_shadow) {
-      shadow_ps.object_sync(manager, ob_ref, scene_state, has_transparent_material);
+      shadow_ps.object_sync(manager, scene_state, ob_ref, handle, has_transparent_material);
     }
   }
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index ee63f2c2010..086553ca5c1 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -300,8 +300,9 @@ class ShadowPass {
   void update();
   void sync();
   void object_sync(Manager &manager,
-                   ObjectRef &ob_ref,
                    SceneState &scene_state,
+                   ObjectRef &ob_ref,
+                   ResourceHandle handle,
                    const bool has_transp_mat);
   void draw(Manager &manager,
             View &view,
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 10a7ca19277..22c7b663220 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -391,8 +391,9 @@ void ShadowPass::sync()
 }
 
 void ShadowPass::object_sync(Manager &manager,
-                             ObjectRef &ob_ref,
                              SceneState &scene_state,
+                             ObjectRef &ob_ref,
+                             ResourceHandle handle,
                              const bool has_transp_mat)
 {
   if (!enabled_) {
@@ -423,8 +424,6 @@ void ShadowPass::object_sync(Manager &manager,
   /* 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.draw(geom_shadow, handle);



More information about the Bf-blender-cvs mailing list