From 97a21332071aceeef6f5035178a3523177570448 Mon Sep 17 00:00:00 2001 From: Mary Date: Sun, 18 Jul 2021 12:49:39 +0200 Subject: shadertools: Prepare for new target Languages and APIs (#2465) * shadertools: Prepare for new target Langugaes and APIs This improves shader tools command line by adding support for target language and api. * Address gdkchan's comments --- Ryujinx.ShaderTools/Program.cs | 69 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 13 deletions(-) (limited to 'Ryujinx.ShaderTools/Program.cs') diff --git a/Ryujinx.ShaderTools/Program.cs b/Ryujinx.ShaderTools/Program.cs index 17c242a9..fba0b3ad 100644 --- a/Ryujinx.ShaderTools/Program.cs +++ b/Ryujinx.ShaderTools/Program.cs @@ -1,4 +1,5 @@ -using Ryujinx.Graphics.Shader; +using CommandLine; +using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader.Translation; using System; using System.IO; @@ -23,28 +24,70 @@ namespace Ryujinx.ShaderTools } } - static void Main(string[] args) + private class Options { - if (args.Length == 1 || args.Length == 2) + [Option("compute", Required = false, Default = false, HelpText = "Indicate that the shader is a compute shader.")] + public bool Compute { get; set; } + + [Option("target-language", Required = false, Default = TargetLanguage.Glsl, HelpText = "Indicate the target shader language to use.")] + public TargetLanguage TargetLanguage { get; set; } + + [Option("target-api", Required = false, Default = TargetApi.OpenGL, HelpText = "Indicate the target graphics api to use.")] + public TargetApi TargetApi { get; set; } + + [Value(0, MetaName = "input", HelpText = "Binary Maxwell shader input path.", Required = true)] + public string InputPath { get; set; } + + [Value(1, MetaName = "output", HelpText = "Decompiled shader output path.", Required = false)] + public string OutputPath { get; set; } + } + + static void HandleArguments(Options options) + { + TranslationFlags flags = TranslationFlags.DebugMode; + + if (options.Compute) { - TranslationFlags flags = TranslationFlags.DebugMode; + flags |= TranslationFlags.Compute; + } - if (args.Length == 2 && args[0] == "--compute") - { - flags |= TranslationFlags.Compute; - } + byte[] data = File.ReadAllBytes(options.InputPath); + + TranslationOptions translationOptions = new TranslationOptions(options.TargetLanguage, options.TargetApi, flags); - byte[] data = File.ReadAllBytes(args[^1]); + ShaderProgram program = Translator.CreateContext(0, new GpuAccessor(data), translationOptions).Translate(out _); - TranslationOptions options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, flags); - string code = Translator.CreateContext(0, new GpuAccessor(data), options).Translate(out _).Code; + if (options.OutputPath == null) + { + if (program.BinaryCode != null) + { + using Stream outputStream = Console.OpenStandardOutput(); - Console.WriteLine(code); + outputStream.Write(program.BinaryCode); + } + else + { + Console.WriteLine(program.Code); + } } else { - Console.WriteLine("Usage: Ryujinx.ShaderTools [--compute] shader.bin"); + if (program.BinaryCode != null) + { + File.WriteAllBytes(options.OutputPath, program.BinaryCode); + } + else + { + File.WriteAllText(options.OutputPath, program.Code); + } } } + + static void Main(string[] args) + { + Parser.Default.ParseArguments(args) + .WithParsed(options => HandleArguments(options)) + .WithNotParsed(errors => errors.Output()); + } } } \ No newline at end of file -- cgit v1.2.3