Commit: 6951661dccc51d8c470f29c1977f413989ca14ad Author: Jacques Lucke Date: Tue Apr 27 18:19:16 2021 +0200 Branches: profiler-editor https://developer.blender.org/rB6951661dccc51d8c470f29c1977f413989ca14ad
fix stack =================================================================== M source/blender/blenkernel/intern/DerivedMesh.cc M source/blender/blenlib/BLI_profile.h M source/blender/blenlib/intern/profile.cc M source/blender/editors/space_profiler/profiler_draw.cc M source/blender/editors/space_profiler/profiler_layout.cc =================================================================== diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 474bfd0a4ee..f3c6d9f9687 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -924,7 +924,7 @@ static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md, Mesh *input_mesh, GeometrySet &geometry_set) { - BLI_PROFILE_SCOPE(__func__); + BLI_PROFILE_SCOPE(md->name); Mesh *mesh_output = nullptr; const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); if (mti->modifyGeometrySet == nullptr) { diff --git a/source/blender/blenlib/BLI_profile.h b/source/blender/blenlib/BLI_profile.h index 5826c5c84da..595cd7e122b 100644 --- a/source/blender/blenlib/BLI_profile.h +++ b/source/blender/blenlib/BLI_profile.h @@ -28,6 +28,8 @@ typedef struct BLI_ProfileTask { uint64_t id; } BLI_ProfileTask; +#define BLI_PROFILE_DUMMY_ID (~0) + BLI_INLINE bool BLI_profile_is_enabled(void) { return bli_profiling_is_enabled; @@ -43,16 +45,22 @@ void _bli_profile_task_end(BLI_ProfileTask *task); if (bli_profiling_is_enabled) { \ _bli_profile_task_begin((task_ptr), (name)); \ } \ + else { \ + (task_ptr)->id = BLI_PROFILE_DUMMY_ID; \ + } \ ((void)0) #define BLI_profile_task_begin_subtask(task_ptr, name, parent_task) \ if (bli_profiling_is_enabled) { \ _bli_profile_task_begin_subtask((task_ptr), (name), (parent_task)); \ } \ + else { \ + (task_ptr)->id = BLI_PROFILE_DUMMY_ID; \ + } \ ((void)0) #define BLI_profile_task_end(task_ptr) \ - if (bli_profiling_is_enabled) { \ + if (bli_profiling_is_enabled && (task_ptr)->id != BLI_PROFILE_DUMMY_ID) { \ _bli_profile_task_end(task_ptr); \ } \ ((void)0) diff --git a/source/blender/blenlib/intern/profile.cc b/source/blender/blenlib/intern/profile.cc index 9b265a61093..ac427ac3708 100644 --- a/source/blender/blenlib/intern/profile.cc +++ b/source/blender/blenlib/intern/profile.cc @@ -116,41 +116,56 @@ void ProfileListener::flush_to_all() void _bli_profile_task_begin(BLI_ProfileTask *task, const char *name) { - task->id = get_unique_session_id(); + ThreadLocalProfileData &local_data = threadlocal_profile_data; - ProfileTaskBegin *task_begin = threadlocal_profile_data.queue_begins.prepare_append(); - task_begin->id = task->id; + const uint64_t id = get_unique_session_id(); + const uint64_t parent_id = local_data.id_stack.peek_default(0); + local_data.id_stack.push(id); + task->id = id; + + ProfileTaskBegin *task_begin = local_data.queue_begins.prepare_append(); + task_begin->id = id; task_begin->name = name; - task_begin->parent_id = threadlocal_profile_data.id_stack.peek_default(0); - task_begin->thread_id = threadlocal_profile_data.thread_id; + task_begin->parent_id = parent_id; + task_begin->thread_id = local_data.thread_id; task_begin->time = Clock::now(); - threadlocal_profile_data.queue_begins.commit_append(); + local_data.queue_begins.commit_append(); } void _bli_profile_task_begin_subtask(BLI_ProfileTask *task, const char *name, const BLI_ProfileTask *parent_task) { - task->id = get_unique_session_id(); + ThreadLocalProfileData &local_data = threadlocal_profile_data; + + const uint64_t id = get_unique_session_id(); + const uint64_t parent_id = local_data.id_stack.peek_default(0); + local_data.id_stack.push(id); + task->id = id; - ProfileTaskBegin *task_begin = threadlocal_profile_data.queue_begins.prepare_append(); - task_begin->id = task->id; + ProfileTaskBegin *task_begin = local_data.queue_begins.prepare_append(); + task_begin->id = id; task_begin->name = name; - task_begin->parent_id = parent_task->id; - task_begin->thread_id = threadlocal_profile_data.thread_id; + task_begin->parent_id = parent_id; + task_begin->thread_id = local_data.thread_id; task_begin->time = Clock::now(); - threadlocal_profile_data.queue_begins.commit_append(); + local_data.queue_begins.commit_append(); } void _bli_profile_task_end(BLI_ProfileTask *task) { TimePoint time = Clock::now(); - ProfileTaskEnd *task_end = threadlocal_profile_data.queue_ends.prepare_append(); + ThreadLocalProfileData &local_data = threadlocal_profile_data; + + BLI_assert(local_data.id_stack.peek() == task->id); + local_data.id_stack.pop(); + + ProfileTaskEnd *task_end = local_data.queue_ends.prepare_append(); task_end->begin_id = task->id; task_end->time = time; - threadlocal_profile_data.queue_ends.commit_append(); + local_data.queue_ends.commit_append(); } diff --git a/source/blender/editors/space_profiler/profiler_draw.cc b/source/blender/editors/space_profiler/profiler_draw.cc index 42f4e7c48f2..7bad79d28e8 100644 --- a/source/blender/editors/space_profiler/profiler_draw.cc +++ b/source/blender/editors/space_profiler/profiler_draw.cc @@ -48,6 +48,7 @@ class ProfilerDrawer { ProfilerLayout *profiler_layout_; int row_height_; int parallel_padding_; + uiBlock *ui_block_ = nullptr; public: ProfilerDrawer(const bContext *C, ARegion *region) : C(C), region_(region) @@ -68,8 +69,13 @@ class ProfilerDrawer { void draw() { UI_ThemeClearColor(TH_BACK); + this->compute_vertical_extends_of_all_nodes(); + + ui_block_ = UI_block_begin(C, region_, __func__, UI_EMBOSS_NONE); this->draw_all_nodes(); + UI_block_end(C, ui_block_); + UI_block_draw(C, ui_block_); } void compute_vertical_extends_of_all_nodes() @@ -97,8 +103,10 @@ class ProfilerDrawer { node.bottom_y = node.top_y - row_height_; node.bottom_y = this->compute_vertical_extends_of_nodes(node.direct_children(), node.bottom_y); for (Span<ProfileNode *> children : node.parallel_children()) { - node.bottom_y -= parallel_padding_; - node.bottom_y = this->compute_vertical_extends_of_nodes(children, node.bottom_y); + if (!children.is_empty()) { + node.bottom_y -= parallel_padding_; + node.bottom_y = this->compute_vertical_extends_of_nodes(children, node.bottom_y); + } } } @@ -131,6 +139,37 @@ class ProfilerDrawer { immRecti(pos, left_x, node.top_y, right_x, node.bottom_y); immUnbindProgram(); + + this->draw_node_label(node, left_x, right_x); + + this->draw_nodes(node.direct_children()); + for (Span<ProfileNode *> nodes : node.parallel_children()) { + this->draw_nodes(nodes); + } + } + + void draw_node_label(ProfileNode &node, const int left_x, const int right_x) + { + const int x = std::max(0, left_x); + const int width = std::max(1, std::min<int>(right_x, region_->winx) - x); + + uiBut *but = uiDefIconTextBut(ui_block_, + UI_BTYPE_LABEL, + 0, + ICON_NONE, + node.name().c_str(), + x, + node.top_y - row_height_, + width, + row_height_, + nullptr, + 0, + 0, + 0, + 0, + nullptr); + UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT); + UI_but_drawflag_disable(but, UI_BUT_TEXT_RIGHT); } int time_to_x(const TimePoint time) const @@ -143,7 +182,7 @@ class ProfilerDrawer { Color4f get_node_color(ProfileNode &node) { - const uint64_t value = node.begin_time().time_since_epoch().count(); + const uint64_t value = POINTER_AS_UINT(&node); const float variation = BLI_hash_int_2d_to_float(value, value >> 32); float r, g, b; hsv_to_rgb(variation * 0.2f, 0.5f, 0.5f, &r, &g, &b); diff --git a/source/blender/editors/space_profiler/profiler_layout.cc b/source/blender/editors/space_profiler/profiler_layout.cc index ec816e7d86b..c050b24ce67 100644 --- a/source/blender/editors/space_profiler/profiler_layout.cc +++ b/source/blender/editors/space_profiler/profiler_layout.cc @@ -31,11 +31,12 @@ bool ProfileNode::time_overlap(const ProfileNode &a, const ProfileNode &b) } template<typename UseNodeF> -static int try_pack_into_vector(Vector<ProfileNode *> &sorted_nodes_vec, - MutableSpan<ProfileNode *> sorted_nodes_to_pack, - const UseNodeF &use_node_fn) +static bool try_pack_into_vector(Vector<ProfileNode *> &sorted_nodes_vec, + MutableSpan<ProfileNode *> sorted_nodes_to_pack, + const UseNodeF &use_node_fn) { - int tot_newly_inserted = 0; + bool packed_everything = true; + MutableSpan<ProfileNode *> remaining_existing = sorted_nodes_vec; MutableSpan<ProfileNode *> remaining_new = sorted_nodes_to_pack; Vector<ProfileNode *> new_vec; @@ -56,13 +57,13 @@ static int try_pack_into_vector(Vector<ProfileNode *> &sorted_nodes_vec, if (ProfileNode::time_overlap(*existing_child, *new_child)) { /* Node collides with previously added node. */ remaining_new = remaining_new.drop_front(1); + packed_everything = false; break; } } if (remaining_existing.is_empty()) { /* There are no remaining existing nodes the new child can collide with. */ new_vec.append(new_child); - tot_newly_inserted++; remaining_new[0] = nullptr; remaining_new = remaining_new.drop_front(1); break; @@ -79,12 +80,12 @@ static int try_pack_into_vector(Vector<ProfileNode *> &sorted_nodes_vec, new_vec.append(existing_child); remaining_existing = remaining_existing.drop_front(1); remaining_new = remaining_new.drop_front(1); + packed_everything = false; break; } if (new_child->end_time() <= existing_child->begin_time()) { /* New child can be added safely. */ new_vec.append(new_child); - tot_n @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs