diff options
| author | riperiperi <rhy3756547@hotmail.com> | 2020-12-03 18:42:59 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-03 19:42:59 +0100 |
| commit | c00d39b675d0ebf7ebf5be1135addbbee2510d93 (patch) | |
| tree | 8e94755778ec6261fd08e270e8d6fff1f01f5e6a /Ryujinx.Graphics.OpenGL/Queries | |
| parent | 2c39a4f15d44156779c6c926d8feda26a4a24605 (diff) | |
Dummy out gl queries with 0 draws, remove glFlush call (#1773)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Queries')
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs | 1 | ||||
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs | 25 | ||||
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs | 6 | ||||
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Queries/Counters.cs | 4 |
4 files changed, 26 insertions, 10 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs b/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs index 76c94126..b4c5259c 100644 --- a/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs +++ b/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs @@ -46,7 +46,6 @@ namespace Ryujinx.Graphics.OpenGL.Queries public unsafe void End() { - GL.Flush(); GL.EndQuery(_type); GL.BindBuffer(BufferTarget.QueryBuffer, _buffer); diff --git a/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs b/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs index f34bc86d..a864a200 100644 --- a/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs +++ b/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs @@ -38,7 +38,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries _queryPool.Enqueue(new BufferedQuery(glType)); } - _current = new CounterQueueEvent(this, glType); + _current = new CounterQueueEvent(this, glType, 0); _consumerThread = new Thread(EventConsumer); _consumerThread.Start(); @@ -95,19 +95,32 @@ namespace Ryujinx.Graphics.OpenGL.Queries } } - public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler) + public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, ulong lastDrawIndex) { CounterQueueEvent result; + ulong draws = lastDrawIndex - _current.DrawIndex; lock (_lock) { - _current.Complete(); - _events.Enqueue(_current); + // A query's result only matters if more than one draw was performed during it. + // Otherwise, dummy it out and return 0 immediately. + + if (draws > 0) + { + _current.Complete(); + _events.Enqueue(_current); + + _current.OnResult += resultHandler; + } + else + { + _current.Dispose(); + resultHandler(_current, 0); + } result = _current; - result.OnResult += resultHandler; - _current = new CounterQueueEvent(this, GetTarget(Type)); + _current = new CounterQueueEvent(this, GetTarget(Type), lastDrawIndex); } _queuedEvent.Set(); diff --git a/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs b/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs index 0fba24a1..e21ce55d 100644 --- a/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs +++ b/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs @@ -16,18 +16,22 @@ namespace Ryujinx.Graphics.OpenGL.Queries public bool Disposed { get; private set; } public bool Invalid { get; set; } + public ulong DrawIndex { get; } + private CounterQueue _queue; private BufferedQuery _counter; private object _lock = new object(); - public CounterQueueEvent(CounterQueue queue, QueryTarget type) + public CounterQueueEvent(CounterQueue queue, QueryTarget type, ulong drawIndex) { _queue = queue; _counter = queue.GetQueryObject(); Type = type; + DrawIndex = drawIndex; + _counter.Begin(); } diff --git a/Ryujinx.Graphics.OpenGL/Queries/Counters.cs b/Ryujinx.Graphics.OpenGL/Queries/Counters.cs index 7560fb17..ac441d5f 100644 --- a/Ryujinx.Graphics.OpenGL/Queries/Counters.cs +++ b/Ryujinx.Graphics.OpenGL/Queries/Counters.cs @@ -23,9 +23,9 @@ namespace Ryujinx.Graphics.OpenGL.Queries } } - public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler) + public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, ulong lastDrawIndex) { - return _counterQueues[(int)type].QueueReport(resultHandler); + return _counterQueues[(int)type].QueueReport(resultHandler, lastDrawIndex); } public void QueueReset(CounterType type) |
