diff --git a/shadercompiler/Program.cs b/shadercompiler/Program.cs index ae2a780..59d43fc 100644 --- a/shadercompiler/Program.cs +++ b/shadercompiler/Program.cs @@ -8,67 +8,88 @@ partial class Program { if (args.Length < 2) { - Console.WriteLine("Usage: refreshc "); + Console.WriteLine("Usage: refreshc "); return 1; } - string glslPath = args[0]; + string inputPath = args[0]; string outputDir = args[1]; - if (!ValidateArgs(glslPath, outputDir)) + if (!Directory.Exists(outputDir)) { + Console.WriteLine($"refreshc: Output directory ({outputDir}) does not exist"); return 1; } + if (Directory.Exists(inputPath)) + { + // Loop over and compile each file in the directory + string[] files = Directory.GetFiles(inputPath); + foreach (string file in files) + { + Console.WriteLine($"Compiling {file}"); + int res = CompileShader(file, outputDir); + if (res != 0) + { + return res; + } + } + } + else + { + if (!File.Exists(inputPath)) + { + Console.WriteLine($"refreshc: glsl source file or directory ({inputPath}) does not exist"); + return 1; + } + + int res = CompileShader(inputPath, outputDir); + if (res != 0) + { + return res; + } + } + + return 0; + } + + static int CompileShader(string glslPath, string outputDir) + { + int res = 0; string shaderName = Path.GetFileNameWithoutExtension(glslPath); string shaderType = Path.GetExtension(glslPath); - string spirvPath = Path.Combine(outputDir, $"{shaderName}.spv"); - if (CompileGlslToSpirv(glslPath, shaderName, spirvPath) != 0) + if (shaderType != ".vert" && shaderType != ".frag" && shaderType != ".comp") { + Console.WriteLine("refreshc: Expected glsl source file with extension '.vert', '.frag', or '.comp'"); return 1; } + string spirvPath = Path.Combine(outputDir, $"{shaderName}.spv"); + res = CompileGlslToSpirv(glslPath, shaderName, spirvPath); + if (res != 0) + { + return res; + } + string hlslPath = Path.Combine(outputDir, $"{shaderName}.hlsl"); - if (TranslateSpirvToHlsl(spirvPath, hlslPath) != 0) + res = TranslateSpirvToHlsl(spirvPath, hlslPath); + if (res != 0) { - return 1; + return res; } // FIXME: Is there a cross-platform way to compile HLSL to DXBC? #if PS5 - if (TranslateHlslToPS5(hlslPath, shaderName, shaderType, outputDir) != 0) + res = TranslateHlslToPS5(hlslPath, shaderName, shaderType, outputDir); + if (res != 0) { - return 1; + return res; } #endif - return 0; - } - - static bool ValidateArgs(string glslPath, string outputDir) - { - if (!File.Exists(glslPath)) - { - Console.WriteLine($"refreshc: glsl source file ({glslPath}) does not exist"); - return false; - } - - string ext = Path.GetExtension(glslPath); - if (ext != ".vert" && ext != ".frag" && ext != ".comp") - { - Console.WriteLine("refreshc: Expected glsl source file with extension '.vert', '.frag', or '.comp'"); - return false; - } - - if (!Directory.Exists(outputDir)) - { - Console.WriteLine($"refreshc: Output directory ({outputDir}) does not exist"); - return false; - } - - return true; + return res; } static int CompileGlslToSpirv(string glslPath, string shaderName, string outputPath)