diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Compute.cs | 7 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Methods.cs | 54 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/ShaderTexture.cs | 111 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/Texture.cs | 13 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs | 20 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | 9 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs | 1 |
7 files changed, 147 insertions, 68 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Compute.cs b/Ryujinx.Graphics.Gpu/Engine/Compute.cs index d718d469..1219ef0c 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Compute.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Compute.cs @@ -128,7 +128,7 @@ namespace Ryujinx.Graphics.Gpu.Engine { var descriptor = info.Textures[index]; - Target target = GetTarget(descriptor.Type); + Target target = ShaderTexture.GetTarget(descriptor.Type); if (descriptor.IsBindless) { @@ -148,9 +148,10 @@ namespace Ryujinx.Graphics.Gpu.Engine { var descriptor = info.Images[index]; - Target target = GetTarget(descriptor.Type); + Target target = ShaderTexture.GetTarget(descriptor.Type); + Format format = ShaderTexture.GetFormat(descriptor.Format); - imageBindings[index] = new TextureBindingInfo(target, descriptor.HandleIndex, descriptor.Flags); + imageBindings[index] = new TextureBindingInfo(target, format, descriptor.HandleIndex, descriptor.Flags); } TextureManager.SetComputeImages(imageBindings); diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs index 7f567071..d4988f35 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs @@ -1014,7 +1014,7 @@ namespace Ryujinx.Graphics.Gpu.Engine { var descriptor = info.Textures[index]; - Target target = GetTarget(descriptor.Type); + Target target = ShaderTexture.GetTarget(descriptor.Type); if (descriptor.IsBindless) { @@ -1034,9 +1034,10 @@ namespace Ryujinx.Graphics.Gpu.Engine { var descriptor = info.Images[index]; - Target target = GetTarget(descriptor.Type); + Target target = ShaderTexture.GetTarget(descriptor.Type); + Format format = ShaderTexture.GetFormat(descriptor.Format); - imageBindings[index] = new TextureBindingInfo(target, descriptor.HandleIndex, descriptor.Flags); + imageBindings[index] = new TextureBindingInfo(target, format, descriptor.HandleIndex, descriptor.Flags); } TextureManager.SetGraphicsImages(stage, imageBindings); @@ -1097,53 +1098,6 @@ namespace Ryujinx.Graphics.Gpu.Engine } /// <summary> - /// Gets texture target from a sampler type. - /// </summary> - /// <param name="type">Sampler type</param> - /// <returns>Texture target value</returns> - private static Target GetTarget(SamplerType type) - { - type &= ~(SamplerType.Indexed | SamplerType.Shadow); - - switch (type) - { - case SamplerType.Texture1D: - return Target.Texture1D; - - case SamplerType.TextureBuffer: - return Target.TextureBuffer; - - case SamplerType.Texture1D | SamplerType.Array: - return Target.Texture1DArray; - - case SamplerType.Texture2D: - return Target.Texture2D; - - case SamplerType.Texture2D | SamplerType.Array: - return Target.Texture2DArray; - - case SamplerType.Texture2D | SamplerType.Multisample: - return Target.Texture2DMultisample; - - case SamplerType.Texture2D | SamplerType.Multisample | SamplerType.Array: - return Target.Texture2DMultisampleArray; - - case SamplerType.Texture3D: - return Target.Texture3D; - - case SamplerType.TextureCube: - return Target.Cubemap; - - case SamplerType.TextureCube | SamplerType.Array: - return Target.CubemapArray; - } - - Logger.Warning?.Print(LogClass.Gpu, $"Invalid sampler type \"{type}\"."); - - return Target.Texture2D; - } - - /// <summary> /// Issues a texture barrier. /// This waits until previous texture writes from the GPU to finish, before /// performing new operations with said textures. diff --git a/Ryujinx.Graphics.Gpu/Engine/ShaderTexture.cs b/Ryujinx.Graphics.Gpu/Engine/ShaderTexture.cs new file mode 100644 index 00000000..e1e3085b --- /dev/null +++ b/Ryujinx.Graphics.Gpu/Engine/ShaderTexture.cs @@ -0,0 +1,111 @@ +using Ryujinx.Common.Logging; +using Ryujinx.Graphics.GAL; +using Ryujinx.Graphics.Shader; + +namespace Ryujinx.Graphics.Gpu.Engine +{ + /// <summary> + /// Shader texture properties conversion methods. + /// </summary> + static class ShaderTexture + { + /// <summary> + /// Gets a texture target from a sampler type. + /// </summary> + /// <param name="type">Sampler type</param> + /// <returns>Texture target value</returns> + public static Target GetTarget(SamplerType type) + { + type &= ~(SamplerType.Indexed | SamplerType.Shadow); + + switch (type) + { + case SamplerType.Texture1D: + return Target.Texture1D; + + case SamplerType.TextureBuffer: + return Target.TextureBuffer; + + case SamplerType.Texture1D | SamplerType.Array: + return Target.Texture1DArray; + + case SamplerType.Texture2D: + return Target.Texture2D; + + case SamplerType.Texture2D | SamplerType.Array: + return Target.Texture2DArray; + + case SamplerType.Texture2D | SamplerType.Multisample: + return Target.Texture2DMultisample; + + case SamplerType.Texture2D | SamplerType.Multisample | SamplerType.Array: + return Target.Texture2DMultisampleArray; + + case SamplerType.Texture3D: + return Target.Texture3D; + + case SamplerType.TextureCube: + return Target.Cubemap; + + case SamplerType.TextureCube | SamplerType.Array: + return Target.CubemapArray; + } + + Logger.Warning?.Print(LogClass.Gpu, $"Invalid sampler type \"{type}\"."); + + return Target.Texture2D; + } + + /// <summary> + /// Gets a texture format from a shader image format. + /// </summary> + /// <param name="format">Shader image format</param> + /// <returns>Texture format</returns> + public static Format GetFormat(TextureFormat format) + { + return format switch + { + TextureFormat.R8Unorm => Format.R8Unorm, + TextureFormat.R8Snorm => Format.R8Snorm, + TextureFormat.R8Uint => Format.R8Uint, + TextureFormat.R8Sint => Format.R8Sint, + TextureFormat.R16Float => Format.R16Float, + TextureFormat.R16Unorm => Format.R16Unorm, + TextureFormat.R16Snorm => Format.R16Snorm, + TextureFormat.R16Uint => Format.R16Uint, + TextureFormat.R16Sint => Format.R16Sint, + TextureFormat.R32Float => Format.R32Float, + TextureFormat.R32Uint => Format.R32Uint, + TextureFormat.R32Sint => Format.R32Sint, + TextureFormat.R8G8Unorm => Format.R8G8Unorm, + TextureFormat.R8G8Snorm => Format.R8G8Snorm, + TextureFormat.R8G8Uint => Format.R8G8Uint, + TextureFormat.R8G8Sint => Format.R8G8Sint, + TextureFormat.R16G16Float => Format.R16G16Float, + TextureFormat.R16G16Unorm => Format.R16G16Unorm, + TextureFormat.R16G16Snorm => Format.R16G16Snorm, + TextureFormat.R16G16Uint => Format.R16G16Uint, + TextureFormat.R16G16Sint => Format.R16G16Sint, + TextureFormat.R32G32Float => Format.R32G32Float, + TextureFormat.R32G32Uint => Format.R32G32Uint, + TextureFormat.R32G32Sint => Format.R32G32Sint, + TextureFormat.R8G8B8A8Unorm => Format.R8G8B8A8Unorm, + TextureFormat.R8G8B8A8Snorm => Format.R8G8B8A8Snorm, + TextureFormat.R8G8B8A8Uint => Format.R8G8B8A8Uint, + TextureFormat.R8G8B8A8Sint => Format.R8G8B8A8Sint, + TextureFormat.R16G16B16A16Float => Format.R16G16B16A16Float, + TextureFormat.R16G16B16A16Unorm => Format.R16G16B16A16Unorm, + TextureFormat.R16G16B16A16Snorm => Format.R16G16B16A16Snorm, + TextureFormat.R16G16B16A16Uint => Format.R16G16B16A16Uint, + TextureFormat.R16G16B16A16Sint => Format.R16G16B16A16Sint, + TextureFormat.R32G32B32A32Float => Format.R32G32B32A32Float, + TextureFormat.R32G32B32A32Uint => Format.R32G32B32A32Uint, + TextureFormat.R32G32B32A32Sint => Format.R32G32B32A32Sint, + TextureFormat.R10G10B10A2Unorm => Format.R10G10B10A2Unorm, + TextureFormat.R10G10B10A2Uint => Format.R10G10B10A2Uint, + TextureFormat.R11G11B10Float => Format.R11G11B10Float, + _ => 0 + }; + } + } +} diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs index e3c3a30a..6778567c 100644 --- a/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -898,19 +898,6 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> - /// Checks if the view format is compatible with this texture format. - /// In general, the formats are considered compatible if the bytes per pixel values are equal, - /// but there are more complex rules for some formats, like compressed or depth-stencil formats. - /// This follows the host API copy compatibility rules. - /// </summary> - /// <param name="info">Texture information of the texture view</param> - /// <returns>True if the formats are compatible, false otherwise</returns> - private bool ViewFormatCompatible(TextureInfo info) - { - return TextureCompatibility.FormatCompatible(Info.FormatInfo, info.FormatInfo); - } - - /// <summary> /// Gets a texture of the specified target type from this texture. /// This can be used to get an array texture from a non-array texture and vice-versa. /// If this texture and the requested targets are equal, then this texture Host texture is returned directly. diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs index 175f8863..422b66e2 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs @@ -15,6 +15,11 @@ namespace Ryujinx.Graphics.Gpu.Image public Target Target { get; } /// <summary> + /// For images, indicates the format specified on the shader. + /// </summary> + public Format Format { get; } + + /// <summary> /// Shader texture handle. /// This is an index into the texture constant buffer. /// </summary> @@ -47,11 +52,13 @@ namespace Ryujinx.Graphics.Gpu.Image /// Constructs the texture binding information structure. /// </summary> /// <param name="target">The shader sampler target type</param> + /// <param name="format">Format of the image as declared on the shader</param> /// <param name="handle">The shader texture handle (read index into the texture constant buffer)</param> /// <param name="flags">The texture's usage flags, indicating how it is used in the shader</param> - public TextureBindingInfo(Target target, int handle, TextureUsageFlags flags) + public TextureBindingInfo(Target target, Format format, int handle, TextureUsageFlags flags) { Target = target; + Format = format; Handle = handle; IsBindless = false; @@ -63,6 +70,16 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> + /// Constructs the texture binding information structure. + /// </summary> + /// <param name="target">The shader sampler target type</param> + /// <param name="handle">The shader texture handle (read index into the texture constant buffer)</param> + /// <param name="flags">The texture's usage flags, indicating how it is used in the shader</param> + public TextureBindingInfo(Target target, int handle, TextureUsageFlags flags) : this(target, (Format)0, handle, flags) + { + } + + /// <summary> /// Constructs the bindless texture binding information structure. /// </summary> /// <param name="target">The shader sampler target type</param> @@ -72,6 +89,7 @@ namespace Ryujinx.Graphics.Gpu.Image public TextureBindingInfo(Target target, int cbufSlot, int cbufOffset, TextureUsageFlags flags) { Target = target; + Format = 0; Handle = 0; IsBindless = true; diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index be78c827..e7800314 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs @@ -302,7 +302,14 @@ namespace Ryujinx.Graphics.Gpu.Image { _imageState[stageIndex][index].Texture = hostTexture; - _context.Renderer.Pipeline.SetImage(index, stage, hostTexture); + Format format = binding.Format; + + if (format == 0) + { + format = texture.Format; + } + + _context.Renderer.Pipeline.SetImage(index, stage, hostTexture, format); } } } diff --git a/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs b/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs index 6db10c96..0eaa534b 100644 --- a/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs +++ b/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs @@ -256,6 +256,7 @@ namespace Ryujinx.Graphics.Gpu.Shader Format.R8G8B8A8Snorm => TextureFormat.R8G8B8A8Snorm, Format.R8G8B8A8Uint => TextureFormat.R8G8B8A8Uint, Format.R8G8B8A8Sint => TextureFormat.R8G8B8A8Sint, + Format.R8G8B8A8Srgb => TextureFormat.R8G8B8A8Unorm, Format.R16G16B16A16Float => TextureFormat.R16G16B16A16Float, Format.R16G16B16A16Unorm => TextureFormat.R16G16B16A16Unorm, Format.R16G16B16A16Snorm => TextureFormat.R16G16B16A16Snorm, |
