blob: 601193b9b2310434edb26533ed403a75425dd1e1 [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.
David Neto620ee652021-04-22 10:22:30 -040068 -fauto-combined-image-sampler
69 Removes sampler variables and converts existing textures
70 to combined image-samplers.
Lei Zhang9340ae52018-09-20 11:05:50 -040071 -fentry-point=<name>
72 Specify the entry point name for HLSL compilation, for
73 all subsequent source files. Default is "main".
David Neto5fd1b252018-04-13 16:27:04 -040074 -fhlsl_functionality1, -fhlsl-functionality1
75 Enable extension SPV_GOOGLE_hlsl_functionality1 for HLSL
76 compilation.
David Netoc21dd102019-06-13 17:44:25 -040077 -finvert-y Invert position.Y output in vertex shader.
Lei Zhang9340ae52018-09-20 11:05:50 -040078 -fhlsl-iomap Use HLSL IO mappings for bindings.
79 -fhlsl-offsets Use HLSL offset rules for packing members of blocks.
80 Affects only GLSL. HLSL rules are always used for HLSL.
81 -flimit=<settings>
82 Specify resource limits. Each limit is specified by a limit
83 name followed by an integer value. Tokens should be
84 separated by whitespace. If the same limit is specified
85 several times, only the last setting takes effect.
86 -flimit-file <file>
87 Set limits as specified in the given file.
David Neto2cbf7902019-06-19 00:23:21 -040088 -fnan-clamp Generate code for max and min builtins so that, when given
89 a NaN operand, the other operand is returned. Similarly,
90 the clamp builtin will favour the non-NaN operands, as if
91 clamp were implemented as a composition of max and min.
Lei Zhang9340ae52018-09-20 11:05:50 -040092 -fresource-set-binding [stage] <reg0> <set0> <binding0>
93 [<reg1> <set1> <binding1>...]
94 Explicitly sets the descriptor set and binding for
95 HLSL resources, by register name. Optionally restrict
96 it to a single stage.
97 -fcbuffer-binding-base [stage] <value>
98 Same as -fubo-binding-base.
David Neto357d24b2017-06-04 18:27:12 -040099 -fimage-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -0800100 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -0400101 images. Optionally only set it for a single shader stage.
David Neto63313f92017-06-07 09:15:34 -0700102 For HLSL, the resource register number is added to this
103 base.
David Neto357d24b2017-06-04 18:27:12 -0400104 -fsampler-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -0800105 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -0400106 samplers Optionally only set it for a single shader stage.
David Neto63313f92017-06-07 09:15:34 -0700107 For HLSL, the resource register number is added to this
108 base.
Lei Zhang9340ae52018-09-20 11:05:50 -0400109 -fssbo-binding-base [stage] <value>
110 Sets the lowest automatically assigned binding number for
111 shader storage buffer objects (SSBO). Optionally only set
112 it for a single shader stage. Only affects GLSL.
113 -ftexture-binding-base [stage] <value>
114 Sets the lowest automatically assigned binding number for
115 textures. Optionally only set it for a single shader stage.
116 For HLSL, the resource register number is added to this
117 base.
118 -fuav-binding-base [stage] <value>
119 For automatically assigned bindings for unordered access
120 views (UAV), the register number is added to this base to
121 determine the binding number. Optionally only set it for
122 a single shader stage. Only affects HLSL.
David Neto357d24b2017-06-04 18:27:12 -0400123 -fubo-binding-base [stage] <value>
David Netoa2900672017-01-28 13:03:24 -0800124 Sets the lowest automatically assigned binding number for
David Neto357d24b2017-06-04 18:27:12 -0400125 uniform buffer objects (UBO). Optionally only set it for
126 a single shader stage.
David Neto63313f92017-06-07 09:15:34 -0700127 For HLSL, the resource register number is added to this
128 base.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400129 -fshader-stage=<stage>
130 Treat subsequent input files as having stage <stage>.
David Neto357d24b2017-06-04 18:27:12 -0400131 Valid stages are vertex, vert, fragment, frag, tesscontrol,
132 tesc, tesseval, tese, geometry, geom, compute, and comp.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400133 -g Generate source-level debug information.
134 Currently this option has no effect.
David Neto9eb2d252020-07-06 10:04:25 -0700135 -h Display available options.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400136 --help Display available options.
137 -I <value> Add directory to include search path.
qiningb3cfde42016-05-14 01:43:31 -0400138 -mfmt=<format> Output SPIR-V binary code using the selected format. This
139 option may be specified only when the compilation output is
David Netoba92b112020-07-22 08:54:14 -0700140 in SPIR-V binary code form. Available options are:
141 bin - SPIR-V binary words. This is the default.
142 c - Binary words as C initializer list of 32-bit ints
143 num - List of comma-separated 32-bit hex integers
qiningbde33a92016-02-01 14:30:07 -0500144 -M Generate make dependencies. Implies -E and -w.
145 -MM An alias for -M.
146 -MD Generate make dependencies and compile.
147 -MF <file> Write dependency output to the given file.
148 -MT <target> Specify the target of the rule emitted by dependency
149 generation.
Lei Zhang9340ae52018-09-20 11:05:50 -0400150 -O Optimize the generated SPIR-V code for better performance.
151 -Os Optimize the generated SPIR-V code for smaller size.
152 -O0 Disable optimization.
153 -o <file> Write output to <file>.
154 A file name of '-' represents standard output.
155 -std=<value> Version and profile for GLSL input files. Possible values
156 are concatenations of version and profile, e.g. 310es,
157 450core, etc. Ignored for HLSL files.
David Neto9f95ca92020-01-30 09:19:24 -0500158 -S Emit SPIR-V assembly instead of binary.
Lei Zhang9340ae52018-09-20 11:05:50 -0400159 --show-limits Display available limit names and their default values.
qiningf6d83742016-01-28 16:05:11 -0500160 --target-env=<environment>
David Netoc9931582018-03-22 07:32:14 -0700161 Set the target client environment, and the semantics
162 of warnings and errors. An optional suffix can specify
163 the client version. Values are:
164 vulkan1.0 # The default
165 vulkan1.1
David Netocdac1242020-01-15 12:51:13 -0800166 vulkan1.2
David Netoc9931582018-03-22 07:32:14 -0700167 vulkan # Same as vulkan1.0
168 opengl4.5
169 opengl # Same as opengl4.5
David Neto23bbb322019-07-02 10:17:31 -0400170 --target-spv=<spirv-version>
171 Set the SPIR-V version to be used for the generated SPIR-V
172 module. The default is the highest version of SPIR-V
173 required to be supported for the target environment.
174 For example, default for vulkan1.0 is spv1.0, and
David Netocdac1242020-01-15 12:51:13 -0800175 the default for vulkan1.1 is spv1.3,
176 the default for vulkan1.2 is spv1.5.
David Neto23bbb322019-07-02 10:17:31 -0400177 Values are:
David Neto0d8908a2019-10-04 15:31:15 -0400178 spv1.0, spv1.1, spv1.2, spv1.3, spv1.4, spv1.5
Lei Zhang9340ae52018-09-20 11:05:50 -0400179 --version Display compiler version information.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400180 -w Suppresses all warning messages.
181 -Werror Treat all warnings as errors.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400182 -x <language> Treat subsequent input files as having type <language>.
David Netocdefe182016-10-21 01:12:53 -0400183 Valid languages are: glsl, hlsl.
184 For files ending in .hlsl the default is hlsl.
185 Otherwise the default is glsl.
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400186'''
187
188 expected_stderr = ''
189
190
191@inside_glslc_testsuite('Parameters')
192class HelpIsNotTooWide(expect.StdoutNoWiderThan80Columns):
193 """Tests that --help output is not too wide."""
194
195 glslc_args = ['--help']
196
197
198@inside_glslc_testsuite('Parameters')
199class UnknownSingleLetterArgument(expect.ErrorMessage):
200 """Tests that an unknown argument triggers an error message."""
201
202 glslc_args = ['-a']
203 expected_error = ["glslc: error: unknown argument: '-a'\n"]
204
205
206@inside_glslc_testsuite('Parameters')
207class UnknownMultiLetterArgument(expect.ErrorMessage):
208 """Tests that an unknown argument triggers an error message."""
209
210 glslc_args = ['-zzz']
211 expected_error = ["glslc: error: unknown argument: '-zzz'\n"]
212
213
214@inside_glslc_testsuite('Parameters')
215class UnsupportedOption(expect.ErrorMessage):
216 """Tests that an unsupported option triggers an error message."""
217
218 glslc_args = ['--unsupported-option']
219 expected_error = [
220 "glslc: error: unsupported option: '--unsupported-option'\n"]
221
222
223@inside_glslc_testsuite('File')
224class FileNotFound(expect.ErrorMessage):
225 """Tests the error message if a file cannot be found."""
226
227 blabla_file = TempFileName('blabla.frag')
228 glslc_args = [blabla_file]
229 expected_error = [
230 "glslc: error: cannot open input file: '", blabla_file,
231 "': No such file or directory\n"]
232
233
234@inside_glslc_testsuite('Unsupported')
235class LinkingNotSupported(expect.ErrorMessage):
236 """Tests the error message generated by linking not supported yet."""
237
David Netofab64112016-02-02 16:24:06 -0500238 shader1 = FileShader('#version 140\nvoid main() {}', '.vert')
239 shader2 = FileShader('#version 140\nvoid main() {}', '.frag')
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400240 glslc_args = [shader1, shader2]
241 expected_error = [
242 'glslc: error: linking multiple files is not supported yet. ',
243 'Use -c to compile files individually.\n']
244
245
246@inside_glslc_testsuite('Unsupported')
247class MultipleStdinUnsupported(expect.ErrorMessage):
248 """Tests the error message generated by having more than one - input."""
249
250 glslc_args = ['-c', '-fshader-stage=vertex', '-', '-']
251 expected_error = [
252 'glslc: error: specifying standard input "-" as input more'
253 ' than once is not allowed.\n']
254
255
256@inside_glslc_testsuite('Parameters')
257class StdinWithoutShaderStage(expect.StdoutMatch, expect.StderrMatch):
258 """Tests that you must use -fshader-stage when specifying - as input."""
259 shader = StdinShader(
David Netofab64112016-02-02 16:24:06 -0500260 """#version 140
Andrew Woloszyne549e7b2015-07-16 11:07:40 -0400261 int a() {
262 }
263 void main() {
264 int x = a();
265 }
266 """)
267 glslc_args = [shader]
268
269 expected_stdout = ''
270 expected_stderr = [
271 "glslc: error: '-': -fshader-stage required when input is from "
272 'standard input "-"\n']
David Neto2df47b52016-11-12 13:55:21 -0800273
274
275@inside_glslc_testsuite('Parameters')
276class LimitsHelp(expect.StdoutMatch, expect.StderrMatch):
277 """Tests --show-limits shows correct output."""
278
279 glslc_args = ['--show-limits']
280
281 expected_stderr = ''
282 expected_stdout = """MaxLights 8
283MaxClipPlanes 6
284MaxTextureUnits 2
285MaxTextureCoords 8
286MaxVertexAttribs 16
287MaxVertexUniformComponents 4096
288MaxVaryingFloats 60
289MaxVertexTextureImageUnits 16
290MaxCombinedTextureImageUnits 80
291MaxTextureImageUnits 16
292MaxFragmentUniformComponents 1024
David Netoef03acd2017-06-30 10:30:17 -0400293MaxDrawBuffers 8
David Neto2df47b52016-11-12 13:55:21 -0800294MaxVertexUniformVectors 256
295MaxVaryingVectors 15
296MaxFragmentUniformVectors 256
297MaxVertexOutputVectors 16
298MaxFragmentInputVectors 15
299MinProgramTexelOffset -8
300MaxProgramTexelOffset 7
301MaxClipDistances 8
302MaxComputeWorkGroupCountX 65535
303MaxComputeWorkGroupCountY 65535
304MaxComputeWorkGroupCountZ 65535
305MaxComputeWorkGroupSizeX 1024
306MaxComputeWorkGroupSizeY 1024
307MaxComputeWorkGroupSizeZ 64
308MaxComputeUniformComponents 512
309MaxComputeTextureImageUnits 16
310MaxComputeImageUniforms 8
311MaxComputeAtomicCounters 8
312MaxComputeAtomicCounterBuffers 1
313MaxVaryingComponents 60
314MaxVertexOutputComponents 64
315MaxGeometryInputComponents 64
316MaxGeometryOutputComponents 128
317MaxFragmentInputComponents 128
318MaxImageUnits 8
319MaxCombinedImageUnitsAndFragmentOutputs 8
320MaxCombinedShaderOutputResources 8
321MaxImageSamples 0
322MaxVertexImageUniforms 0
323MaxTessControlImageUniforms 0
324MaxTessEvaluationImageUniforms 0
325MaxGeometryImageUniforms 0
326MaxFragmentImageUniforms 8
327MaxCombinedImageUniforms 8
328MaxGeometryTextureImageUnits 16
329MaxGeometryOutputVertices 256
330MaxGeometryTotalOutputComponents 1024
331MaxGeometryUniformComponents 512
332MaxGeometryVaryingComponents 60
333MaxTessControlInputComponents 128
334MaxTessControlOutputComponents 128
335MaxTessControlTextureImageUnits 16
336MaxTessControlUniformComponents 1024
337MaxTessControlTotalOutputComponents 4096
338MaxTessEvaluationInputComponents 128
339MaxTessEvaluationOutputComponents 128
340MaxTessEvaluationTextureImageUnits 16
341MaxTessEvaluationUniformComponents 1024
342MaxTessPatchComponents 120
343MaxPatchVertices 32
344MaxTessGenLevel 64
345MaxViewports 16
346MaxVertexAtomicCounters 0
347MaxTessControlAtomicCounters 0
348MaxTessEvaluationAtomicCounters 0
349MaxGeometryAtomicCounters 0
350MaxFragmentAtomicCounters 8
351MaxCombinedAtomicCounters 8
352MaxAtomicCounterBindings 1
353MaxVertexAtomicCounterBuffers 0
354MaxTessControlAtomicCounterBuffers 0
355MaxTessEvaluationAtomicCounterBuffers 0
356MaxGeometryAtomicCounterBuffers 0
357MaxFragmentAtomicCounterBuffers 0
358MaxCombinedAtomicCounterBuffers 1
359MaxAtomicCounterBufferSize 32
360MaxTransformFeedbackBuffers 4
361MaxTransformFeedbackInterleavedComponents 64
362MaxCullDistances 8
363MaxCombinedClipAndCullDistances 8
364MaxSamples 4
365"""