aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/TextureStorage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/TextureStorage.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/TextureStorage.cs54
1 files changed, 32 insertions, 22 deletions
diff --git a/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/Ryujinx.Graphics.Vulkan/TextureStorage.cs
index 03a47a09..8ebdd4c0 100644
--- a/Ryujinx.Graphics.Vulkan/TextureStorage.cs
+++ b/Ryujinx.Graphics.Vulkan/TextureStorage.cs
@@ -46,6 +46,8 @@ namespace Ryujinx.Graphics.Vulkan
private AccessFlags _lastModificationAccess;
private PipelineStageFlags _lastModificationStage;
+ private AccessFlags _lastReadAccess;
+ private PipelineStageFlags _lastReadStage;
private int _viewsCount;
private ulong _size;
@@ -440,31 +442,39 @@ namespace Ryujinx.Graphics.Vulkan
_lastModificationStage = stage;
}
- public void InsertBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags)
+ public void InsertReadToWriteBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags)
{
- if (_lastModificationAccess != AccessFlags.NoneKhr)
+ if (_lastReadAccess != AccessFlags.NoneKhr)
{
- ImageAspectFlags aspectFlags;
+ ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
- if (_info.Format.IsDepthOrStencil())
- {
- if (_info.Format == GAL.Format.S8Uint)
- {
- aspectFlags = ImageAspectFlags.StencilBit;
- }
- else if (_info.Format == GAL.Format.D16Unorm || _info.Format == GAL.Format.D32Float)
- {
- aspectFlags = ImageAspectFlags.DepthBit;
- }
- else
- {
- aspectFlags = ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit;
- }
- }
- else
- {
- aspectFlags = ImageAspectFlags.ColorBit;
- }
+ TextureView.InsertImageBarrier(
+ _gd.Api,
+ cbs.CommandBuffer,
+ _imageAuto.Get(cbs).Value,
+ _lastReadAccess,
+ dstAccessFlags,
+ _lastReadStage,
+ dstStageFlags,
+ aspectFlags,
+ 0,
+ 0,
+ _info.GetLayers(),
+ _info.Levels);
+
+ _lastReadAccess = AccessFlags.NoneKhr;
+ _lastReadStage = PipelineStageFlags.None;
+ }
+ }
+
+ public void InsertWriteToReadBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags)
+ {
+ _lastReadAccess |= dstAccessFlags;
+ _lastReadStage |= dstStageFlags;
+
+ if (_lastModificationAccess != AccessFlags.NoneKhr)
+ {
+ ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
TextureView.InsertImageBarrier(
_gd.Api,