diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/Queries')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs | 13 | ||||
-rw-r--r-- | Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs | 2 | ||||
-rw-r--r-- | Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs | 7 |
3 files changed, 16 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs b/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs index 29efd8e7..861155a3 100644 --- a/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs +++ b/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs @@ -12,6 +12,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries private const int MaxQueryRetries = 5000; private const long DefaultValue = -1; private const long DefaultValueInt = 0xFFFFFFFF; + private const ulong HighMask = 0xFFFFFFFF00000000; private readonly Vk _api; private readonly Device _device; @@ -125,6 +126,12 @@ namespace Ryujinx.Graphics.Vulkan.Queries } } + private bool WaitingForValue(long data) + { + return data == _defaultValue || + (!_result32Bit && ((ulong)data & HighMask) == ((ulong)_defaultValue & HighMask)); + } + public bool TryGetResult(out long result) { result = Marshal.ReadInt64(_bufferMap); @@ -138,7 +145,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries if (wakeSignal == null) { - while (data == _defaultValue) + while (WaitingForValue(data)) { data = Marshal.ReadInt64(_bufferMap); } @@ -146,10 +153,10 @@ namespace Ryujinx.Graphics.Vulkan.Queries else { int iterations = 0; - while (data == _defaultValue && iterations++ < MaxQueryRetries) + while (WaitingForValue(data) && iterations++ < MaxQueryRetries) { data = Marshal.ReadInt64(_bufferMap); - if (data == _defaultValue) + if (WaitingForValue(data)) { wakeSignal.WaitOne(1); } diff --git a/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs index 7293b74f..c30d91c4 100644 --- a/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs +++ b/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs @@ -148,7 +148,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries _current.ReserveForHostAccess(); } - _current.Complete(draws > 0 && Type != CounterType.TransformFeedbackPrimitivesWritten); + _current.Complete(draws > 0 && Type != CounterType.TransformFeedbackPrimitivesWritten, _pipeline.GetCounterDivisor(Type)); _events.Enqueue(_current); _current.OnResult += resultHandler; diff --git a/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs b/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs index 6b780ba3..d3aedb2f 100644 --- a/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs +++ b/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs @@ -24,6 +24,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries private object _lock = new object(); private ulong _result = ulong.MaxValue; + private double _divisor = 1f; public CounterQueueEvent(CounterQueue queue, CounterType type, ulong drawIndex) { @@ -52,9 +53,11 @@ namespace Ryujinx.Graphics.Vulkan.Queries ClearCounter = true; } - internal void Complete(bool withResult) + internal void Complete(bool withResult, double divisor) { _counter.End(withResult); + + _divisor = divisor; } internal bool TryConsume(ref ulong result, bool block, AutoResetEvent wakeSignal = null) @@ -85,7 +88,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries } } - result += (ulong)queryResult; + result += _divisor == 1 ? (ulong)queryResult : (ulong)Math.Ceiling(queryResult / _divisor); _result = result; |