[Bf-blender-cvs] [5c0e1aab81b] temp-T88822-gpu-thread-safe-index-builder: Fix crash when extracting multiple iterators.

Jeroen Bakker noreply at git.blender.org
Fri Jun 4 16:01:00 CEST 2021


Commit: 5c0e1aab81bf1001b01396c3a151ca8dddbc1451
Author: Jeroen Bakker
Date:   Fri Jun 4 15:40:21 2021 +0200
Branches: temp-T88822-gpu-thread-safe-index-builder
https://developer.blender.org/rB5c0e1aab81bf1001b01396c3a151ca8dddbc1451

Fix crash when extracting multiple iterators.

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

M	source/blender/draw/intern/draw_cache_extract_mesh.cc

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

diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc
index df183f421a7..f640894531f 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc
@@ -29,6 +29,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_scene_types.h"
 
+#include "BLI_math_bits.h"
 #include "BLI_task.h"
 #include "BLI_vector.hh"
 
@@ -107,7 +108,7 @@ class ExtractorRunDatas : public Vector<ExtractorRunData> {
     }
   }
 
-  eMRIterType iter_types()
+  eMRIterType iter_types() const
   {
     eMRIterType iter_type = static_cast<eMRIterType>(0);
 
@@ -118,6 +119,13 @@ class ExtractorRunDatas : public Vector<ExtractorRunData> {
     return iter_type;
   }
 
+  const uint iter_types_len() const
+  {
+    const eMRIterType iter_type = iter_types();
+    uint bits = static_cast<uint>(iter_type);
+    return count_bits_i(bits);
+  }
+
   eMRDataType data_types()
   {
     eMRDataType data_type = static_cast<eMRDataType>(0);
@@ -937,6 +945,7 @@ static void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
        */
       int num_threads = BLI_task_scheduler_num_threads();
       num_threads -= single_threaded_extractors_len % num_threads;
+      const int task_len = multi_threaded_extractors->iter_types_len() * num_threads;
 
       UserDataInitTaskData *user_data_init_task_data = new UserDataInitTaskData();
       struct TaskNode *task_node_user_data_init = user_data_init_task_node_create(
@@ -947,7 +956,7 @@ static void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
                                                          multi_threaded_extractors,
                                                          mbc,
                                                          &user_data_init_task_data->task_counter,
-                                                         num_threads);
+                                                         task_len);
 
       extract_task_in_ranges_create(
           task_graph, task_node_user_data_init, user_data_init_task_data->td, num_threads);



More information about the Bf-blender-cvs mailing list