diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/TextureStorage.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Vulkan/TextureStorage.cs | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs index 090f69dc..e9c2bf1e 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs @@ -78,7 +78,7 @@ namespace Ryujinx.Graphics.Vulkan var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples); - var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample, forceStorage: true); + var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample); var flags = ImageCreateFlags.CreateMutableFormatBit; @@ -291,7 +291,7 @@ namespace Ryujinx.Graphics.Vulkan } } - public static ImageUsageFlags GetImageUsage(Format format, Target target, bool supportsMsStorage, bool forceStorage = false) + public static ImageUsageFlags GetImageUsage(Format format, Target target, bool supportsMsStorage) { var usage = DefaultUsageFlags; @@ -304,7 +304,7 @@ namespace Ryujinx.Graphics.Vulkan usage |= ImageUsageFlags.ColorAttachmentBit; } - if (((forceStorage && !format.IsDepthOrStencil()) || format.IsImageCompatible()) && (supportsMsStorage || !target.IsMultisample())) + if (format.IsImageCompatible() && (supportsMsStorage || !target.IsMultisample())) { usage |= ImageUsageFlags.StorageBit; } @@ -440,25 +440,27 @@ namespace Ryujinx.Graphics.Vulkan _lastModificationStage = stage; } - public void InsertReadToWriteBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags) + public void InsertReadToWriteBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags, bool insideRenderPass) { - if (_lastReadAccess != AccessFlags.None) + var lastReadStage = _lastReadStage; + + if (insideRenderPass) { - ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); + // We can't have barrier from compute inside a render pass, + // as it is invalid to specify compute in the subpass dependency stage mask. + + lastReadStage &= ~PipelineStageFlags.ComputeShaderBit; + } - TextureView.InsertImageBarrier( + if (lastReadStage != PipelineStageFlags.None) + { + TextureView.InsertMemoryBarrier( _gd.Api, cbs.CommandBuffer, - _imageAuto.Get(cbs).Value, _lastReadAccess, dstAccessFlags, - _lastReadStage, - dstStageFlags, - aspectFlags, - 0, - 0, - _info.GetLayers(), - _info.Levels); + lastReadStage, + dstStageFlags); _lastReadAccess = AccessFlags.None; _lastReadStage = PipelineStageFlags.None; @@ -472,21 +474,13 @@ namespace Ryujinx.Graphics.Vulkan if (_lastModificationAccess != AccessFlags.None) { - ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); - - TextureView.InsertImageBarrier( + TextureView.InsertMemoryBarrier( _gd.Api, cbs.CommandBuffer, - _imageAuto.Get(cbs).Value, _lastModificationAccess, dstAccessFlags, _lastModificationStage, - dstStageFlags, - aspectFlags, - 0, - 0, - _info.GetLayers(), - _info.Levels); + dstStageFlags); _lastModificationAccess = AccessFlags.None; } |