diff options
author | Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> | 2023-09-23 18:32:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-23 19:32:36 -0300 |
commit | d9f9bbfaa6b3400a4f33e342e6c290afe796123a (patch) | |
tree | 9ff2892f10577aa1edf7aa61493cdbb5ee312657 /src | |
parent | fe9e19d8ccf1823a0891d2df198292e0b0d53132 (diff) |
Vulkan: Fix barriers on macOS (#5700)1.1.1022
* Use old method on macOS
* gdk suggestions
* Update src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
* Update src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
---------
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/Ryujinx.Graphics.Vulkan/TextureStorage.cs | 74 |
1 files changed, 60 insertions, 14 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs index e9c2bf1e..5a6216c2 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; } |