[Bf-blender-cvs] [6c499c6ea50] profiler-editor: support profiling ranges more efficiently

Jacques Lucke noreply at git.blender.org
Sat May 1 13:30:33 CEST 2021


Commit: 6c499c6ea508b87ee3d1460ce4c5c4c724fdc744
Author: Jacques Lucke
Date:   Sat May 1 13:11:01 2021 +0200
Branches: profiler-editor
https://developer.blender.org/rB6c499c6ea508b87ee3d1460ce4c5c4c724fdc744

support profiling ranges more efficiently

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

M	source/blender/blenkernel/intern/modifier.c
M	source/blender/blenlib/BLI_profile.h
M	source/blender/blenlib/BLI_profile.hh
M	source/blender/blenlib/BLI_profile_manage.hh
M	source/blender/blenlib/intern/profile.cc
M	source/blender/depsgraph/intern/eval/deg_eval.cc
M	source/blender/editors/space_profiler/profiler_layout.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 0fc3ac32040..0ec0b7f0177 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -1054,7 +1054,7 @@ struct Mesh *BKE_modifier_modify_mesh(ModifierData *md,
     modwrap_dependsOnNormals(me);
   }
   BLI_ProfileTask profile_task;
-  BLI_profile_task_begin(&profile_task, md->name);
+  BLI_profile_task_begin_named(&profile_task, md->name);
   Mesh *new_mesh = mti->modifyMesh(md, ctx, me);
   BLI_profile_task_end(&profile_task);
   return new_mesh;
@@ -1073,7 +1073,7 @@ void BKE_modifier_deform_verts(ModifierData *md,
     modwrap_dependsOnNormals(me);
   }
   BLI_ProfileTask profile_task;
-  BLI_profile_task_begin(&profile_task, md->name);
+  BLI_profile_task_begin_named(&profile_task, md->name);
   mti->deformVerts(md, ctx, me, vertexCos, numVerts);
   BLI_profile_task_end(&profile_task);
 }
diff --git a/source/blender/blenlib/BLI_profile.h b/source/blender/blenlib/BLI_profile.h
index d5929dcae08..fb812356b81 100644
--- a/source/blender/blenlib/BLI_profile.h
+++ b/source/blender/blenlib/BLI_profile.h
@@ -35,28 +35,45 @@ BLI_INLINE bool BLI_profile_is_enabled(void)
   return bli_profiling_is_enabled;
 }
 
-void _bli_profile_task_begin(BLI_ProfileTask *task, const char *name);
-void _bli_profile_task_begin_subtask(BLI_ProfileTask *task,
-                                     const char *name,
-                                     const BLI_ProfileTask *parent_task);
+void _bli_profile_task_begin_named(BLI_ProfileTask *task, const char *name);
+void _bli_profile_task_begin_named_subtask(BLI_ProfileTask *task,
+                                           const char *name,
+                                           const BLI_ProfileTask *parent_task);
+void _bli_profile_task_begin_range(BLI_ProfileTask *task,
+                                   const BLI_ProfileTask *parent_task,
+                                   int64_t start,
+                                   int64_t one_after_last);
 void _bli_profile_task_end(BLI_ProfileTask *task);
 
-BLI_INLINE void BLI_profile_task_begin(BLI_ProfileTask *task, const char *name)
+BLI_INLINE void BLI_profile_task_begin_named(BLI_ProfileTask *task, const char *name)
 {
   if (bli_profiling_is_enabled) {
-    _bli_profile_task_begin(task, name);
+    _bli_profile_task_begin_named(task, name);
   }
   else {
     task->id = BLI_PROFILE_DUMMY_ID;
   }
 }
 
-BLI_INLINE void BLI_profile_task_begin_subtask(BLI_ProfileTask *task,
-                                               const char *name,
-                                               const BLI_ProfileTask *parent_task)
+BLI_INLINE void BLI_profile_task_begin_named_subtask(BLI_ProfileTask *task,
+                                                     const char *name,
+                                                     const BLI_ProfileTask *parent_task)
 {
   if (bli_profiling_is_enabled) {
-    _bli_profile_task_begin_subtask(task, name, parent_task);
+    _bli_profile_task_begin_named_subtask(task, name, parent_task);
+  }
+  else {
+    task->id = BLI_PROFILE_DUMMY_ID;
+  }
+}
+
+BLI_INLINE void BLI_profile_task_begin_range(BLI_ProfileTask *task,
+                                             const BLI_ProfileTask *parent_task,
+                                             const int64_t start,
+                                             const int64_t one_after_last)
+{
+  if (bli_profiling_is_enabled) {
+    _bli_profile_task_begin_range(task, parent_task, start, one_after_last);
   }
   else {
     task->id = BLI_PROFILE_DUMMY_ID;
diff --git a/source/blender/blenlib/BLI_profile.hh b/source/blender/blenlib/BLI_profile.hh
index 2e52c8f1447..89005cb705c 100644
--- a/source/blender/blenlib/BLI_profile.hh
+++ b/source/blender/blenlib/BLI_profile.hh
@@ -27,12 +27,12 @@ class ProfileTask {
  public:
   ProfileTask(const char *name)
   {
-    BLI_profile_task_begin(&task_, name);
+    BLI_profile_task_begin_named(&task_, name);
   }
 
   ProfileTask(const char *name, const BLI_ProfileTask *parent_task)
   {
-    BLI_profile_task_begin_subtask(&task_, name, parent_task);
+    BLI_profile_task_begin_named_subtask(&task_, name, parent_task);
   }
 
   ~ProfileTask()
diff --git a/source/blender/blenlib/BLI_profile_manage.hh b/source/blender/blenlib/BLI_profile_manage.hh
index 5ceb4429d04..5f93c733f6f 100644
--- a/source/blender/blenlib/BLI_profile_manage.hh
+++ b/source/blender/blenlib/BLI_profile_manage.hh
@@ -29,20 +29,29 @@ using TimePoint = Clock::time_point;
 using Nanoseconds = std::chrono::nanoseconds;
 
 struct ProfileTaskBegin {
-  const char *name;
   TimePoint time;
   uint64_t id;
   uint64_t parent_id;
   uint64_t thread_id;
 };
 
+struct ProfileTaskBeginNamed : public ProfileTaskBegin {
+  const char *name;
+};
+
+struct ProfileTaskBeginRange : public ProfileTaskBegin {
+  int64_t start;
+  int64_t one_after_last;
+};
+
 struct ProfileTaskEnd {
   TimePoint time;
   uint64_t begin_id;
 };
 
 struct RecordedProfile {
-  RawVector<ProfileTaskBegin> task_begins;
+  RawVector<ProfileTaskBeginNamed> task_begins_named;
+  RawVector<ProfileTaskBeginRange> task_begins_range;
   RawVector<ProfileTaskEnd> task_ends;
 };
 
diff --git a/source/blender/blenlib/intern/profile.cc b/source/blender/blenlib/intern/profile.cc
index 13ee5274c0a..ea341f00658 100644
--- a/source/blender/blenlib/intern/profile.cc
+++ b/source/blender/blenlib/intern/profile.cc
@@ -62,9 +62,8 @@ static std::shared_ptr<ProfileRegistry> &ensure_registry()
   return registry;
 }
 
-template<typename T>
-using ProfileDataQueue =
-    SingleProducerChunkConsumerQueue<T, RawAllocator, LinearAllocator<RawAllocator>>;
+template<typename T, typename UserData = void>
+using ProfileDataQueue = SingleProducerChunkConsumerQueue<T, RawAllocator, UserData>;
 
 struct ThreadLocalProfileData {
   ThreadLocalProfileData()
@@ -82,7 +81,8 @@ struct ThreadLocalProfileData {
   }
 
   uint64_t thread_id;
-  ProfileDataQueue<ProfileTaskBegin> queue_begins;
+  ProfileDataQueue<ProfileTaskBeginNamed, LinearAllocator<RawAllocator>> queue_begins_named;
+  ProfileDataQueue<ProfileTaskBeginRange> queue_begins_range;
   ProfileDataQueue<ProfileTaskEnd> queue_ends;
   RawStack<uint64_t> id_stack;
 
@@ -150,8 +150,12 @@ void ProfileListener::flush_to_all()
   }
   RecordedProfile recorded_profile;
   for (ThreadLocalProfileData *data : registry->threadlocals) {
-    data->queue_begins.consume(
-        [&](Span<ProfileTaskBegin> data) { recorded_profile.task_begins.extend(data); });
+    data->queue_begins_named.consume([&](Span<ProfileTaskBeginNamed> data) {
+      recorded_profile.task_begins_named.extend(data);
+    });
+    data->queue_begins_range.consume([&](Span<ProfileTaskBeginRange> data) {
+      recorded_profile.task_begins_range.extend(data);
+    });
     data->queue_ends.consume(
         [&](Span<ProfileTaskEnd> data) { recorded_profile.task_ends.extend(data); });
   }
@@ -162,7 +166,7 @@ void ProfileListener::flush_to_all()
 
 }  // namespace blender::profile
 
-static void profile_task_begin(BLI_ProfileTask *task, const char *name, uint64_t parent_id)
+static void profile_task_begin_named(BLI_ProfileTask *task, const char *name, uint64_t parent_id)
 {
   ThreadLocalProfileData &local_data = threadlocal_profile_data;
 
@@ -170,9 +174,9 @@ static void profile_task_begin(BLI_ProfileTask *task, const char *name, uint64_t
   local_data.id_stack.push(id);
   task->id = id;
 
-  ProfileTaskBegin *task_begin = local_data.queue_begins.prepare_append();
+  ProfileTaskBeginNamed *task_begin = local_data.queue_begins_named.prepare_append();
   LinearAllocator<RawAllocator> *allocator =
-      local_data.queue_begins.user_data_for_current_append();
+      local_data.queue_begins_named.user_data_for_current_append();
   StringRefNull name_copy = allocator->copy_string(name);
 
   task_begin->id = id;
@@ -181,21 +185,43 @@ static void profile_task_begin(BLI_ProfileTask *task, const char *name, uint64_t
   task_begin->thread_id = local_data.thread_id;
   task_begin->time = Clock::now();
 
-  local_data.queue_begins.commit_append();
+  local_data.queue_begins_named.commit_append();
 }
 
-void _bli_profile_task_begin(BLI_ProfileTask *task, const char *name)
+void _bli_profile_task_begin_named(BLI_ProfileTask *task, const char *name)
 {
   ThreadLocalProfileData &local_data = threadlocal_profile_data;
   const uint64_t parent_id = local_data.id_stack.peek_default(0);
-  profile_task_begin(task, name, parent_id);
+  profile_task_begin_named(task, name, parent_id);
 }
 
-void _bli_profile_task_begin_subtask(BLI_ProfileTask *task,
-                                     const char *name,
-                                     const BLI_ProfileTask *parent_task)
+void _bli_profile_task_begin_named_subtask(BLI_ProfileTask *task,
+                                           const char *name,
+                                           const BLI_ProfileTask *parent_task)
 {
-  profile_task_begin(task, name, parent_task->id);
+  profile_task_begin_named(task, name, parent_task->id);
+}
+
+void _bli_profile_task_begin_range(BLI_ProfileTask *task,
+                                   const BLI_ProfileTask *parent_task,
+                                   int64_t start,
+                                   int64_t one_after_last)
+{
+  ThreadLocalProfileData &local_data = threadlocal_profile_data;
+
+  const uint64_t id = local_data.get_next_unique_id();
+  local_data.id_stack.push(id);
+  task->id = id;
+
+  ProfileTaskBeginRange *task_begin = local_data.queue_begins_range.prepare_append();
+  task_begin->id = id;
+  task_begin->parent_id = parent_task->id;
+  task_begin->thread_id = local_data.thread_id;
+  task_begin->start = start;
+  task_begin->one_after_last = one_after_last;
+  task_begin->time = Clock::now();
+
+  local_data.queue_begins_range.commit_append();
 }
 
 void _bli_profile_task_end(BLI_ProfileTask *task)
diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc
index 2b6727c67c1..b085e3e3902 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval.cc
@@ -

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list