|
|
@@ -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;
|
|
|
}
|