mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-02-22 09:03:36 +00:00
Fix counter queue leak when game decides to use host conditional rendering
This commit is contained in:
parent
d14dbb0cff
commit
1e167788d4
1 changed files with 26 additions and 17 deletions
|
@ -11,6 +11,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
private bool _hasPendingQuery;
|
private bool _hasPendingQuery;
|
||||||
|
|
||||||
private readonly List<QueryPool> _activeQueries;
|
private readonly List<QueryPool> _activeQueries;
|
||||||
|
private CounterQueueEvent _activeConditionalRender;
|
||||||
|
|
||||||
public PipelineFull(VulkanGraphicsDevice gd, Device device) : base(gd, device)
|
public PipelineFull(VulkanGraphicsDevice gd, Device device) : base(gd, device)
|
||||||
{
|
{
|
||||||
|
@ -167,6 +168,9 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
// throw new NotSupportedException();
|
// throw new NotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_activeConditionalRender?.ReleaseHostAccess();
|
||||||
|
_activeConditionalRender = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryHostConditionalRendering(ICounterEvent value, ulong compare, bool isEqual)
|
public bool TryHostConditionalRendering(ICounterEvent value, ulong compare, bool isEqual)
|
||||||
|
@ -180,26 +184,31 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
// - Comparing against 0.
|
// - Comparing against 0.
|
||||||
// - Event has not already been flushed.
|
// - Event has not already been flushed.
|
||||||
|
|
||||||
if (evt.Disposed)
|
if (compare == 0 && evt.Type == CounterType.SamplesPassed && evt.ClearCounter)
|
||||||
{
|
{
|
||||||
// If the event has been flushed, then just use the values on the CPU.
|
if (!value.ReserveForHostAccess())
|
||||||
// The query object may already be repurposed for another draw (eg. begin + end).
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Gd.Capabilities.SupportsConditionalRendering && compare == 0 && evt.Type == CounterType.SamplesPassed && evt.ClearCounter)
|
|
||||||
{
|
|
||||||
var buffer = evt.GetBuffer().Get(Cbs, 0, sizeof(long)).Value;
|
|
||||||
var flags = isEqual ? ConditionalRenderingFlagsEXT.ConditionalRenderingInvertedBitExt : 0;
|
|
||||||
|
|
||||||
var conditionalRenderingBeginInfo = new ConditionalRenderingBeginInfoEXT()
|
|
||||||
{
|
{
|
||||||
SType = StructureType.ConditionalRenderingBeginInfoExt,
|
// If the event has been flushed, then just use the values on the CPU.
|
||||||
Buffer = buffer,
|
// The query object may already be repurposed for another draw (eg. begin + end).
|
||||||
Flags = flags
|
return false;
|
||||||
};
|
}
|
||||||
|
|
||||||
// Gd.ConditionalRenderingApi.CmdBeginConditionalRendering(CommandBuffer, conditionalRenderingBeginInfo);
|
if (Gd.Capabilities.SupportsConditionalRendering)
|
||||||
|
{
|
||||||
|
var buffer = evt.GetBuffer().Get(Cbs, 0, sizeof(long)).Value;
|
||||||
|
var flags = isEqual ? ConditionalRenderingFlagsEXT.ConditionalRenderingInvertedBitExt : 0;
|
||||||
|
|
||||||
|
var conditionalRenderingBeginInfo = new ConditionalRenderingBeginInfoEXT()
|
||||||
|
{
|
||||||
|
SType = StructureType.ConditionalRenderingBeginInfoExt,
|
||||||
|
Buffer = buffer,
|
||||||
|
Flags = flags
|
||||||
|
};
|
||||||
|
|
||||||
|
// Gd.ConditionalRenderingApi.CmdBeginConditionalRendering(CommandBuffer, conditionalRenderingBeginInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
_activeConditionalRender = evt;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue