0
0
Fork 0

Vulkan: Fix barriers on macOS (#5700)

* 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>
This commit is contained in:
Isaac Marovitz 2023-09-23 18:32:36 -04:00 committed by GitHub
parent fe9e19d8cc
commit d9f9bbfaa6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -453,6 +453,28 @@ namespace Ryujinx.Graphics.Vulkan
} }
if (lastReadStage != PipelineStageFlags.None) if (lastReadStage != PipelineStageFlags.None)
{
// 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( TextureView.InsertMemoryBarrier(
_gd.Api, _gd.Api,
@ -461,6 +483,7 @@ namespace Ryujinx.Graphics.Vulkan
dstAccessFlags, dstAccessFlags,
lastReadStage, lastReadStage,
dstStageFlags); dstStageFlags);
}
_lastReadAccess = AccessFlags.None; _lastReadAccess = AccessFlags.None;
_lastReadStage = PipelineStageFlags.None; _lastReadStage = PipelineStageFlags.None;
@ -473,6 +496,28 @@ namespace Ryujinx.Graphics.Vulkan
_lastReadStage |= dstStageFlags; _lastReadStage |= dstStageFlags;
if (_lastModificationAccess != AccessFlags.None) if (_lastModificationAccess != AccessFlags.None)
{
// 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( TextureView.InsertMemoryBarrier(
_gd.Api, _gd.Api,
@ -481,6 +526,7 @@ namespace Ryujinx.Graphics.Vulkan
dstAccessFlags, dstAccessFlags,
_lastModificationStage, _lastModificationStage,
dstStageFlags); dstStageFlags);
}
_lastModificationAccess = AccessFlags.None; _lastModificationAccess = AccessFlags.None;
} }