blob: aeea75393cefc27eea3ade850fae19b2a9543d27 [file] [log] [blame]
Andrew Woloszyne549e7b2015-07-16 11:07:40 -04001# 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
15import expect
16import os.path
17from glslc_test_framework import inside_glslc_testsuite
18from placeholder import FileShader, StdinShader, TempFileName
19
20
21@inside_glslc_testsuite('File')
22class SimpleFileCompiled(expect.ValidObjectFile):
23 """Tests whether or not a simple glsl file compiles."""
24
25 shader = FileShader('#version 310 es\nvoid main() {}', '.frag')
26 glslc_args = ['-c', shader]
27
28
29@inside_glslc_testsuite('File')
30class NotSpecifyingOutputName(expect.SuccessfulReturn,
31 expect.CorrectObjectFilePreamble):
32 """Tests that when there is no -o and -E/-S/-c specified, output as a.spv."""
33
David Netofab64112016-02-02 16:24:06 -050034 shader = FileShader('#version 140\nvoid main() {}', '.frag')
Andrew Woloszyne549e7b2015-07-16 11:07:40 -040035 glslc_args = [shader]
36
37 def check_output_a_spv(self, status):
38 output_name = os.path.join(status.directory, 'a.spv')
39 return self.verify_object_file_preamble(output_name)
40
41
42@inside_glslc_testsuite('Parameters')
43class HelpParameters(
44 expect.ReturnCodeIsZero, expect.StdoutMatch, expect.StderrMatch):
45 """Tests the --help flag outputs correctly and does not produce and error."""
46
47 glslc_args = ['--help']
48
David Neto91bfb4c2016-02-23 22:26:18 -050049 expected_stdout = '''glslc - Compile shaders into SPIR-V
50
51Usage: glslc [options] file...
Andrew Woloszyne549e7b2015-07-16 11:07:40 -040052
53An input file of - represents standard input.
54
55Options:
56 -c Only run preprocess, compile, and assemble steps.
57 -Dmacro[=defn] Add an implicit macro definition.
58 -E Outputs only the results of the preprocessing step.
Lei Zhang1ccede12016-02-24 09:30:32 -050059 Output defaults to standard output.
David Neto7ae44a12017-01-23 17:24:33 -050060 -fauto-bind-uniforms
61 Automatically assign bindings to uniform variables that
62 don't have an explicit 'binding' layout in the shader
63 source.
Benjamin Chrétiend1f763c2018-02-09 18:08:58 +010064 -fauto-map-locations
65 Automatically assign locations to uniform variables that
66 don't have an explicit 'location' layout in the shader
67 source.
Lei Zhang9340ae52018-09-20 11:05:50 -040068 -fentry-point=<name>
69 Specify the entry point name for HLSL compilation, for
70 all subsequent source files. Default is "main".
David Neto5fd1b252018-04-13 16:27:04 -040071 -fhlsl_functionality1, -fhlsl-functionality1
72 Enable extension SPV_GOOGLE_hlsl_functionality1 for HLSL
73 compilation.
David Netoc21dd102019-06-13 17:44:25 -040074 -finvert-y Invert position.Y output in vertex shader.
Lei Zhang9340ae52018-09-20 11:05:50 -040075 -fhlsl-iomap Use HLSL IO mappings for bindings.
76 -fhlsl-offsets Use HLSL offset rules for packing members of blocks.
77 Affects only GLSL. HLSL rules are always used for HLSL.
78 -flimit=<settings>
79 Specify resource limits. Each limit is specified by a limit
80 name followed by an integer value. Tokens should be
81 separated by whitespace. If the same limit is specified
82 several times, only the last setting takes effect.
83 -flimit-file <file>
84 Set limits as specified in the given file.
David Neto2cbf7902019-06-19 00:23:21 -040085 -fnan-clamp Generate code for max and min builtins so that, when given
86 a NaN operand, the other operand is returned. Similarly,
87 the clamp builtin will favour the non-NaN operands, as if
88 clamp were implemented as a composition of max and min.
Lei Zhang9340ae52018-09-20 11:05:50 -040089 -fresource-set-binding [stage] <reg0> <set0> <binding0>
90 [<reg1> <set1> <binding1>...]
91 Explicitly sets the descriptor set and binding for
92 HLSL resources, by register name. Optionally restrict
93 it to a single stage.
94 -fcbuffer-binding-base [stage] <value>
95 Same as -fubo-binding-base.
David Neto357d24b2017-06-04 18:27:12 -040096 -fimage-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -080097 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -040098 images. Optionally only set it for a single shader stage.
David Neto63313f92017-06-07 09:15:34 -070099 For HLSL, the resource register number is added to this
100 base.
David Neto357d24b2017-06-04 18:27:12 -0400101 -fsampler-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -0800102 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -0400103 samplers Optionally only set it for a single shader stage.
David Neto63313f92017-06-07 09:15:34 -0700104 For HLSL, the resource register number is added to this
105 base.
Lei Zhang9340ae52018-09-20 11:05:50 -0400106 -fssbo-binding-base [stage] <value>
107 Sets the lowest automatically assigned binding number for
108 shader storage buffer objects (SSBO). Optionally only set
109 it for a single shader stage. Only affects GLSL.
110 -ftexture-binding-base [stage] <value>
111 Sets the lowest automatically assigned binding number for
112 textures. Optionally only set it for a single shader stage.
113 For HLSL, the resource register number is added to this
114 base.
115 -fuav-binding-base [stage] <value>
116 For automatically assigned bindings for unordered access
117 views (UAV), the register number is added to this base to
118 determine the binding number. Optionally only set it for
119 a single shader stage. Only affects HLSL.
David Neto357d24b2017-06-04 18:27:12 -0400120 -fubo-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -0800121 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -0400122 uniform buffer objects (UBO). Optionally only set it for
123 a single shader stage.
David Neto63313f92017-06-07 09:15:34 -0700124 For HLSL, the resource register number is added to this
125 base.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400126 -fshader-stage=<stage>
127 Treat subsequent input files as having stage <stage>.
David Neto357d24b2017-06-04 18:27:12 -0400128 Valid stages are vertex, vert, fragment, frag, tesscontrol,
129 tesc, tesseval, tese, geometry, geom, compute, and comp.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400130 -g Generate source-level debug information.
131 Currently this option has no effect.
David Neto9eb2d252020-07-06 10:04:25 -0700132 -h Display available options.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400133 --help Display available options.
134 -I <value> Add directory to include search path.
qiningb3cfde42016-05-14 01:43:31 -0400135 -mfmt=<format> Output SPIR-V binary code using the selected format. This
136 option may be specified only when the compilation output is
137 in SPIR-V binary code form. Available options include bin, c
138 and num. By default the binary output format is bin.
qiningbde33a92016-02-01 14:30:07 -0500139 -M Generate make dependencies. Implies -E and -w.
140 -MM An alias for -M.
141 -MD Generate make dependencies and compile.
142 -MF <file> Write dependency output to the given file.
143 -MT <target> Specify the target of the rule emitted by dependency
144 generation.
Lei Zhang9340ae52018-09-20 11:05:50 -0400145 -O Optimize the generated SPIR-V code for better performance.
146 -Os Optimize the generated SPIR-V code for smaller size.
147 -O0 Disable optimization.
148 -o <file> Write output to <file>.
149 A file name of '-' represents standard output.
150 -std=<value> Version and profile for GLSL input files. Possible values
151 are concatenations of version and profile, e.g. 310es,
152 450core, etc. Ignored for HLSL files.
David Neto9f95ca92020-01-30 09:19:24 -0500153 -S Emit SPIR-V assembly instead of binary.
Lei Zhang9340ae52018-09-20 11:05:50 -0400154 --show-limits Display available limit names and their default values.
qiningf6d83742016-01-28 16:05:11 -0500155 --target-env=<environment>
David Netoc9931582018-03-22 07:32:14 -0700156 Set the target client environment, and the semantics
157 of warnings and errors. An optional suffix can specify
158 the client version. Values are:
159 vulkan1.0 # The default
160 vulkan1.1
David Netocdac1242020-01-15 12:51:13 -0800161 vulkan1.2
David Netoc9931582018-03-22 07:32:14 -0700162 vulkan # Same as vulkan1.0
163 opengl4.5
164 opengl # Same as opengl4.5
David Neto23bbb322019-07-02 10:17:31 -0400165 --target-spv=<spirv-version>
166 Set the SPIR-V version to be used for the generated SPIR-V
167 module. The default is the highest version of SPIR-V
168 required to be supported for the target environment.
169 For example, default for vulkan1.0 is spv1.0, and
David Netocdac1242020-01-15 12:51:13 -0800170 the default for vulkan1.1 is spv1.3,
171 the default for vulkan1.2 is spv1.5.
David Neto23bbb322019-07-02 10:17:31 -0400172 Values are:
David Neto0d8908a2019-10-04 15:31:15 -0400173 spv1.0, spv1.1, spv1.2, spv1.3, spv1.4, spv1.5
Lei Zhang9340ae52018-09-20 11:05:50 -0400174 --version Display compiler version information.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400175 -w Suppresses all warning messages.
176 -Werror Treat all warnings as errors.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400177 -x <language> Treat subsequent input files as having type <language>.
David Netocdefe182016-10-21 01:12:53 -0400178 Valid languages are: glsl, hlsl.
179 For files ending in .hlsl the default is hlsl.
180 Otherwise the default is glsl.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400181'''
182
183 expected_stderr = ''
184
185
186@inside_glslc_testsuite('Parameters')
187class HelpIsNotTooWide(expect.StdoutNoWiderThan80Columns):
188 """Tests that --help output is not too wide."""
189
190 glslc_args = ['--help']
191
192
193@inside_glslc_testsuite('Parameters')
194class UnknownSingleLetterArgument(expect.ErrorMessage):
195 """Tests that an unknown argument triggers an error message."""
196
197 glslc_args = ['-a']
198 expected_error = ["glslc: error: unknown argument: '-a'\n"]
199
200
201@inside_glslc_testsuite('Parameters')
202class UnknownMultiLetterArgument(expect.ErrorMessage):
203 """Tests that an unknown argument triggers an error message."""
204
205 glslc_args = ['-zzz']
206 expected_error = ["glslc: error: unknown argument: '-zzz'\n"]
207
208
209@inside_glslc_testsuite('Parameters')
210class UnsupportedOption(expect.ErrorMessage):
211 """Tests that an unsupported option triggers an error message."""
212
213 glslc_args = ['--unsupported-option']
214 expected_error = [
215 "glslc: error: unsupported option: '--unsupported-option'\n"]
216
217
218@inside_glslc_testsuite('File')
219class FileNotFound(expect.ErrorMessage):
220 """Tests the error message if a file cannot be found."""
221
222 blabla_file = TempFileName('blabla.frag')
223 glslc_args = [blabla_file]
224 expected_error = [
225 "glslc: error: cannot open input file: '", blabla_file,
226 "': No such file or directory\n"]
227
228
229@inside_glslc_testsuite('Unsupported')
230class LinkingNotSupported(expect.ErrorMessage):
231 """Tests the error message generated by linking not supported yet."""
232
David Netofab64112016-02-02 16:24:06 -0500233 shader1 = FileShader('#version 140\nvoid main() {}', '.vert')
234 shader2 = FileShader('#version 140\nvoid main() {}', '.frag')
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400235 glslc_args = [shader1, shader2]
236 expected_error = [
237 'glslc: error: linking multiple files is not supported yet. ',
238 'Use -c to compile files individually.\n']
239
240
241@inside_glslc_testsuite('Unsupported')
242class MultipleStdinUnsupported(expect.ErrorMessage):
243 """Tests the error message generated by having more than one - input."""
244
245 glslc_args = ['-c', '-fshader-stage=vertex', '-', '-']
246 expected_error = [
247 'glslc: error: specifying standard input "-" as input more'
248 ' than once is not allowed.\n']
249
250
251@inside_glslc_testsuite('Parameters')
252class StdinWithoutShaderStage(expect.StdoutMatch, expect.StderrMatch):
253 """Tests that you must use -fshader-stage when specifying - as input."""
254 shader = StdinShader(
David Netofab64112016-02-02 16:24:06 -0500255 """#version 140
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400256 int a() {
257 }
258 void main() {
259 int x = a();
260 }
261 """)
262 glslc_args = [shader]
263
264 expected_stdout = ''
265 expected_stderr = [
266 "glslc: error: '-': -fshader-stage required when input is from "
267 'standard input "-"\n']
David Neto2df47b52016-11-12 13:55:21 -0800268
269
270@inside_glslc_testsuite('Parameters')
271class LimitsHelp(expect.StdoutMatch, expect.StderrMatch):
272 """Tests --show-limits shows correct output."""
273
274 glslc_args = ['--show-limits']
275
276 expected_stderr = ''
277 expected_stdout = """MaxLights 8
278MaxClipPlanes 6
279MaxTextureUnits 2
280MaxTextureCoords 8
281MaxVertexAttribs 16
282MaxVertexUniformComponents 4096
283MaxVaryingFloats 60
284MaxVertexTextureImageUnits 16
285MaxCombinedTextureImageUnits 80
286MaxTextureImageUnits 16
287MaxFragmentUniformComponents 1024
David Netoef03acd2017-06-30 10:30:17 -0400288MaxDrawBuffers 8
David Neto2df47b52016-11-12 13:55:21 -0800289MaxVertexUniformVectors 256
290MaxVaryingVectors 15
291MaxFragmentUniformVectors 256
292MaxVertexOutputVectors 16
293MaxFragmentInputVectors 15
294MinProgramTexelOffset -8
295MaxProgramTexelOffset 7
296MaxClipDistances 8
297MaxComputeWorkGroupCountX 65535
298MaxComputeWorkGroupCountY 65535
299MaxComputeWorkGroupCountZ 65535
300MaxComputeWorkGroupSizeX 1024
301MaxComputeWorkGroupSizeY 1024
302MaxComputeWorkGroupSizeZ 64
303MaxComputeUniformComponents 512
304MaxComputeTextureImageUnits 16
305MaxComputeImageUniforms 8
306MaxComputeAtomicCounters 8
307MaxComputeAtomicCounterBuffers 1
308MaxVaryingComponents 60
309MaxVertexOutputComponents 64
310MaxGeometryInputComponents 64
311MaxGeometryOutputComponents 128
312MaxFragmentInputComponents 128
313MaxImageUnits 8
314MaxCombinedImageUnitsAndFragmentOutputs 8
315MaxCombinedShaderOutputResources 8
316MaxImageSamples 0
317MaxVertexImageUniforms 0
318MaxTessControlImageUniforms 0
319MaxTessEvaluationImageUniforms 0
320MaxGeometryImageUniforms 0
321MaxFragmentImageUniforms 8
322MaxCombinedImageUniforms 8
323MaxGeometryTextureImageUnits 16
324MaxGeometryOutputVertices 256
325MaxGeometryTotalOutputComponents 1024
326MaxGeometryUniformComponents 512
327MaxGeometryVaryingComponents 60
328MaxTessControlInputComponents 128
329MaxTessControlOutputComponents 128
330MaxTessControlTextureImageUnits 16
331MaxTessControlUniformComponents 1024
332MaxTessControlTotalOutputComponents 4096
333MaxTessEvaluationInputComponents 128
334MaxTessEvaluationOutputComponents 128
335MaxTessEvaluationTextureImageUnits 16
336MaxTessEvaluationUniformComponents 1024
337MaxTessPatchComponents 120
338MaxPatchVertices 32
339MaxTessGenLevel 64
340MaxViewports 16
341MaxVertexAtomicCounters 0
342MaxTessControlAtomicCounters 0
343MaxTessEvaluationAtomicCounters 0
344MaxGeometryAtomicCounters 0
345MaxFragmentAtomicCounters 8
346MaxCombinedAtomicCounters 8
347MaxAtomicCounterBindings 1
348MaxVertexAtomicCounterBuffers 0
349MaxTessControlAtomicCounterBuffers 0
350MaxTessEvaluationAtomicCounterBuffers 0
351MaxGeometryAtomicCounterBuffers 0
352MaxFragmentAtomicCounterBuffers 0
353MaxCombinedAtomicCounterBuffers 1
354MaxAtomicCounterBufferSize 32
355MaxTransformFeedbackBuffers 4
356MaxTransformFeedbackInterleavedComponents 64
357MaxCullDistances 8
358MaxCombinedClipAndCullDistances 8
359MaxSamples 4
360"""