public static int Main(string[] args)
{
ShaderData sd = new ShaderData ();
bool dump = false, trace = false, interpreter = false, help = false;
OptionSet opts = new OptionSet () {
{ "d|dump", "Decompile the shader to stdout.", v => dump = true },
{ "t|trace", "Enable tracing of execution (best used with --interpreter).", v => trace = true },
{ "i|interpreter", "Use the interpreter instead of the JIT.", v => interpreter = true },
{ "h|help", "Show this message and exit.", v => help = true },
{ "c:", "Set the value of a constant register", (k, v) => sd.SetConstant (int.Parse (k), float.Parse (v)) }
};
List<string> extra;
try {
extra = opts.Parse (args);
} catch (OptionException e) {
Console.WriteLine ("{0}\nTry 'shader --help' for more information.", e.Message);
return 1;
}
if (extra.Count != 3)
help = true;
if (help) {
Console.WriteLine ("Usage: shader [options] shader input-image output-image");
Console.WriteLine ("Apply the given shader to input-image and save it to output-image");
opts.WriteOptionDescriptions (Console.Out);
return 2;
}
if (trace)
TracingConfig.Enable ();
Parser parser = new Parser (extra [0]);
var insList = parser.Parse ();
if (dump) {
foreach (var i in insList)
Console.WriteLine (i);
return 0;
}
var srcImg = new CairoImageSurface (extra [1]);
var dstImg = srcImg.CreateSimilar ();
Texture intex = new CairoTexture (srcImg);
Texture outtex = new CairoTexture (dstImg);
sd.SetSampler (0, new Sampler (intex));
sd.SetOutputTexture (0, outtex);
if (interpreter) {
Interpreter interp = new Interpreter (insList);
interp.Run (sd);
} else {
CodeGenContext ctx = new CodeGenContext (insList);
CompiledShader shader = ctx.Compile ();
shader (sd);
}
dstImg.SaveToPng (extra [2]);
return 0;
}