aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Counters.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Counters.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/Counters.cs77
1 files changed, 77 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Counters.cs b/Ryujinx.Graphics.OpenGL/Counters.cs
new file mode 100644
index 00000000..e82a040f
--- /dev/null
+++ b/Ryujinx.Graphics.OpenGL/Counters.cs
@@ -0,0 +1,77 @@
+using OpenTK.Graphics.OpenGL;
+using Ryujinx.Graphics.GAL;
+using System;
+
+namespace Ryujinx.Graphics.OpenGL
+{
+ class Counters
+ {
+ private int[] _queryObjects;
+
+ private ulong[] _accumulatedCounters;
+
+ public Counters()
+ {
+ int count = Enum.GetNames(typeof(CounterType)).Length;
+
+ _queryObjects = new int[count];
+
+ _accumulatedCounters = new ulong[count];
+ }
+
+ public void Initialize()
+ {
+ for (int index = 0; index < _queryObjects.Length; index++)
+ {
+ int handle = GL.GenQuery();
+
+ _queryObjects[index] = handle;
+
+ CounterType type = (CounterType)index;
+
+ GL.BeginQuery(GetTarget(type), handle);
+ }
+ }
+
+ public ulong GetCounter(CounterType type)
+ {
+ UpdateAccumulatedCounter(type);
+
+ return _accumulatedCounters[(int)type];
+ }
+
+ public void ResetCounter(CounterType type)
+ {
+ UpdateAccumulatedCounter(type);
+
+ _accumulatedCounters[(int)type] = 0;
+ }
+
+ private void UpdateAccumulatedCounter(CounterType type)
+ {
+ int handle = _queryObjects[(int)type];
+
+ QueryTarget target = GetTarget(type);
+
+ GL.EndQuery(target);
+
+ GL.GetQueryObject(handle, GetQueryObjectParam.QueryResult, out long result);
+
+ _accumulatedCounters[(int)type] += (ulong)result;
+
+ GL.BeginQuery(target, handle);
+ }
+
+ private static QueryTarget GetTarget(CounterType type)
+ {
+ switch (type)
+ {
+ case CounterType.SamplesPassed: return QueryTarget.SamplesPassed;
+ case CounterType.PrimitivesGenerated: return QueryTarget.PrimitivesGenerated;
+ case CounterType.TransformFeedbackPrimitivesWritten: return QueryTarget.TransformFeedbackPrimitivesWritten;
+ }
+
+ return QueryTarget.SamplesPassed;
+ }
+ }
+}