diff options
author | riperiperi <rhy3756547@hotmail.com> | 2020-05-04 03:24:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 12:24:59 +1000 |
commit | cd48576f5846aa89a36bfc833e9de5dde9627aed (patch) | |
tree | 5bf04a43725cf7fdc098cde59856798a67b839e0 /Ryujinx.Graphics.OpenGL/Pipeline.cs | |
parent | 651a07c6c2a3e89c059d56e916c45e1881d56abc (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.cs | 41 |
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(); |