forked from Mirror/Ryujinx
Fix some Vulkan validation errors (#4357)
This commit is contained in:
parent
26bf13a65d
commit
f6d5499a16
4 changed files with 26 additions and 14 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue