Coverage Report

Created: 2025-08-29 07:31

/src/shaderc/glslc/src/file_compiler.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2015 The Shaderc Authors. All rights reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef GLSLC_FILE_COMPILER_H
16
#define GLSLC_FILE_COMPILER_H
17
18
#include <string>
19
20
#include "libshaderc_util/file_finder.h"
21
#include "libshaderc_util/string_piece.h"
22
#include "shaderc/shaderc.hpp"
23
24
#include "dependency_info.h"
25
26
namespace glslc {
27
28
// Describes an input file to be compiled.
29
struct InputFileSpec {
30
  std::string name;
31
  shaderc_shader_kind stage;
32
  shaderc_source_language language;
33
  std::string entry_point_name;
34
};
35
36
// Context for managing compilation of source GLSL files into destination
37
// SPIR-V files or preprocessed output.
38
class FileCompiler {
39
 public:
40
  enum class SpirvBinaryEmissionFormat {
41
    Unspecified,  // No binary output format specified, this is the only valid
42
                  // option when the compilation output is not in SPIR-V binary
43
                  // code form.
44
    Binary,       // Emits SPIR-V binary code directly.
45
    Numbers,      // Emits SPIR-V binary code as a list of hex numbers.
46
    CInitList,    // Emits SPIR-V binary code as a C-style initializer list
47
                  // of hex numbers.
48
    WGSL,         // Emits SPIR-V module converted to WGSL source text.
49
                  // Requires a build with Tint support.
50
  };
51
52
  FileCompiler()
53
6.41k
      : output_type_(OutputType::SpirvBinary),
54
6.41k
        binary_emission_format_(SpirvBinaryEmissionFormat::Unspecified),
55
6.41k
        needs_linking_(true),
56
6.41k
        total_warnings_(0),
57
6.41k
        total_errors_(0) {}
58
59
  // Compiles a shader received as specified by input_file, returning true
60
  // on success and false otherwise. If force_shader_stage is not
61
  // shaderc_glsl_infer_source or any default shader stage then the given
62
  // shader_stage will be used, otherwise it will be determined from the source
63
  // or the file type.
64
  //
65
  // Places the compilation output into a new file whose name is derived from
66
  // input_file according to the rules from glslc/README.asciidoc.
67
  //
68
  // If version/profile has been forced, the shader's version/profile is set to
69
  // that value regardless of the #version directive in the source code.
70
  //
71
  // Any errors/warnings found in the shader source will be output to std::cerr
72
  // and increment the counts reported by OutputMessages().
73
  bool CompileShaderFile(const InputFileSpec& input_file);
74
75
  // Adds a directory to be searched when processing #include directives.
76
  //
77
  // Best practice: if you add an empty string before any other path, that will
78
  // correctly resolve both absolute paths and paths relative to the current
79
  // working directory.
80
  void AddIncludeDirectory(const std::string& path);
81
82
  // Sets the output filename. A name of "-" indicates standard output.
83
6.41k
  void SetOutputFileName(const shaderc_util::string_piece& file) {
84
6.41k
    output_file_name_ = file;
85
6.41k
  }
86
87
  // Sets the format for SPIR-V binary compilation output.
88
6.41k
  void SetSpirvBinaryOutputFormat(SpirvBinaryEmissionFormat format) {
89
6.41k
    binary_emission_format_ = format;
90
6.41k
  }
91
92
  // Returns false if any options are incompatible. The num_files parameter
93
  // represents the number of files that will be compiled.
94
  bool ValidateOptions(size_t num_files);
95
96
  // Outputs to std::cerr the number of warnings and errors if there are any.
97
  void OutputMessages();
98
99
  // Sets the flag to indicate individual compilation mode. In this mode, all
100
  // files are compiled individually and written to separate output files
101
  // instead of linked together. This method also disables linking and sets the
102
  // output file extension to ".spv". Disassembly mode and preprocessing only
103
  // mode override this mode and flags.
104
  void SetIndividualCompilationFlag();
105
106
  // Sets the flag to indicate disassembly mode. In this mode, the compiler
107
  // emits disassembled textual output, instead of outputting object files.
108
  // This method also sets the output file extension to ".spvasm" and disables
109
  // linking. This mode overrides individual compilation mode, and preprocessing
110
  // only mode overrides this mode.
111
  void SetDisassemblyFlag();
112
113
  // Sets the flag to indicate preprocessing only mode. In this mode, instead of
114
  // outputting object files, the compiler emits the preprocessed source files.
115
  // This method disables linking and sets the output file to stdout. This mode
116
  // overrides disassembly mode and individual compilation mode.
117
  void SetPreprocessingOnlyFlag();
118
119
  // Gets the reference of the compiler options which reflects the command-line
120
  // arguments.
121
6.41k
  shaderc::CompileOptions& options() { return options_; }
122
123
  // Gets a pointer which points to the dependency info dumping hander. Creates
124
  // such a handler if such one does not exist.
125
0
  DependencyInfoDumpingHandler* GetDependencyDumpingHandler() {
126
0
    if (!dependency_info_dumping_handler_) {
127
0
      dependency_info_dumping_handler_.reset(
128
0
          new DependencyInfoDumpingHandler());
129
0
    }
130
0
    return dependency_info_dumping_handler_.get();
131
0
  }
132
133
 private:
134
  enum class OutputType {
135
    SpirvBinary,  // A binary module, as defined by the SPIR-V specification.
136
    SpirvAssemblyText,  // Assembly syntax defined by the SPIRV-Tools project.
137
    PreprocessedText,   // Preprocessed source code.
138
  };
139
140
  // Emits the compilation output from the given result to the given output
141
  // file and returns true if the result represents a successful compilation
142
  // step.  Otherwise returns false, possibly emits messages to the standard
143
  // error stream, and does not produce an output file.  Accumulates error
144
  // and warning counts for use by the OutputMessages() method.
145
  template <typename CompilationResultType>
146
  bool EmitCompiledResult(
147
      const CompilationResultType& result, const std::string& input_file_name,
148
      const std::string& output_file_name,
149
      shaderc_util::string_piece error_file_name,
150
      const std::unordered_set<std::string>& used_source_files);
151
152
  // Returns the final file name to be used for the output file.
153
  //
154
  // If an output file name is specified by the SetOutputFileName(), use that
155
  // argument as the final output file name.
156
  //
157
  // If the user did not specify an output filename:
158
  //  If linking is not required, and the input filename has a
159
  //  standard stage extension (e.g. .vert) then returns the input filename
160
  //  without directory names but with the result extenstion (e.g. .spv or
161
  //  .spvasm) appended.
162
  //
163
  //  If linking is not required, and the input file name does not have a
164
  //  standard stage extension, then also returns the directory-stripped input
165
  //  filename, but replaces its extension with the result extension. (If the
166
  //  resolved input filename does not have an extension, then appends the
167
  //  result extension.)
168
  //
169
  //  If linking is required and output filename is not specified, returns
170
  //  "a.spv".
171
  std::string GetOutputFileName(std::string input_filename);
172
173
  // Returns the candidate output file name deduced from input file name and
174
  // user specified output file name. It is computed as follows:
175
  //
176
  // If the user did specify an output filename and the compiler is not in
177
  // preprocessing-only mode, then returns that file name.
178
  //
179
  // If the user did not specify an output filename:
180
  //  If the input filename has a standard stage extension (e.g. .vert) then
181
  //  returns the input filename without directory names but with the result
182
  //  extenstion (e.g. .spv or .spvasm) appended.
183
  //
184
  //  If the input file name does not have a standard stage extension, then also
185
  //  returns the directory-stripped input filename, but replaces its extension
186
  //  with the result extension. (If the resolved input filename does not have
187
  //  an extension, then appends the result extension.)
188
  //
189
  //  When a resolved extension is not available because the compiler is in
190
  //  preprocessing-only mode or the compilation requires linking, use .spv as
191
  //  the extension.
192
  std::string GetCandidateOutputFileName(std::string input_filename);
193
194
  // Returns true if the compiler's output is preprocessed text.
195
6.41k
  bool PreprocessingOnly() {
196
6.41k
    return output_type_ == OutputType::PreprocessedText;
197
6.41k
  }
198
199
  // Performs actual SPIR-V compilation on the contents of input files.
200
  shaderc::Compiler compiler_;
201
202
  // Reflects the command-line arguments and goes into
203
  // compiler_.CompileGlslToSpv().
204
  shaderc::CompileOptions options_;
205
206
  // What kind of output will be produced?
207
  OutputType output_type_;
208
209
  // The Flag to indicate to which format the output SPIR-V binary code should
210
  // be emitted.
211
  SpirvBinaryEmissionFormat binary_emission_format_;
212
213
  // A FileFinder used to substitute #include directives in the source code.
214
  shaderc_util::FileFinder include_file_finder_;
215
216
  // Indicates whether linking is needed to generate the final output.
217
  bool needs_linking_;
218
219
  // The ownership of dependency dumping handler.
220
  std::unique_ptr<DependencyInfoDumpingHandler>
221
      dependency_info_dumping_handler_ = nullptr;
222
223
  // Reflects the type of file being generated.
224
  std::string file_extension_;
225
  // Name of the file where the compilation output will go.
226
  shaderc_util::string_piece output_file_name_;
227
228
  // Counts warnings encountered in all compilations via this object.
229
  size_t total_warnings_;
230
  // Counts errors encountered in all compilations via this object.
231
  size_t total_errors_;
232
};
233
}  // namespace glslc
234
#endif  // GLSLC_FILE_COMPILER_H