Fix some Vulkan validation errors (#4357)

This commit is contained in:
gdkchan 2023-02-08 10:34:22 -03:00 committed by GitHub
parent 26bf13a65d
commit f6d5499a16
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 14 deletions

View file

@ -27,6 +27,7 @@ namespace Ryujinx.Graphics.Vulkan
int attachmentCount = 0; int attachmentCount = 0;
int colorCount = 0; int colorCount = 0;
int maxColorAttachmentIndex = -1;
for (int i = 0; i < state.AttachmentEnable.Length; i++) for (int i = 0; i < state.AttachmentEnable.Length; i++)
{ {
@ -36,6 +37,7 @@ namespace Ryujinx.Graphics.Vulkan
attachmentIndices[attachmentCount++] = i; attachmentIndices[attachmentCount++] = i;
colorCount++; colorCount++;
maxColorAttachmentIndex = i;
} }
} }
@ -73,12 +75,11 @@ namespace Ryujinx.Graphics.Vulkan
if (colorAttachmentsCount != 0) if (colorAttachmentsCount != 0)
{ {
int maxAttachmentIndex = Constants.MaxRenderTargets - 1; subpass.ColorAttachmentCount = (uint)maxColorAttachmentIndex + 1;
subpass.ColorAttachmentCount = (uint)maxAttachmentIndex + 1;
subpass.PColorAttachments = &attachmentReferences[0]; subpass.PColorAttachments = &attachmentReferences[0];
// Fill with VK_ATTACHMENT_UNUSED to cover any gaps. // Fill with VK_ATTACHMENT_UNUSED to cover any gaps.
for (int i = 0; i <= maxAttachmentIndex; i++) for (int i = 0; i <= maxColorAttachmentIndex; i++)
{ {
subpass.PColorAttachments[i] = new AttachmentReference(Vk.AttachmentUnused, ImageLayout.Undefined); subpass.PColorAttachments[i] = new AttachmentReference(Vk.AttachmentUnused, ImageLayout.Undefined);
} }

View file

@ -10,7 +10,7 @@ namespace Ryujinx.Graphics.Vulkan
{ {
private const ulong MinByteWeightForFlush = 256 * 1024 * 1024; // MiB private const ulong MinByteWeightForFlush = 256 * 1024 * 1024; // MiB
private readonly List<QueryPool> _activeQueries; private readonly List<(QueryPool, bool)> _activeQueries;
private CounterQueueEvent _activeConditionalRender; private CounterQueueEvent _activeConditionalRender;
private readonly List<BufferedQuery> _pendingQueryCopies; private readonly List<BufferedQuery> _pendingQueryCopies;
@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.Vulkan
public PipelineFull(VulkanRenderer gd, Device device) : base(gd, device) public PipelineFull(VulkanRenderer gd, Device device) : base(gd, device)
{ {
_activeQueries = new List<QueryPool>(); _activeQueries = new List<(QueryPool, bool)>();
_pendingQueryCopies = new(); _pendingQueryCopies = new();
CommandBuffer = (Cbs = gd.CommandBufferPool.Rent()).CommandBuffer; CommandBuffer = (Cbs = gd.CommandBufferPool.Rent()).CommandBuffer;
@ -202,7 +202,7 @@ namespace Ryujinx.Graphics.Vulkan
AutoFlush.RegisterFlush(DrawCount); AutoFlush.RegisterFlush(DrawCount);
EndRenderPass(); EndRenderPass();
foreach (var queryPool in _activeQueries) foreach ((var queryPool, _) in _activeQueries)
{ {
Gd.Api.CmdEndQuery(CommandBuffer, queryPool, 0); Gd.Api.CmdEndQuery(CommandBuffer, queryPool, 0);
} }
@ -220,10 +220,12 @@ namespace Ryujinx.Graphics.Vulkan
// Restore per-command buffer state. // Restore per-command buffer state.
foreach (var queryPool in _activeQueries) foreach ((var queryPool, var isOcclusion) in _activeQueries)
{ {
bool isPrecise = Gd.Capabilities.SupportsPreciseOcclusionQueries && isOcclusion;
Gd.Api.CmdResetQueryPool(CommandBuffer, queryPool, 0, 1); Gd.Api.CmdResetQueryPool(CommandBuffer, queryPool, 0, 1);
Gd.Api.CmdBeginQuery(CommandBuffer, queryPool, 0, Gd.Capabilities.SupportsPreciseOcclusionQueries ? QueryControlFlags.PreciseBit : 0); Gd.Api.CmdBeginQuery(CommandBuffer, queryPool, 0, isPrecise ? QueryControlFlags.PreciseBit : 0);
} }
Gd.ResetCounterPool(); Gd.ResetCounterPool();
@ -231,7 +233,7 @@ namespace Ryujinx.Graphics.Vulkan
Restore(); Restore();
} }
public void BeginQuery(BufferedQuery query, QueryPool pool, bool needsReset, bool fromSamplePool) public void BeginQuery(BufferedQuery query, QueryPool pool, bool needsReset, bool isOcclusion, bool fromSamplePool)
{ {
if (needsReset) if (needsReset)
{ {
@ -247,16 +249,24 @@ namespace Ryujinx.Graphics.Vulkan
} }
} }
Gd.Api.CmdBeginQuery(CommandBuffer, pool, 0, Gd.Capabilities.SupportsPreciseOcclusionQueries ? QueryControlFlags.PreciseBit : 0); bool isPrecise = Gd.Capabilities.SupportsPreciseOcclusionQueries && isOcclusion;
Gd.Api.CmdBeginQuery(CommandBuffer, pool, 0, isPrecise ? QueryControlFlags.PreciseBit : 0);
_activeQueries.Add(pool); _activeQueries.Add((pool, isOcclusion));
} }
public void EndQuery(QueryPool pool) public void EndQuery(QueryPool pool)
{ {
Gd.Api.CmdEndQuery(CommandBuffer, pool, 0); Gd.Api.CmdEndQuery(CommandBuffer, pool, 0);
_activeQueries.Remove(pool); for (int i = 0; i < _activeQueries.Count; i++)
{
if (_activeQueries[i].Item1.Handle == pool.Handle)
{
_activeQueries.RemoveAt(i);
break;
}
}
} }
public void CopyQueryResults(BufferedQuery query) public void CopyQueryResults(BufferedQuery query)

View file

@ -100,7 +100,8 @@ namespace Ryujinx.Graphics.Vulkan.Queries
if (_isSupported) if (_isSupported)
{ {
bool needsReset = resetSequence == null || _resetSequence == null || resetSequence.Value != _resetSequence.Value; bool needsReset = resetSequence == null || _resetSequence == null || resetSequence.Value != _resetSequence.Value;
_pipeline.BeginQuery(this, _queryPool, needsReset, _type == CounterType.SamplesPassed && resetSequence != null); bool isOcclusion = _type == CounterType.SamplesPassed;
_pipeline.BeginQuery(this, _queryPool, needsReset, isOcclusion, isOcclusion && resetSequence != null);
} }
_resetSequence = null; _resetSequence = null;
} }

View file

@ -90,7 +90,7 @@ namespace Ryujinx.Graphics.Vulkan
var componentMapping = new ComponentMapping(swizzleR, swizzleG, swizzleB, swizzleA); var componentMapping = new ComponentMapping(swizzleR, swizzleG, swizzleB, swizzleA);
var aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode); var aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode);
var aspectFlagsDepth = info.Format.ConvertAspectFlags(DepthStencilMode.Depth); var aspectFlagsDepth = info.Format.ConvertAspectFlags();
var subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers); var subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers);
var subresourceRangeDepth = new ImageSubresourceRange(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers); var subresourceRangeDepth = new ImageSubresourceRange(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers);