aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Pipeline.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2020-05-04 03:24:59 +0100
committerGitHub <noreply@github.com>2020-05-04 12:24:59 +1000
commitcd48576f5846aa89a36bfc833e9de5dde9627aed (patch)
tree5bf04a43725cf7fdc098cde59856798a67b839e0 /Ryujinx.Graphics.OpenGL/Pipeline.cs
parent651a07c6c2a3e89c059d56e916c45e1881d56abc (diff)
Implement Counter Queue and Partial Host Conditional Rendering (#1167)
* Implementation of query queue and host conditional rendering * Resolve some comments. * Use overloads instead of passing object. * Wake the consumer threads when incrementing syncpoints. Also, do a busy loop when awaiting the counter for a blocking flush, rather than potentially sleeping the thread. * Ensure there's a command between begin and end query.
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Pipeline.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/Pipeline.cs41
1 files changed, 41 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs
index dc04805d..80b07108 100644
--- a/Ryujinx.Graphics.OpenGL/Pipeline.cs
+++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs
@@ -1,6 +1,7 @@
using OpenTK.Graphics.OpenGL;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
+using Ryujinx.Graphics.OpenGL.Queries;
using Ryujinx.Graphics.Shader;
using System;
@@ -1023,6 +1024,46 @@ namespace Ryujinx.Graphics.OpenGL
}
}
+ public bool TryHostConditionalRendering(ICounterEvent value, ulong compare, bool isEqual)
+ {
+ if (value is CounterQueueEvent)
+ {
+ // Compare an event and a constant value.
+ CounterQueueEvent evt = (CounterQueueEvent)value;
+
+ // Easy host conditional rendering when the check matches what GL can do:
+ // - Event is of type samples passed.
+ // - Result is not a combination of multiple queries.
+ // - Comparing against 0.
+ // - Event has not already been flushed.
+
+ if (evt.Disposed)
+ {
+ // If the event has been flushed, then just use the values on the CPU.
+ // The query object may already be repurposed for another draw (eg. begin + end).
+ return false;
+ }
+
+ if (compare == 0 && evt.Type == QueryTarget.SamplesPassed && evt.ClearCounter)
+ {
+ GL.BeginConditionalRender(evt.Query, isEqual ? ConditionalRenderType.QueryNoWaitInverted : ConditionalRenderType.QueryNoWait);
+ return true;
+ }
+ }
+
+ return false; // The GPU will flush the queries to CPU and evaluate the condition there instead.
+ }
+
+ public bool TryHostConditionalRendering(ICounterEvent value, ICounterEvent compare, bool isEqual)
+ {
+ return false; // We don't currently have a way to compare two counters for conditional rendering.
+ }
+
+ public void EndHostConditionalRendering()
+ {
+ GL.EndConditionalRender();
+ }
+
public void Dispose()
{
_framebuffer?.Dispose();