From cd48576f5846aa89a36bfc833e9de5dde9627aed Mon Sep 17 00:00:00 2001 From: riperiperi Date: Mon, 4 May 2020 03:24:59 +0100 Subject: 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. --- Ryujinx.Graphics.Gpu/Engine/MethodReport.cs | 54 +++++++++++++++++------------ 1 file changed, 31 insertions(+), 23 deletions(-) (limited to 'Ryujinx.Graphics.Gpu/Engine/MethodReport.cs') diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodReport.cs b/Ryujinx.Graphics.Gpu/Engine/MethodReport.cs index 997f55ff..e8efddea 100644 --- a/Ryujinx.Graphics.Gpu/Engine/MethodReport.cs +++ b/Ryujinx.Graphics.Gpu/Engine/MethodReport.cs @@ -64,23 +64,9 @@ namespace Ryujinx.Graphics.Gpu.Engine { CounterData counterData = new CounterData(); - ulong counter = 0; + var rs = state.Get(MethodOffset.ReportState); - switch (type) - { - case ReportCounterType.Zero: - counter = 0; - break; - case ReportCounterType.SamplesPassed: - counter = _context.Renderer.GetCounter(CounterType.SamplesPassed); - break; - case ReportCounterType.PrimitivesGenerated: - counter = _context.Renderer.GetCounter(CounterType.PrimitivesGenerated); - break; - case ReportCounterType.TransformFeedbackPrimitivesWritten: - counter = _context.Renderer.GetCounter(CounterType.TransformFeedbackPrimitivesWritten); - break; - } + ulong gpuVa = rs.Address.Pack(); ulong ticks = ConvertNanosecondsToTicks((ulong)PerformanceCounter.ElapsedNanoseconds); @@ -91,18 +77,40 @@ namespace Ryujinx.Graphics.Gpu.Engine ticks /= 256; } - counterData.Counter = counter; - counterData.Timestamp = ticks; + ICounterEvent counter = null; + + EventHandler resultHandler = (object evt, ulong result) => + { + counterData.Counter = result; + counterData.Timestamp = ticks; - Span counterDataSpan = MemoryMarshal.CreateSpan(ref counterData, 1); + Span counterDataSpan = MemoryMarshal.CreateSpan(ref counterData, 1); - Span data = MemoryMarshal.Cast(counterDataSpan); + Span data = MemoryMarshal.Cast(counterDataSpan); - var rs = state.Get(MethodOffset.ReportState); + if (counter?.Invalid != true) + { + _context.MemoryAccessor.Write(gpuVa, data); + } + }; - _context.MemoryAccessor.Write(rs.Address.Pack(), data); + switch (type) + { + case ReportCounterType.Zero: + resultHandler(null, 0); + break; + case ReportCounterType.SamplesPassed: + counter = _context.Renderer.ReportCounter(CounterType.SamplesPassed, resultHandler); + break; + case ReportCounterType.PrimitivesGenerated: + counter = _context.Renderer.ReportCounter(CounterType.PrimitivesGenerated, resultHandler); + break; + case ReportCounterType.TransformFeedbackPrimitivesWritten: + counter = _context.Renderer.ReportCounter(CounterType.TransformFeedbackPrimitivesWritten, resultHandler); + break; + } - _counterCache.AddOrUpdate(rs.Address.Pack()); + _counterCache.AddOrUpdate(gpuVa, counter); } /// -- cgit v1.2.3