| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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;
- }
- }
- }
|