aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/TextureStorage.cs74
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;
}