[Bf-blender-cvs] [58253b535fa] functions: make Block Allocator part of action interface

Jacques Lucke noreply at git.blender.org
Thu Jun 27 15:50:13 CEST 2019


Commit: 58253b535fa3545ae2839e61c9d9f58283407ba6
Author: Jacques Lucke
Date:   Thu Jun 27 15:41:25 2019 +0200
Branches: functions
https://developer.blender.org/rB58253b535fa3545ae2839e61c9d9f58283407ba6

make Block Allocator part of action interface

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

M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/simulate.cpp

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

diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index 0e57a356b8a..b1d3ff15452 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -47,6 +47,12 @@ class ParticlesState {
   }
 };
 
+/**
+ * This class allows allocating new blocks from different particle containers.
+ * A single instance is not thread safe, but multiple allocator instances can
+ * be used by multiple threads at the same time.
+ * It might hand out the same block more than once until it is full.
+ */
 class BlockAllocator {
  private:
   ParticlesState &m_state;
@@ -290,10 +296,17 @@ class Event {
 class ActionInterface {
  private:
   ParticleSet m_particles;
+  BlockAllocator &m_block_allocator;
 
  public:
-  ActionInterface(ParticleSet particles) : m_particles(particles)
+  ActionInterface(ParticleSet particles, BlockAllocator &block_allocator)
+      : m_particles(particles), m_block_allocator(block_allocator)
+  {
+  }
+
+  BlockAllocator &block_allocator()
   {
+    return m_block_allocator;
   }
 
   ParticleSet &particles()
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index e3624a37179..cd5b4937f58 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -118,7 +118,8 @@ BLI_NOINLINE static void find_unfinished_particles(
   }
 }
 
-BLI_NOINLINE static void run_actions(ParticlesBlock &block,
+BLI_NOINLINE static void run_actions(BlockAllocator &block_allocator,
+                                     ParticlesBlock &block,
                                      ArrayRef<SmallVector<uint>> particles_per_event,
                                      ArrayRef<Event *> events,
                                      ArrayRef<Action *> action_per_event)
@@ -127,7 +128,7 @@ BLI_NOINLINE static void run_actions(ParticlesBlock &block,
     Action *action = action_per_event[event_index];
     ParticleSet particles(block, particles_per_event[event_index]);
 
-    ActionInterface interface(particles);
+    ActionInterface interface(particles, block_allocator);
     action->execute(interface);
   }
 }
@@ -175,7 +176,8 @@ BLI_NOINLINE static void compute_ideal_attribute_offsets(ParticleSet particles,
   }
 }
 
-BLI_NOINLINE static void simulate_to_next_event(ParticleSet particles,
+BLI_NOINLINE static void simulate_to_next_event(BlockAllocator &block_allocator,
+                                                ParticleSet particles,
                                                 ArrayRef<float> durations,
                                                 float end_time,
                                                 ParticleType &particle_type,
@@ -205,7 +207,8 @@ BLI_NOINLINE static void simulate_to_next_event(ParticleSet particles,
 
   SmallVector<SmallVector<uint>> particles_per_event(particle_type.events().size());
   find_particles_per_event(particles.indices(), next_event_indices, particles_per_event);
-  run_actions(particles.block(),
+  run_actions(block_allocator,
+              particles.block(),
               particles_per_event,
               particle_type.events(),
               particle_type.action_per_event());
@@ -221,6 +224,7 @@ BLI_NOINLINE static void simulate_to_next_event(ParticleSet particles,
 
 BLI_NOINLINE static void simulate_with_max_n_events(
     uint max_events,
+    BlockAllocator &block_allocator,
     ParticleSet particles,
     ArrayRef<float> durations,
     float end_time,
@@ -236,7 +240,8 @@ BLI_NOINLINE static void simulate_with_max_n_events(
     r_remaining_durations.clear();
 
     ParticleSet particles_to_simulate(particles.block(), remaining_particle_indices);
-    simulate_to_next_event(particles_to_simulate,
+    simulate_to_next_event(block_allocator,
+                           particles_to_simulate,
                            durations,
                            end_time,
                            particle_type,
@@ -280,7 +285,8 @@ BLI_NOINLINE static void simulate_ignoring_events(ParticleSet particles,
   }
 }
 
-BLI_NOINLINE static void step_individual_particles(ParticleSet particles,
+BLI_NOINLINE static void step_individual_particles(BlockAllocator &block_allocator,
+                                                   ParticleSet particles,
                                                    ArrayRef<float> durations,
                                                    float end_time,
                                                    ParticleType &particle_type)
@@ -289,6 +295,7 @@ BLI_NOINLINE static void step_individual_particles(ParticleSet particles,
   SmallVector<float> remaining_durations;
 
   simulate_with_max_n_events(10,
+                             block_allocator,
                              particles,
                              durations,
                              end_time,
@@ -305,6 +312,7 @@ struct StepBlocksParallelData {
   ArrayRef<float> all_durations;
   float end_time;
   ParticleType &particle_type;
+  ParticlesState &particles_state;
 };
 
 BLI_NOINLINE static void step_individual_particles_cb(
@@ -313,15 +321,19 @@ BLI_NOINLINE static void step_individual_particles_cb(
   StepBlocksParallelData *data = (StepBlocksParallelData *)userdata;
   ParticlesBlock &block = *data->blocks[index];
 
+  BlockAllocator block_allocator(data->particles_state);
+
   uint active_amount = block.active_amount();
   ParticleSet active_particles(block, static_number_range_ref(0, active_amount));
-  step_individual_particles(active_particles,
+  step_individual_particles(block_allocator,
+                            active_particles,
                             data->all_durations.take_front(active_amount),
                             data->end_time,
                             data->particle_type);
 }
 
-BLI_NOINLINE static void step_individual_particles(ArrayRef<ParticlesBlock *> blocks,
+BLI_NOINLINE static void step_individual_particles(ParticlesState &state,
+                                                   ArrayRef<ParticlesBlock *> blocks,
                                                    TimeSpan time_span,
                                                    ParticleType &particle_type)
 {
@@ -336,7 +348,7 @@ BLI_NOINLINE static void step_individual_particles(ArrayRef<ParticlesBlock *> bl
   SmallVector<float> all_durations(block_size);
   all_durations.fill(time_span.duration());
 
-  StepBlocksParallelData data = {blocks, all_durations, time_span.end(), particle_type};
+  StepBlocksParallelData data = {blocks, all_durations, time_span.end(), particle_type, state};
 
   BLI_task_parallel_range(
       0, blocks.size(), (void *)&data, step_individual_particles_cb, &settings);
@@ -404,8 +416,11 @@ BLI_NOINLINE static void emit_new_particles_from_emitter(StepDescription &descri
       }
 
       ParticleSet emitted_particles(block, static_number_range_ref(range));
-      step_individual_particles(
-          emitted_particles, initial_step_durations, time_span.end(), particle_type);
+      step_individual_particles(block_allocator,
+                                emitted_particles,
+                                initial_step_durations,
+                                time_span.end(),
+                                particle_type);
 
       particle_count += emitted_particles.size();
     }
@@ -477,7 +492,7 @@ void simulate_step(ParticlesState &state, StepDescription &description)
     ParticleType &type = description.particle_type(type_id);
     ParticlesContainer &container = *containers.lookup(type_id);
 
-    step_individual_particles(container.active_blocks().to_small_vector(), time_span, type);
+    step_individual_particles(state, container.active_blocks().to_small_vector(), time_span, type);
   }
 
   BlockAllocator block_allocator(state);



More information about the Bf-blender-cvs mailing list