Added support for timing flags

This commit is contained in:
Andy Adshead 2019-01-29 04:35:08 +00:00
commit 9f3b0cd1ef
5 changed files with 84 additions and 3 deletions

View file

@ -22,8 +22,16 @@ namespace Ryujinx.Profiler
private bool _cleanupRunning; private bool _cleanupRunning;
private readonly long _history; private readonly long _history;
// Timing flags
private TimingFlag[] _timingFlags;
private int _timingFlagCount;
private int _timingFlagIndex;
private const int MaxFlags = 50;
public InternalProfile(long history) public InternalProfile(long history)
{ {
_timingFlags = new TimingFlag[MaxFlags];
Timers = new ConcurrentDictionary<ProfileConfig, TimingInfo>(); Timers = new ConcurrentDictionary<ProfileConfig, TimingInfo>();
_history = history; _history = history;
_cleanupRunning = true; _cleanupRunning = true;
@ -53,6 +61,20 @@ namespace Ryujinx.Profiler
} }
} }
public void FlagTime(TimingFlagType flagType)
{
_timingFlags[_timingFlagIndex] = new TimingFlag()
{
FlagType = flagType,
Timestamp = SW.ElapsedTicks
};
if (++_timingFlagIndex >= MaxFlags)
_timingFlagIndex = 0;
_timingFlagCount = Math.Max(_timingFlagCount + 1, MaxFlags);
}
public void BeginProfile(ProfileConfig config) public void BeginProfile(ProfileConfig config)
{ {
Timers.GetOrAdd(config, profileConfig => new TimingInfo()).Begin(SW.ElapsedTicks); Timers.GetOrAdd(config, profileConfig => new TimingInfo()).Begin(SW.ElapsedTicks);
@ -108,6 +130,21 @@ namespace Ryujinx.Profiler
return outDict; return outDict;
} }
public TimingFlag[] GetTimingFlags()
{
int count = Math.Max(_timingFlagCount, MaxFlags);
TimingFlag[] outFlags = new TimingFlag[count];
for (int i = 0, sourceIndex = _timingFlagIndex; i < count; i++, sourceIndex++)
{
if (sourceIndex >= MaxFlags)
sourceIndex = 0;
outFlags[i] = _timingFlags[sourceIndex];
}
return outFlags;
}
public void Dispose() public void Dispose()
{ {
_cleanupRunning = false; _cleanupRunning = false;

View file

@ -39,6 +39,13 @@ namespace Ryujinx.Profiler
_profileInstance.Dispose(); _profileInstance.Dispose();
} }
public static void FlagTime(TimingFlagType flagType)
{
if (!ProfilingEnabled())
return;
_profileInstance.FlagTime(flagType);
}
public static void Begin(ProfileConfig config) public static void Begin(ProfileConfig config)
{ {
if (!ProfilingEnabled()) if (!ProfilingEnabled())
@ -96,7 +103,12 @@ namespace Ryujinx.Profiler
return _profileInstance.GetProfilingData(); return _profileInstance.GetProfilingData();
} }
public static TimingFlag[] GetTimingFlags()
{
if (!ProfilingEnabled())
return new TimingFlag[0];
return _profileInstance.GetTimingFlags();
}
public static long GetCurrentTime() public static long GetCurrentTime()
{ {

View file

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Ryujinx.Profiler
{
public enum TimingFlagType
{
FrameSwap,
}
public struct TimingFlag
{
public TimingFlagType FlagType;
public long Timestamp;
}
}

View file

@ -6,8 +6,8 @@ namespace Ryujinx.Profiler.UI
{ {
public partial class ProfileWindow public partial class ProfileWindow
{ {
private const float GraphMoveSpeed = 20000; private const float GraphMoveSpeed = 40000;
private const float GraphZoomSpeed = 10; private const float GraphZoomSpeed = 50;
private float _graphZoom = 1; private float _graphZoom = 1;
private float _graphPosition = 0; private float _graphPosition = 0;
@ -32,7 +32,20 @@ namespace Ryujinx.Profiler.UI
_graphPosition = (float)Profile.ConvertTicksToMS(graphPositionTicks); _graphPosition = (float)Profile.ConvertTicksToMS(graphPositionTicks);
} }
// Draw timing flags
TimingFlag[] timingFlags = Profile.GetTimingFlags();
GL.Enable(EnableCap.ScissorTest); GL.Enable(EnableCap.ScissorTest);
GL.Color3(Color.Gray);
GL.Begin(PrimitiveType.Lines);
foreach (TimingFlag timingFlag in timingFlags)
{
int x = (int)(xOffset + width - ((float)(_captureTime - (timingFlag.Timestamp + graphPositionTicks)) / timeWidthTicks) * width);
GL.Vertex2(x, 0);
GL.Vertex2(x, Height);
}
GL.End();
// Draw bars
GL.Begin(PrimitiveType.Triangles); GL.Begin(PrimitiveType.Triangles);
foreach (var entry in _sortedProfileData) foreach (var entry in _sortedProfileData)
{ {

View file

@ -277,6 +277,8 @@ namespace Ryujinx
_device.System.SignalVsync(); _device.System.SignalVsync();
_device.VsyncEvent.Set(); _device.VsyncEvent.Set();
Profile.FlagTime(TimingFlagType.FrameSwap);
} }
protected override void OnUnload(EventArgs e) protected override void OnUnload(EventArgs e)