From d125fce3e8c780c042040ac8064155cd6751d353 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 6 Jul 2021 16:20:06 -0300 Subject: Allow shader language and target API to be specified on the shader translator (#2402) --- Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs | 8 ++++---- Ryujinx.Graphics.Shader/Translation/TargetApi.cs | 8 ++++++++ Ryujinx.Graphics.Shader/Translation/TargetLanguage.cs | 8 ++++++++ .../Translation/TranslationOptions.cs | 16 ++++++++++++++++ Ryujinx.Graphics.Shader/Translation/Translator.cs | 16 ++++++++-------- 5 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 Ryujinx.Graphics.Shader/Translation/TargetApi.cs create mode 100644 Ryujinx.Graphics.Shader/Translation/TargetLanguage.cs create mode 100644 Ryujinx.Graphics.Shader/Translation/TranslationOptions.cs (limited to 'Ryujinx.Graphics.Shader/Translation') diff --git a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs index 85ac2836..b22eb5f1 100644 --- a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs +++ b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.Shader.Translation public IGpuAccessor GpuAccessor { get; } - public TranslationFlags Flags { get; } + public TranslationOptions Options { get; } public int Size { get; private set; } @@ -94,18 +94,18 @@ namespace Ryujinx.Graphics.Shader.Translation public int FirstConstantBufferBinding { get; private set; } public int FirstStorageBufferBinding { get; private set; } - public ShaderConfig(IGpuAccessor gpuAccessor, TranslationFlags flags, TranslationCounts counts) + public ShaderConfig(IGpuAccessor gpuAccessor, TranslationOptions options, TranslationCounts counts) { Stage = ShaderStage.Compute; GpuAccessor = gpuAccessor; - Flags = flags; + Options = options; _counts = counts; TextureHandlesForCache = new HashSet(); _usedTextures = new Dictionary(); _usedImages = new Dictionary(); } - public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationFlags flags, TranslationCounts counts) : this(gpuAccessor, flags, counts) + public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationOptions options, TranslationCounts counts) : this(gpuAccessor, options, counts) { Stage = header.Stage; GpPassthrough = header.Stage == ShaderStage.Geometry && header.GpPassthrough; diff --git a/Ryujinx.Graphics.Shader/Translation/TargetApi.cs b/Ryujinx.Graphics.Shader/Translation/TargetApi.cs new file mode 100644 index 00000000..6ac235a4 --- /dev/null +++ b/Ryujinx.Graphics.Shader/Translation/TargetApi.cs @@ -0,0 +1,8 @@ +namespace Ryujinx.Graphics.Shader.Translation +{ + public enum TargetApi + { + OpenGL, + Vulkan + } +} diff --git a/Ryujinx.Graphics.Shader/Translation/TargetLanguage.cs b/Ryujinx.Graphics.Shader/Translation/TargetLanguage.cs new file mode 100644 index 00000000..db839e94 --- /dev/null +++ b/Ryujinx.Graphics.Shader/Translation/TargetLanguage.cs @@ -0,0 +1,8 @@ +namespace Ryujinx.Graphics.Shader.Translation +{ + public enum TargetLanguage + { + Glsl, + Spirv + } +} diff --git a/Ryujinx.Graphics.Shader/Translation/TranslationOptions.cs b/Ryujinx.Graphics.Shader/Translation/TranslationOptions.cs new file mode 100644 index 00000000..532e9abb --- /dev/null +++ b/Ryujinx.Graphics.Shader/Translation/TranslationOptions.cs @@ -0,0 +1,16 @@ +namespace Ryujinx.Graphics.Shader.Translation +{ + public struct TranslationOptions + { + public TargetLanguage TargetLanguage { get; } + public TargetApi TargetApi { get; } + public TranslationFlags Flags { get; } + + public TranslationOptions(TargetLanguage targetLanguage, TargetApi targetApi, TranslationFlags flags) + { + TargetLanguage = targetLanguage; + TargetApi = targetApi; + Flags = flags; + } + } +} diff --git a/Ryujinx.Graphics.Shader/Translation/Translator.cs b/Ryujinx.Graphics.Shader/Translation/Translator.cs index b250d3de..0f71b599 100644 --- a/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -26,12 +26,12 @@ namespace Ryujinx.Graphics.Shader.Translation public static TranslatorContext CreateContext( ulong address, IGpuAccessor gpuAccessor, - TranslationFlags flags, + TranslationOptions options, TranslationCounts counts = null) { counts ??= new TranslationCounts(); - Block[][] cfg = DecodeShader(address, gpuAccessor, flags, counts, out ShaderConfig config); + Block[][] cfg = DecodeShader(address, gpuAccessor, options, counts, out ShaderConfig config); return new TranslatorContext(address, cfg, config); } @@ -103,7 +103,7 @@ namespace Ryujinx.Graphics.Shader.Translation private static Block[][] DecodeShader( ulong address, IGpuAccessor gpuAccessor, - TranslationFlags flags, + TranslationOptions options, TranslationCounts counts, out ShaderConfig config) { @@ -112,15 +112,15 @@ namespace Ryujinx.Graphics.Shader.Translation bool hasBindless; - if ((flags & TranslationFlags.Compute) != 0) + if ((options.Flags & TranslationFlags.Compute) != 0) { - config = new ShaderConfig(gpuAccessor, flags, counts); + config = new ShaderConfig(gpuAccessor, options, counts); cfg = Decoder.Decode(gpuAccessor, address, out hasBindless); } else { - config = new ShaderConfig(new ShaderHeader(gpuAccessor, address), gpuAccessor, flags, counts); + config = new ShaderConfig(new ShaderHeader(gpuAccessor, address), gpuAccessor, options, counts); cfg = Decoder.Decode(gpuAccessor, address + HeaderSize, out hasBindless); } @@ -154,7 +154,7 @@ namespace Ryujinx.Graphics.Shader.Translation } } - config.SizeAdd((int)maxEndAddress + (flags.HasFlag(TranslationFlags.Compute) ? 0 : HeaderSize)); + config.SizeAdd((int)maxEndAddress + (options.Flags.HasFlag(TranslationFlags.Compute) ? 0 : HeaderSize)); return cfg; } @@ -197,7 +197,7 @@ namespace Ryujinx.Graphics.Shader.Translation { OpCode op = block.OpCodes[opIndex]; - if ((context.Config.Flags & TranslationFlags.DebugMode) != 0) + if ((context.Config.Options.Flags & TranslationFlags.DebugMode) != 0) { string instName; -- cgit v1.2.3