diff --git a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs index e9c2bf1ec4..5a6216c228 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs @@ -454,13 +454,36 @@ namespace Ryujinx.Graphics.Vulkan if (lastReadStage != PipelineStageFlags.None) { - TextureView.InsertMemoryBarrier( - _gd.Api, - cbs.CommandBuffer, - _lastReadAccess, - dstAccessFlags, - lastReadStage, - dstStageFlags); + // This would result in a validation error, but is + // required on MoltenVK as the generic barrier results in + // severe texture flickering in some scenarios. + if (_gd.IsMoltenVk) + { + ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); + TextureView.InsertImageBarrier( + _gd.Api, + cbs.CommandBuffer, + _imageAuto.Get(cbs).Value, + _lastReadAccess, + dstAccessFlags, + _lastReadStage, + dstStageFlags, + aspectFlags, + 0, + 0, + _info.GetLayers(), + _info.Levels); + } + else + { + TextureView.InsertMemoryBarrier( + _gd.Api, + cbs.CommandBuffer, + _lastReadAccess, + dstAccessFlags, + lastReadStage, + dstStageFlags); + } _lastReadAccess = AccessFlags.None; _lastReadStage = PipelineStageFlags.None; @@ -474,13 +497,36 @@ namespace Ryujinx.Graphics.Vulkan if (_lastModificationAccess != AccessFlags.None) { - TextureView.InsertMemoryBarrier( - _gd.Api, - cbs.CommandBuffer, - _lastModificationAccess, - dstAccessFlags, - _lastModificationStage, - dstStageFlags); + // This would result in a validation error, but is + // required on MoltenVK as the generic barrier results in + // severe texture flickering in some scenarios. + if (_gd.IsMoltenVk) + { + ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); + TextureView.InsertImageBarrier( + _gd.Api, + cbs.CommandBuffer, + _imageAuto.Get(cbs).Value, + _lastModificationAccess, + dstAccessFlags, + _lastModificationStage, + dstStageFlags, + aspectFlags, + 0, + 0, + _info.GetLayers(), + _info.Levels); + } + else + { + TextureView.InsertMemoryBarrier( + _gd.Api, + cbs.CommandBuffer, + _lastModificationAccess, + dstAccessFlags, + _lastModificationStage, + dstStageFlags); + } _lastModificationAccess = AccessFlags.None; }