diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs index 9236384f3..b2527f91b 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs @@ -55,6 +55,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv context.AddCapability(Capability.ImageQuery); context.AddCapability(Capability.SampledBuffer); + if (parameters.HostCapabilities.StorageImageExtendedFormats) + { + context.AddCapability(Capability.StorageImageExtendedFormats); + } + if (parameters.HostCapabilities.SupportsShaderFloat64) { context.AddCapability(Capability.Float64); diff --git a/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs b/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs index 4e6d6edf9..2fd9090f5 100644 --- a/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs +++ b/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs @@ -184,6 +184,11 @@ namespace Ryujinx.Graphics.Shader return false; } + bool QueryStorageImageExtendedFormats() + { + return true; + } + /// /// Queries host about the presence of the FrontFacing built-in variable bug. /// diff --git a/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs b/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs index 11fe6599d..79d4abd80 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/HostCapabilities.cs @@ -11,6 +11,7 @@ namespace Ryujinx.Graphics.Shader.Translation public readonly bool SupportsShaderFloat64; public readonly bool SupportsTextureShadowLod; public readonly bool SupportsViewportMask; + public readonly bool StorageImageExtendedFormats; public HostCapabilities( bool reducedPrecision, @@ -21,7 +22,8 @@ namespace Ryujinx.Graphics.Shader.Translation bool supportsShaderBarrierDivergence, bool supportsShaderFloat64, bool supportsTextureShadowLod, - bool supportsViewportMask) + bool supportsViewportMask, + bool storageImageExtendedFormats) { ReducedPrecision = reducedPrecision; SupportsFragmentShaderInterlock = supportsFragmentShaderInterlock; @@ -32,6 +34,7 @@ namespace Ryujinx.Graphics.Shader.Translation SupportsShaderFloat64 = supportsShaderFloat64; SupportsTextureShadowLod = supportsTextureShadowLod; SupportsViewportMask = supportsViewportMask; + StorageImageExtendedFormats = storageImageExtendedFormats; } } } diff --git a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs index beb61bd2e..4bf60072d 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs @@ -365,7 +365,8 @@ namespace Ryujinx.Graphics.Shader.Translation GpuAccessor.QueryHostSupportsShaderBarrierDivergence(), GpuAccessor.QueryHostSupportsShaderFloat64(), GpuAccessor.QueryHostSupportsTextureShadowLod(), - GpuAccessor.QueryHostSupportsViewportMask()); + GpuAccessor.QueryHostSupportsViewportMask(), + GpuAccessor.QueryStorageImageExtendedFormats()); var parameters = new CodeGenParameters(attributeUsage, definitions, resourceManager.Properties, hostCapabilities, GpuAccessor, Options.TargetApi); diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs b/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs index e9899d4d6..1f7433515 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs @@ -497,6 +497,7 @@ namespace Ryujinx.Graphics.Vulkan VertexPipelineStoresAndAtomics = supportedFeatures.VertexPipelineStoresAndAtomics, RobustBufferAccess = useRobustBufferAccess, SampleRateShading = supportedFeatures.SampleRateShading, + ShaderStorageImageExtendedFormats = supportedFeatures.ShaderStorageImageExtendedFormats, }; void* pExtendedFeatures = null;