aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs23
1 files changed, 22 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
index 7ee3c15a..c47f95ea 100644
--- a/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
+++ b/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
@@ -3,6 +3,7 @@ using Silk.NET.Vulkan;
using System;
using System.Collections.Generic;
using System.Threading;
+using System.Linq;
namespace Ryujinx.Graphics.Vulkan.Queries
{
@@ -32,6 +33,8 @@ namespace Ryujinx.Graphics.Vulkan.Queries
private Thread _consumerThread;
+ public int ResetSequence { get; private set; }
+
internal CounterQueue(VulkanRenderer gd, Device device, PipelineFull pipeline, CounterType type)
{
_gd = gd;
@@ -53,6 +56,24 @@ namespace Ryujinx.Graphics.Vulkan.Queries
_consumerThread.Start();
}
+ public void ResetCounterPool()
+ {
+ ResetSequence++;
+ }
+
+ public void ResetFutureCounters(CommandBuffer cmd, int count)
+ {
+ // Pre-emptively reset queries to avoid render pass splitting.
+ lock (_queryPool)
+ {
+ count = Math.Min(count, _queryPool.Count);
+ for (int i = 0; i < count; i++)
+ {
+ _queryPool.ElementAt(i).PoolReset(cmd, ResetSequence);
+ }
+ }
+ }
+
private void EventConsumer()
{
while (!Disposed)
@@ -106,7 +127,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
{
lock (_lock)
{
- _pipeline.ResetQuery(query);
+ // The query will be reset when it dequeues.
_queryPool.Enqueue(query);
}
}