-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathProgram.cs
106 lines (93 loc) · 3.66 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using HlslDecompiler.DirectXShaderModel;
using HlslDecompiler.Hlsl;
using HlslDecompiler.Util;
using System;
using System.IO;
namespace HlslDecompiler
{
class Program
{
static void Main(string[] args)
{
var options = CommandLineOptions.Parse(args);
if (options.InputFilename == null)
{
Console.WriteLine("Expected input filename");
return;
}
string baseFilename = Path.GetFileNameWithoutExtension(options.InputFilename);
using (var inputStream = File.Open(options.InputFilename, FileMode.Open, FileAccess.Read))
{
var format = FormatDetector.Detect(inputStream);
switch (format)
{
case ShaderFileFormat.ShaderModel3:
ReadShaderModel(baseFilename, inputStream, options.DoAstAnalysis);
break;
case ShaderFileFormat.Rgxa:
ReadRgxa(baseFilename, inputStream, options.DoAstAnalysis);
break;
case ShaderFileFormat.Unknown:
Console.WriteLine("Unknown file format!");
break;
}
}
Console.WriteLine("Finished.");
}
private static void ReadShaderModel(string baseFilename, FileStream inputStream, bool doAstAnalysis)
{
using (var input = new ShaderReader(inputStream, true))
{
ShaderModel shader = input.ReadShader();
AsmWriter writer = new AsmWriter(shader);
string asmFilename = $"{baseFilename}.asm";
Console.WriteLine("Writing {0}", asmFilename);
writer.Write(asmFilename);
var hlslWriter = CreateHlslWriter(shader, doAstAnalysis);
string hlslFilename = $"{baseFilename}.fx";
Console.WriteLine("Writing {0}", hlslFilename);
hlslWriter.Write(hlslFilename);
}
}
private static void ReadRgxa(string baseFilename, FileStream inputStream, bool doAstAnalysis)
{
using (var input = new RgxaReader(inputStream, true))
{
int ivs = 0, ips = 0;
while (true)
{
ShaderModel shader = input.ReadShader();
if (shader == null)
{
break;
}
string outFilename;
if (shader.Type == ShaderType.Vertex)
{
outFilename = $"{baseFilename}_vs{ivs}";
ivs++;
}
else
{
outFilename = $"{baseFilename}_ps{ips}";
ips++;
}
Console.WriteLine(outFilename);
//shader.ToFile("outFilename.fxc");
var writer = new AsmWriter(shader);
writer.Write(outFilename + ".asm");
var hlslWriter = CreateHlslWriter(shader, doAstAnalysis);
hlslWriter.Write(outFilename + ".fx");
}
}
}
private static HlslWriter CreateHlslWriter(ShaderModel shader, bool doAstAnalysis)
{
if (doAstAnalysis)
{
return new HlslAstWriter(shader);
}
return new HlslSimpleWriter(shader);
}
}
}