aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/TextureStorage.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/TextureStorage.cs44
1 files changed, 19 insertions, 25 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
index 090f69dc..e9c2bf1e 100644
--- a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
+++ b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs
@@ -78,7 +78,7 @@ namespace Ryujinx.Graphics.Vulkan
var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples);
- var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample, forceStorage: true);
+ var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample);
var flags = ImageCreateFlags.CreateMutableFormatBit;
@@ -291,7 +291,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
- public static ImageUsageFlags GetImageUsage(Format format, Target target, bool supportsMsStorage, bool forceStorage = false)
+ public static ImageUsageFlags GetImageUsage(Format format, Target target, bool supportsMsStorage)
{
var usage = DefaultUsageFlags;
@@ -304,7 +304,7 @@ namespace Ryujinx.Graphics.Vulkan
usage |= ImageUsageFlags.ColorAttachmentBit;
}
- if (((forceStorage && !format.IsDepthOrStencil()) || format.IsImageCompatible()) && (supportsMsStorage || !target.IsMultisample()))
+ if (format.IsImageCompatible() && (supportsMsStorage || !target.IsMultisample()))
{
usage |= ImageUsageFlags.StorageBit;
}
@@ -440,25 +440,27 @@ namespace Ryujinx.Graphics.Vulkan
_lastModificationStage = stage;
}
- public void InsertReadToWriteBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags)
+ public void InsertReadToWriteBarrier(CommandBufferScoped cbs, AccessFlags dstAccessFlags, PipelineStageFlags dstStageFlags, bool insideRenderPass)
{
- if (_lastReadAccess != AccessFlags.None)
+ var lastReadStage = _lastReadStage;
+
+ if (insideRenderPass)
{
- ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
+ // We can't have barrier from compute inside a render pass,
+ // as it is invalid to specify compute in the subpass dependency stage mask.
+
+ lastReadStage &= ~PipelineStageFlags.ComputeShaderBit;
+ }
- TextureView.InsertImageBarrier(
+ if (lastReadStage != PipelineStageFlags.None)
+ {
+ TextureView.InsertMemoryBarrier(
_gd.Api,
cbs.CommandBuffer,
- _imageAuto.Get(cbs).Value,
_lastReadAccess,
dstAccessFlags,
- _lastReadStage,
- dstStageFlags,
- aspectFlags,
- 0,
- 0,
- _info.GetLayers(),
- _info.Levels);
+ lastReadStage,
+ dstStageFlags);
_lastReadAccess = AccessFlags.None;
_lastReadStage = PipelineStageFlags.None;
@@ -472,21 +474,13 @@ namespace Ryujinx.Graphics.Vulkan
if (_lastModificationAccess != AccessFlags.None)
{
- ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
-
- TextureView.InsertImageBarrier(
+ TextureView.InsertMemoryBarrier(
_gd.Api,
cbs.CommandBuffer,
- _imageAuto.Get(cbs).Value,
_lastModificationAccess,
dstAccessFlags,
_lastModificationStage,
- dstStageFlags,
- aspectFlags,
- 0,
- 0,
- _info.GetLayers(),
- _info.Levels);
+ dstStageFlags);
_lastModificationAccess = AccessFlags.None;
}