Sfoglia il codice sorgente

Vulkan: Do not set storage flag for multisample textures if not supported (#5060)

gdkchan 2 anni fa
parent
commit
4ca78eded5

+ 3 - 0
src/Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs

@@ -28,6 +28,7 @@ namespace Ryujinx.Graphics.Vulkan
         public readonly bool SupportsSubgroupSizeControl;
         public readonly bool SupportsSubgroupSizeControl;
         public readonly bool SupportsShaderInt8;
         public readonly bool SupportsShaderInt8;
         public readonly bool SupportsShaderStencilExport;
         public readonly bool SupportsShaderStencilExport;
+        public readonly bool SupportsShaderStorageImageMultisample;
         public readonly bool SupportsConditionalRendering;
         public readonly bool SupportsConditionalRendering;
         public readonly bool SupportsExtendedDynamicState;
         public readonly bool SupportsExtendedDynamicState;
         public readonly bool SupportsMultiView;
         public readonly bool SupportsMultiView;
@@ -63,6 +64,7 @@ namespace Ryujinx.Graphics.Vulkan
             bool supportsSubgroupSizeControl,
             bool supportsSubgroupSizeControl,
             bool supportsShaderInt8,
             bool supportsShaderInt8,
             bool supportsShaderStencilExport,
             bool supportsShaderStencilExport,
+            bool supportsShaderStorageImageMultisample,
             bool supportsConditionalRendering,
             bool supportsConditionalRendering,
             bool supportsExtendedDynamicState,
             bool supportsExtendedDynamicState,
             bool supportsMultiView,
             bool supportsMultiView,
@@ -97,6 +99,7 @@ namespace Ryujinx.Graphics.Vulkan
             SupportsSubgroupSizeControl = supportsSubgroupSizeControl;
             SupportsSubgroupSizeControl = supportsSubgroupSizeControl;
             SupportsShaderInt8 = supportsShaderInt8;
             SupportsShaderInt8 = supportsShaderInt8;
             SupportsShaderStencilExport = supportsShaderStencilExport;
             SupportsShaderStencilExport = supportsShaderStencilExport;
+            SupportsShaderStorageImageMultisample = supportsShaderStorageImageMultisample;
             SupportsConditionalRendering = supportsConditionalRendering;
             SupportsConditionalRendering = supportsConditionalRendering;
             SupportsExtendedDynamicState = supportsExtendedDynamicState;
             SupportsExtendedDynamicState = supportsExtendedDynamicState;
             SupportsMultiView = supportsMultiView;
             SupportsMultiView = supportsMultiView;

+ 3 - 3
src/Ryujinx.Graphics.Vulkan/TextureStorage.cs

@@ -80,7 +80,7 @@ namespace Ryujinx.Graphics.Vulkan
 
 
             var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples);
             var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples);
 
 
-            var usage = GetImageUsageFromFormat(info.Format);
+            var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample);
 
 
             var flags = ImageCreateFlags.CreateMutableFormatBit;
             var flags = ImageCreateFlags.CreateMutableFormatBit;
 
 
@@ -293,7 +293,7 @@ namespace Ryujinx.Graphics.Vulkan
             }
             }
         }
         }
 
 
-        public static ImageUsageFlags GetImageUsageFromFormat(GAL.Format format)
+        public static ImageUsageFlags GetImageUsage(GAL.Format format, Target target, bool supportsMsStorage)
         {
         {
             var usage = DefaultUsageFlags;
             var usage = DefaultUsageFlags;
 
 
@@ -306,7 +306,7 @@ namespace Ryujinx.Graphics.Vulkan
                 usage |= ImageUsageFlags.ColorAttachmentBit;
                 usage |= ImageUsageFlags.ColorAttachmentBit;
             }
             }
 
 
-            if (format.IsImageCompatible())
+            if (format.IsImageCompatible() && (supportsMsStorage || !target.IsMultisample()))
             {
             {
                 usage |= ImageUsageFlags.StorageBit;
                 usage |= ImageUsageFlags.StorageBit;
             }
             }

+ 1 - 1
src/Ryujinx.Graphics.Vulkan/TextureView.cs

@@ -54,7 +54,7 @@ namespace Ryujinx.Graphics.Vulkan
             gd.Textures.Add(this);
             gd.Textures.Add(this);
 
 
             var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format);
             var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format);
-            var usage = TextureStorage.GetImageUsageFromFormat(info.Format);
+            var usage = TextureStorage.GetImageUsage(info.Format, info.Target, gd.Capabilities.SupportsShaderStorageImageMultisample);
             var levels = (uint)info.Levels;
             var levels = (uint)info.Levels;
             var layers = (uint)info.GetLayers();
             var layers = (uint)info.GetLayers();
 
 

+ 1 - 0
src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs

@@ -295,6 +295,7 @@ namespace Ryujinx.Graphics.Vulkan
                 supportsSubgroupSizeControl,
                 supportsSubgroupSizeControl,
                 featuresShaderInt8.ShaderInt8,
                 featuresShaderInt8.ShaderInt8,
                 _physicalDevice.IsDeviceExtensionPresent("VK_EXT_shader_stencil_export"),
                 _physicalDevice.IsDeviceExtensionPresent("VK_EXT_shader_stencil_export"),
+                features2.Features.ShaderStorageImageMultisample,
                 _physicalDevice.IsDeviceExtensionPresent(ExtConditionalRendering.ExtensionName),
                 _physicalDevice.IsDeviceExtensionPresent(ExtConditionalRendering.ExtensionName),
                 _physicalDevice.IsDeviceExtensionPresent(ExtExtendedDynamicState.ExtensionName),
                 _physicalDevice.IsDeviceExtensionPresent(ExtExtendedDynamicState.ExtensionName),
                 features2.Features.MultiViewport,
                 features2.Features.MultiViewport,