aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs2
-rw-r--r--Ryujinx.Graphics.OpenGL/Pipeline.cs10
-rw-r--r--Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs15
-rw-r--r--Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs8
-rw-r--r--Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs7
-rw-r--r--Ryujinx.Graphics.OpenGL/Queries/Counters.cs4
6 files changed, 35 insertions, 11 deletions
diff --git a/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
index 9490684c..c79700fc 100644
--- a/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
+++ b/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
@@ -178,7 +178,7 @@ namespace Ryujinx.Graphics.OpenGL
}
_pipeline.Initialize(this);
- _counters.Initialize();
+ _counters.Initialize(_pipeline);
// This is required to disable [0, 1] clamping for SNorm outputs on compatibility profiles.
// This call is expected to fail if we're running with a core profile,
diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs
index 970feea0..62996bd0 100644
--- a/Ryujinx.Graphics.OpenGL/Pipeline.cs
+++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs
@@ -773,6 +773,16 @@ namespace Ryujinx.Graphics.OpenGL
_tfEnabled = false;
}
+ public double GetCounterDivisor(CounterType type)
+ {
+ if (type == CounterType.SamplesPassed)
+ {
+ return _renderScale[0].X * _renderScale[0].X;
+ }
+
+ return 1;
+ }
+
public void SetAlphaTest(bool enable, float reference, CompareOp op)
{
if (!enable)
diff --git a/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs b/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs
index 027495cd..99ea6a5c 100644
--- a/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs
+++ b/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs
@@ -10,6 +10,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
{
private const int MaxQueryRetries = 5000;
private const long DefaultValue = -1;
+ private const ulong HighMask = 0xFFFFFFFF00000000;
public int Query { get; }
@@ -63,11 +64,17 @@ namespace Ryujinx.Graphics.OpenGL.Queries
}
}
+ private bool WaitingForValue(long data)
+ {
+ return data == DefaultValue ||
+ ((ulong)data & HighMask) == (unchecked((ulong)DefaultValue) & HighMask);
+ }
+
public bool TryGetResult(out long result)
{
result = Marshal.ReadInt64(_bufferMap);
- return result != DefaultValue;
+ return WaitingForValue(result);
}
public long AwaitResult(AutoResetEvent wakeSignal = null)
@@ -76,7 +83,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
if (wakeSignal == null)
{
- while (data == DefaultValue)
+ while (WaitingForValue(data))
{
data = Marshal.ReadInt64(_bufferMap);
}
@@ -84,10 +91,10 @@ namespace Ryujinx.Graphics.OpenGL.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.OpenGL/Queries/CounterQueue.cs b/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
index 84b2bfdc..e0aafa6f 100644
--- a/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
+++ b/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
@@ -13,6 +13,8 @@ namespace Ryujinx.Graphics.OpenGL.Queries
public CounterType Type { get; }
public bool Disposed { get; private set; }
+ private readonly Pipeline _pipeline;
+
private Queue<CounterQueueEvent> _events = new Queue<CounterQueueEvent>();
private CounterQueueEvent _current;
@@ -28,10 +30,12 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private Thread _consumerThread;
- internal CounterQueue(CounterType type)
+ internal CounterQueue(Pipeline pipeline, CounterType type)
{
Type = type;
+ _pipeline = pipeline;
+
QueryTarget glType = GetTarget(Type);
_queryPool = new Queue<BufferedQuery>(QueryPoolInitialSize);
@@ -119,7 +123,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
_current.ReserveForHostAccess();
}
- _current.Complete(draws > 0);
+ _current.Complete(draws > 0, _pipeline.GetCounterDivisor(Type));
_events.Enqueue(_current);
_current.OnResult += resultHandler;
diff --git a/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs b/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
index 81451389..7297baab 100644
--- a/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
+++ b/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
@@ -26,6 +26,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private object _lock = new object();
private ulong _result = ulong.MaxValue;
+ private double _divisor = 1f;
public CounterQueueEvent(CounterQueue queue, QueryTarget type, ulong drawIndex)
{
@@ -45,9 +46,11 @@ namespace Ryujinx.Graphics.OpenGL.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)
@@ -78,7 +81,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
}
}
- result += (ulong)queryResult;
+ result += _divisor == 1 ? (ulong)queryResult : (ulong)Math.Ceiling(queryResult / _divisor);
_result = result;
diff --git a/Ryujinx.Graphics.OpenGL/Queries/Counters.cs b/Ryujinx.Graphics.OpenGL/Queries/Counters.cs
index ebfd899c..e6c7ab2b 100644
--- a/Ryujinx.Graphics.OpenGL/Queries/Counters.cs
+++ b/Ryujinx.Graphics.OpenGL/Queries/Counters.cs
@@ -14,12 +14,12 @@ namespace Ryujinx.Graphics.OpenGL.Queries
_counterQueues = new CounterQueue[count];
}
- public void Initialize()
+ public void Initialize(Pipeline pipeline)
{
for (int index = 0; index < _counterQueues.Length; index++)
{
CounterType type = (CounterType)index;
- _counterQueues[index] = new CounterQueue(type);
+ _counterQueues[index] = new CounterQueue(pipeline, type);
}
}