Fix host reserved counter

This commit is contained in:
riperiperi 2024-02-15 11:19:12 +00:00
parent 711360f775
commit 71901a54b8
12 changed files with 22 additions and 22 deletions

View file

@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.GAL
void PreFrame();
ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved);
ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, int hostReserved);
void ResetCounter(CounterType type);

View file

@ -11,9 +11,9 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands.Renderer
private CounterType _type;
private TableRef<EventHandler<ulong>> _resultHandler;
private float _divisor;
private bool _hostReserved;
private int _hostReserved;
public void Set(TableRef<ThreadedCounterEvent> evt, CounterType type, TableRef<EventHandler<ulong>> resultHandler, float divisor, bool hostReserved)
public void Set(TableRef<ThreadedCounterEvent> evt, CounterType type, TableRef<EventHandler<ulong>> resultHandler, float divisor, int hostReserved)
{
_event = evt;
_type = type;

View file

@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources
public CounterType Type { get; }
public bool ClearCounter { get; }
private bool _reserved;
private int _reserved;
private int _createLock;
public ThreadedCounterEvent(ThreadedRenderer renderer, CounterType type, bool clearCounter)
@ -61,7 +61,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources
}
else
{
_reserved = true;
Interlocked.Increment(ref _reserved);
}
Volatile.Write(ref _createLock, 0);
@ -70,10 +70,10 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources
}
}
public void Create(IRenderer renderer, CounterType type, System.EventHandler<ulong> eventHandler, float divisor, bool hostReserved)
public void Create(IRenderer renderer, CounterType type, System.EventHandler<ulong> eventHandler, float divisor, int hostReserved)
{
ThreadedHelpers.SpinUntilExchange(ref _createLock, 1, 0);
Base = renderer.ReportCounter(type, eventHandler, divisor, hostReserved || _reserved);
Base = renderer.ReportCounter(type, eventHandler, divisor, hostReserved + _reserved);
Volatile.Write(ref _createLock, 0);
}
}

View file

@ -419,7 +419,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading
QueueCommand();
}
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, int hostReserved)
{
ThreadedCounterEvent evt = new(this, type, _lastSampleCounterClear);
New<ReportCounterCommand>().Set(Ref(evt), type, Ref(resultHandler), divisor, hostReserved);

View file

@ -179,13 +179,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
case ReportCounterType.SamplesPassed:
float scale = _channel.TextureManager.RenderTargetScale;
float divisor = scale * scale;
counter = _context.Renderer.ReportCounter(CounterType.SamplesPassed, resultHandler, divisor, false);
counter = _context.Renderer.ReportCounter(CounterType.SamplesPassed, resultHandler, divisor, 0);
break;
case ReportCounterType.PrimitivesGenerated:
counter = _context.Renderer.ReportCounter(CounterType.PrimitivesGenerated, resultHandler, 1f, false);
counter = _context.Renderer.ReportCounter(CounterType.PrimitivesGenerated, resultHandler, 1f, 0);
break;
case ReportCounterType.TransformFeedbackPrimitivesWritten:
counter = _context.Renderer.ReportCounter(CounterType.TransformFeedbackPrimitivesWritten, resultHandler, 1f, false);
counter = _context.Renderer.ReportCounter(CounterType.TransformFeedbackPrimitivesWritten, resultHandler, 1f, 0);
break;
}

View file

@ -205,7 +205,7 @@ namespace Ryujinx.Graphics.OpenGL
ResourcePool.Tick();
}
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, int hostReserved)
{
return _counters.QueueReport(type, resultHandler, divisor, _pipeline.DrawCount, hostReserved);
}

View file

@ -106,7 +106,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
}
}
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, int hostReserved)
{
CounterQueueEvent result;
ulong draws = lastDrawIndex - _current.DrawIndex;
@ -116,9 +116,9 @@ namespace Ryujinx.Graphics.OpenGL.Queries
// A query's result only matters if more than one draw was performed during it.
// Otherwise, dummy it out and return 0 immediately.
if (hostReserved)
while (hostReserved-- > 0)
{
// This counter event is guaranteed to be available for host conditional rendering.
// This counter event is guaranteed to be available for host conditional rendering for the given number of uses.
_current.ReserveForHostAccess();
}

View file

@ -127,7 +127,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
return false;
}
_hostAccessReserved = Interlocked.Increment(ref _hostAccessReserved);
Interlocked.Increment(ref _hostAccessReserved);
return true;
}

View file

@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
}
}
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, int hostReserved)
{
return _counterQueues[(int)type].QueueReport(resultHandler, divisor, lastDrawIndex, hostReserved);
}

View file

@ -139,7 +139,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
}
}
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, int hostReserved)
{
CounterQueueEvent result;
ulong draws = lastDrawIndex - _current.DrawIndex;
@ -149,9 +149,9 @@ namespace Ryujinx.Graphics.Vulkan.Queries
// A query's result only matters if more than one draw was performed during it.
// Otherwise, dummy it out and return 0 immediately.
if (hostReserved)
while (hostReserved-- > 0)
{
// This counter event is guaranteed to be available for host conditional rendering.
// This counter event is guaranteed to be available for host conditional rendering for the given number of uses.
_current.ReserveForHostAccess();
}

View file

@ -37,7 +37,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
_counterQueues[(int)CounterType.SamplesPassed].ResetFutureCounters(cmd, count);
}
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, int hostReserved)
{
return _counterQueues[(int)type].QueueReport(resultHandler, divisor, _pipeline.DrawCount, hostReserved);
}

View file

@ -832,7 +832,7 @@ namespace Ryujinx.Graphics.Vulkan
SyncManager.Cleanup();
}
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, int hostReserved)
{
return _counters.QueueReport(type, resultHandler, divisor, hostReserved);
}