| 747 | } |
| 748 | |
| 749 | void UpdateRenderProfile(HRenderProfile render_profile, const dmProfileRender::ProfilerFrame* current_frame) |
| 750 | { |
| 751 | if (render_profile->m_Mode == PROFILER_MODE_PAUSE) |
| 752 | { |
| 753 | return; |
| 754 | } |
| 755 | |
| 756 | uint32_t last_thread_name = GetSelectedThread(render_profile, render_profile->m_CurrentFrame)->m_NameHash; |
| 757 | if (render_profile->m_CurrentFrame) |
| 758 | { |
| 759 | DeleteProfilerFrame(render_profile->m_CurrentFrame); |
| 760 | render_profile->m_CurrentFrame = 0; |
| 761 | } |
| 762 | |
| 763 | if (!current_frame) |
| 764 | return; |
| 765 | |
| 766 | render_profile->m_CurrentFrame = DuplicateProfilerFrame(current_frame); |
| 767 | |
| 768 | ProfilerThread* current_thread = GetSelectedThread(render_profile, render_profile->m_CurrentFrame); |
| 769 | if (last_thread_name != current_thread->m_NameHash) |
| 770 | { |
| 771 | render_profile->m_MaxFrameTime = 0; |
| 772 | } |
| 773 | |
| 774 | uint64_t this_frame_time = current_thread->m_SamplesTotalTime; |
| 775 | |
| 776 | bool new_peak_frame = render_profile->m_MaxFrameTime < this_frame_time; |
| 777 | render_profile->m_MaxFrameTime = dmMath::Max(render_profile->m_MaxFrameTime, this_frame_time); |
| 778 | |
| 779 | if (new_peak_frame) |
| 780 | { |
| 781 | if (render_profile->m_LastPeakFrame) |
| 782 | { |
| 783 | DeleteProfilerFrame(render_profile->m_LastPeakFrame); |
| 784 | } |
| 785 | render_profile->m_LastPeakFrame = DuplicateProfilerFrame(render_profile->m_CurrentFrame); |
| 786 | } |
| 787 | |
| 788 | if (render_profile->m_Mode == PROFILER_MODE_SHOW_PEAK_FRAME) |
| 789 | { |
| 790 | render_profile->m_ActiveFrame = render_profile->m_LastPeakFrame; |
| 791 | return; |
| 792 | } |
| 793 | |
| 794 | if (render_profile->m_Mode == PROFILER_MODE_RECORD) |
| 795 | { |
| 796 | ProfilerFrame* snapshot = DuplicateProfilerFrame(render_profile->m_CurrentFrame); |
| 797 | |
| 798 | if (render_profile->m_RecordBuffer.Remaining() == 0) |
| 799 | { |
| 800 | render_profile->m_RecordBuffer.SetCapacity(render_profile->m_RecordBuffer.Size() + (uint32_t)render_profile->m_FPS); |
| 801 | } |
| 802 | render_profile->m_RecordBuffer.Push(snapshot); |
| 803 | render_profile->m_PlaybackFrame = (int32_t)render_profile->m_RecordBuffer.Size(); |
| 804 | } |
| 805 | |
| 806 | render_profile->m_ActiveFrame = 0; |