aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Engine/MethodReport.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/MethodReport.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/MethodReport.cs54
1 files changed, 31 insertions, 23 deletions
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<ReportState>(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<ulong> resultHandler = (object evt, ulong result) =>
+ {
+ counterData.Counter = result;
+ counterData.Timestamp = ticks;
- Span<CounterData> counterDataSpan = MemoryMarshal.CreateSpan(ref counterData, 1);
+ Span<CounterData> counterDataSpan = MemoryMarshal.CreateSpan(ref counterData, 1);
- Span<byte> data = MemoryMarshal.Cast<CounterData, byte>(counterDataSpan);
+ Span<byte> data = MemoryMarshal.Cast<CounterData, byte>(counterDataSpan);
- var rs = state.Get<ReportState>(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);
}
/// <summary>