فهرست منبع

Dummy out gl queries with 0 draws, remove glFlush call (#1773)

riperiperi 5 سال پیش
والد
کامیت
c00d39b675

+ 4 - 0
Ryujinx.Graphics.OpenGL/Pipeline.cs

@@ -10,6 +10,8 @@ namespace Ryujinx.Graphics.OpenGL
 {
     class Pipeline : IPipeline, IDisposable
     {
+        internal ulong DrawCount { get; private set; }
+
         private Program _program;
 
         private bool _rasterizerDiscard;
@@ -1196,6 +1198,8 @@ namespace Ryujinx.Graphics.OpenGL
 
         private void PreDraw()
         {
+            DrawCount++;
+
             _vertexArray.Validate();
 
             if (_unit0Texture != null)

+ 0 - 1
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);

+ 19 - 6
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();

+ 5 - 1
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();
         }
 

+ 2 - 2
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)

+ 1 - 1
Ryujinx.Graphics.OpenGL/Renderer.cs

@@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.OpenGL
 
         public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler)
         {
-            return _counters.QueueReport(type, resultHandler);
+            return _counters.QueueReport(type, resultHandler, _pipeline.DrawCount);
         }
 
         public void Initialize(GraphicsDebugLevel glLogLevel)