summaryrefslogtreecommitdiff
path: root/source/slang/compiler.h
blob: f34be794bb0581be7bc97f3e49187862a5be8c97 (plain)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifndef RASTER_SHADER_COMPILER_H
#define RASTER_SHADER_COMPILER_H

#include "../core/basic.h"

#include "compiled-program.h"
#include "diagnostics.h"
#include "profile.h"
#include "syntax.h"
#include "type-layout.h"

#include "../../slang.h"

namespace Slang
{
    struct IncludeHandler;
    struct CompileRequest;

    enum class CompilerMode
    {
        ProduceLibrary,
        ProduceShader,
        GenerateChoice
    };

    enum class StageTarget
    {
        Unknown,
        VertexShader,
        HullShader,
        DomainShader,
        GeometryShader,
        FragmentShader,
        ComputeShader,
    };

    enum class CodeGenTarget
    {
        Unknown             = SLANG_TARGET_UNKNOWN,
        GLSL                = SLANG_GLSL,
        GLSL_Vulkan         = SLANG_GLSL_VULKAN,
        GLSL_Vulkan_OneDesc = SLANG_GLSL_VULKAN_ONE_DESC,
        HLSL                = SLANG_HLSL,
        SPIRV               = SLANG_SPIRV,
        SPIRVAssembly       = SLANG_SPIRV_ASM,
        DXBytecode          = SLANG_DXBC,
        DXBytecodeAssembly  = SLANG_DXBC_ASM,
        ReflectionJSON      = SLANG_REFLECTION_JSON,
    };

    // Describes an entry point that we've been requested to compile
    struct EntryPointOption
    {
        String name;
        Profile profile;
    };

    enum class PassThroughMode : SlangPassThrough
    {
        None = SLANG_PASS_THROUGH_NONE,	// don't pass through: use Slang compiler
        HLSL = SLANG_PASS_THROUGH_FXC,	// pass through HLSL to `D3DCompile` API
//			GLSL,	// pass through GLSL to `glslang` library
    };

    // Represents a single source file (either an on-disk file, or a
    // "virtual" file passed in as a string)
    class SourceFile : public RefObject
    {
    public:
        // The file path for a real file, or the nominal path for a virtual file
        String path;

        // The actual contents of the file
        String content;
    };

    // Options for a single translation unit being requested by the user
    class TranslationUnitOptions
    {
    public:
        SourceLanguage sourceLanguage = SourceLanguage::Unknown;

        // All entry points we've been asked to compile for this translation unit
        List<EntryPointOption> entryPoints;

        // The source file(s) that will be compiled to form this translation unit
        List<RefPtr<SourceFile> > sourceFiles;

        // Preprocessor definitions to use for this translation unit only
        // (whereas the ones on `CompileOptions` will be shared)
        Dictionary<String, String> preprocessorDefinitions;
    };

    class CompileOptions
    {
    public:
        // What target language are we compiling to?
        CodeGenTarget Target = CodeGenTarget::Unknown;

        // Directories to search for `#include` files or `import`ed modules
        List<String> SearchDirectories;

        // Definitions to provide during preprocessing
        Dictionary<String, String> preprocessorDefinitions;

        // Translation units we are being asked to compile
        List<TranslationUnitOptions> translationUnits;

        // The code generation profile we've been asked to use.
        Profile profile;

        // Should we just pass the input to another compiler?
        PassThroughMode passThrough = PassThroughMode::None;

        // Flags supplied through the API
        SlangCompileFlags flags = 0;
    };

    // This is the representation of a given translation unit
    class CompileUnit
    {
    public:
        TranslationUnitOptions      options;
        RefPtr<ProgramSyntaxNode>   SyntaxNode;
    };

    // TODO: pick an appropriate name for this...
    class CollectionOfTranslationUnits : public RefObject
    {
    public:
        List<CompileUnit> translationUnits;

        // TODO: this is more output-oriented, but maybe okay to have here...
        RefPtr<ProgramLayout> layout;
    };

    // Context information for code generation
    struct ExtraContext
    {
        CompileOptions const* options = nullptr;
        TranslationUnitOptions const* translationUnitOptions = nullptr;

        CompileResult* compileResult = nullptr;

        RefPtr<ProgramSyntaxNode>   programSyntax;
        ProgramLayout*              programLayout;

        String sourceText;
        String sourcePath;

        CompileOptions const& getOptions() { return *options; }
        TranslationUnitOptions const& getTranslationUnitOptions() { return *translationUnitOptions; }
    };

    TranslationUnitResult passThrough(
        String const&			sourceText,
        String const&			sourcePath,
        const CompileOptions &	options,
        TranslationUnitOptions const& translationUnitOptions);

    void generateOutput(
        ExtraContext&                   context,
        CollectionOfTranslationUnits*   collectionOfTranslationUnits);
}

#endif