aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs32
1 files changed, 32 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs b/Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs
index 4ba689cc..2a4cbd52 100644
--- a/Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs
+++ b/Ryujinx.Graphics.Vulkan/AutoFlushCounter.cs
@@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
+using System.Linq;
namespace Ryujinx.Graphics.Vulkan
{
@@ -16,6 +17,10 @@ namespace Ryujinx.Graphics.Vulkan
private bool _hasPendingQuery;
private int _queryCount;
+ private int[] _queryCountHistory = new int[3];
+ private int _queryCountHistoryIndex;
+ private int _remainingQueries;
+
public void RegisterFlush(ulong drawCount)
{
_lastFlush = Stopwatch.GetTimestamp();
@@ -27,6 +32,9 @@ namespace Ryujinx.Graphics.Vulkan
public bool RegisterPendingQuery()
{
_hasPendingQuery = true;
+ _remainingQueries--;
+
+ _queryCountHistory[_queryCountHistoryIndex]++;
// Interrupt render passes to flush queries, so that early results arrive sooner.
if (++_queryCount == InitialQueryCountForFlush)
@@ -37,6 +45,21 @@ namespace Ryujinx.Graphics.Vulkan
return false;
}
+ public int GetRemainingQueries()
+ {
+ if (_remainingQueries <= 0)
+ {
+ _remainingQueries = 16;
+ }
+
+ if (_queryCount < InitialQueryCountForFlush)
+ {
+ return Math.Min(InitialQueryCountForFlush - _queryCount, _remainingQueries);
+ }
+
+ return _remainingQueries;
+ }
+
public bool ShouldFlushQuery()
{
return _hasPendingQuery;
@@ -69,5 +92,14 @@ namespace Ryujinx.Graphics.Vulkan
return now > _lastFlush + flushTimeout;
}
+
+ public void Present()
+ {
+ _queryCountHistoryIndex = (_queryCountHistoryIndex + 1) % 3;
+
+ _remainingQueries = _queryCountHistory.Max() + 10;
+
+ _queryCountHistory[_queryCountHistoryIndex] = 0;
+ }
}
}