1# Copyright 2017 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
16from glslc_test_framework import inside_glslc_testsuite
17from placeholder import FileShader
18
19# A GLSL shader with uniforms without explicit bindings.
20GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS = """#version 450
21  #extension GL_ARB_sparse_texture2 : enable
22  uniform texture2D my_tex;
23  uniform sampler my_sam;
24  layout(rgba32f) uniform image2D my_img;
25  layout(rgba32f) uniform imageBuffer my_imbuf;
26  uniform block { float x; float y; } my_ubo;
27  buffer B { float z; } my_ssbo;
28  void main() {
29    texture(sampler2D(my_tex,my_sam),vec2(1.0));
30    vec4 t;
31    sparseImageLoadARB(my_img,ivec2(0),t);
32    imageLoad(my_imbuf,42);
33    float x = my_ubo.x;
34    my_ssbo.z = 1.1;
35  }"""
36
37
38# An HLSL shader with uniforms without explicit bindings.
39# The counter buffer has an associated counter that needs a
40# binding.  Compile this shader with --auto-bind-uniforms to
41# give it a binding, since Glslang does not support attribute
42# [[vk::counter_binding(N))]].
43# See https://github.com/KhronosGroup/glslang/issues/1616
44HLSL_SHADER_WITHOUT_BINDINGS = """
45SamplerState s1 : register(s1);
46SamplerComparisonState s2 : register(s2);
47
48Texture1D t1 : register(t11);
49Texture2D <float4> t2 : register(t12);
50Texture3D <float2> t3 : register(t13);
51StructuredBuffer<float4> t4 : register(t14);
52ByteAddressBuffer t5 : register(t15);
53Buffer<float4> t6 : register(t16);
54
55RWTexture1D <float4>  u1 : register(u21);
56RWTexture1D <float4>  u2 : register(u22);
57RWTexture1D <float4>  u3 : register(u23);
58RWBuffer <float4> u4 : register(u24);
59RWByteAddressBuffer u5 : register(u25);
60RWStructuredBuffer<float> u6 : register(u26);
61AppendStructuredBuffer<float> u7 : register(u27);
62ConsumeStructuredBuffer<float> u8 : register(u28);
63
64float4 main() : SV_Target0 {
65   s1;
66   s2;
67
68   t1;
69   t2;
70   t3;
71   t4[2];
72   t5.Load(8);
73   t6;
74
75   u1;
76   u2;
77   u3;
78   u4[1];
79   u5.Load(15);
80   u6[2];
81   u7;
82   u8;
83   return float4(u8.Consume() + t2.SampleCmp(s2, 1.0, 2.0)) + t1.Sample(s1, 1.0)
84    + t6.Load(1);
85}
86"""
87
88@inside_glslc_testsuite('OptionFAutoBindUniforms')
89class UniformBindingsNotCreatedByDefault(expect.ErrorMessageSubstr):
90    """Tests that compilation fails when uniforms have no binding."""
91
92    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
93    glslc_args = ['-S', shader]
94    expected_error_substr = "sampler/texture/image requires layout(binding=X)"
95
96
97@inside_glslc_testsuite('OptionFAutoBindUniforms')
98class FAutoBindingUniformsGeneratesBindings(expect.ValidAssemblyFileWithSubstr):
99    """Tests that the compiler generates bindings for uniforms upon request ."""
100
101    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
102    glslc_args = ['-S', shader, '-fauto-bind-uniforms']
103    # Sufficient to just check one of the uniforms.
104    expected_assembly_substr = "OpDecorate %my_sam Binding 1"
105
106
107@inside_glslc_testsuite('OptionFAutoBindUniforms')
108class FImageBindingBaseOptionRespectedOnImage(expect.ValidAssemblyFileWithSubstr):
109    """Tests that -fimage-binding-base value is respected on images."""
110
111    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
112    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', '44']
113    expected_assembly_substr = "OpDecorate %my_img Binding 44"
114
115
116@inside_glslc_testsuite('OptionFAutoBindUniforms')
117class FImageBindingBaseOptionRespectedOnImageBuffer(expect.ValidAssemblyFileWithSubstr):
118    """Tests that -fimage-binding-base value is respected on image buffers."""
119
120    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
121    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', '44']
122    expected_assembly_substr = "OpDecorate %my_imbuf Binding 45"
123
124
125@inside_glslc_testsuite('OptionFAutoBindUniforms')
126class FTextureBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
127    """Tests that -ftexture-binding-base value is respected."""
128
129    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
130    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-ftexture-binding-base', '44']
131    expected_assembly_substr = "OpDecorate %my_tex Binding 44"
132
133
134@inside_glslc_testsuite('OptionFAutoBindUniforms')
135class FSamplerBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
136    """Tests that -fsampler-binding-base value is respected."""
137
138    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
139    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fsampler-binding-base', '44']
140    expected_assembly_substr = "OpDecorate %my_sam Binding 44"
141
142
143@inside_glslc_testsuite('OptionFAutoBindUniforms')
144class FUboBindingBaseOptionRespectedOnBuffer(expect.ValidAssemblyFileWithSubstr):
145    """Tests that -fubo-binding-base value is respected."""
146
147    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
148    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fubo-binding-base', '44']
149    expected_assembly_substr = "OpDecorate %my_ubo Binding 44"
150
151
152@inside_glslc_testsuite('OptionFAutoBindUniforms')
153class FCbufferBindingBaseOptionRespectedOnBuffer(expect.ValidAssemblyFileWithSubstr):
154    """Tests that -fcbuffer-binding-base value is respected."""
155
156    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
157    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fcbuffer-binding-base', '44']
158    expected_assembly_substr = "OpDecorate %my_ubo Binding 44"
159
160
161@inside_glslc_testsuite('OptionFAutoBindUniforms')
162class FImageBindingBaseNeedsValue(expect.ErrorMessageSubstr):
163    """Tests that -fimage-binding-base requires a value."""
164
165    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
166    glslc_args = ['-S', shader, '-fimage-binding-base']
167    expected_error_substr = "error: Option -fimage-binding-base requires at least one argument"
168
169
170@inside_glslc_testsuite('OptionFAutoBindUniforms')
171class FTextureBindingBaseNeedsValue(expect.ErrorMessageSubstr):
172    """Tests that -ftexture-binding-base requires a value."""
173
174    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
175    glslc_args = ['-S', shader, '-ftexture-binding-base']
176    expected_error_substr = "error: Option -ftexture-binding-base requires at least one argument"
177
178
179@inside_glslc_testsuite('OptionFAutoBindUniforms')
180class FSamplerBindingBaseNeedsValue(expect.ErrorMessageSubstr):
181    """Tests that -fsampler-binding-base requires a value."""
182
183    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
184    glslc_args = ['-S', shader, '-fsampler-binding-base']
185    expected_error_substr = "error: Option -fsampler-binding-base requires at least one argument"
186
187
188@inside_glslc_testsuite('OptionFAutoBindUniforms')
189class FUboBindingBaseNeedsValue(expect.ErrorMessageSubstr):
190    """Tests that -fubo-binding-base requires a value."""
191
192    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
193    glslc_args = ['-S', shader, '-fubo-binding-base']
194    expected_error_substr = "error: Option -fubo-binding-base requires at least one argument"
195
196
197@inside_glslc_testsuite('OptionFAutoBindUniforms')
198class FImageBindingBaseNeedsNumberValueIfNotStage(expect.ErrorMessageSubstr):
199    """Tests that -fimage-binding-base requires a number value."""
200
201    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
202    glslc_args = ['-S', shader, '-fimage-binding-base', '9x']
203    expected_error_substr = "error: invalid offset value 9x for -fimage-binding-base"
204
205
206@inside_glslc_testsuite('OptionFAutoBindUniforms')
207class FTextureBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
208    """Tests that -ftexture-binding-base requires a number value."""
209
210    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
211    glslc_args = ['-S', shader, '-ftexture-binding-base', '9x']
212    expected_error_substr = "error: invalid offset value 9x for -ftexture-binding-base"
213
214
215@inside_glslc_testsuite('OptionFAutoBindUniforms')
216class FSamplerBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
217    """Tests that -fsampler-binding-base requires a number value."""
218
219    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
220    glslc_args = ['-S', shader, '-fsampler-binding-base', '9x']
221    expected_error_substr = "error: invalid offset value 9x for -fsampler-binding-base"
222
223
224@inside_glslc_testsuite('OptionFAutoBindUniforms')
225class FUboBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
226    """Tests that -fubo-binding-base requires a number value."""
227
228    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
229    glslc_args = ['-S', shader, '-fubo-binding-base', '9x']
230    expected_error_substr = "error: invalid offset value 9x for -fubo-binding-base"
231
232
233@inside_glslc_testsuite('OptionFAutoBindUniforms')
234class FImageBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
235    """Tests that -fimage-binding-base requires an unsigned number value."""
236
237    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
238    glslc_args = ['-S', shader, '-fimage-binding-base', '-6']
239    expected_error_substr = "error: invalid offset value -6 for -fimage-binding-base"
240
241
242@inside_glslc_testsuite('OptionFAutoBindUniforms')
243class FTextureBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
244    """Tests that -ftexture-binding-base requires an unsigned number value."""
245
246    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
247    glslc_args = ['-S', shader, '-ftexture-binding-base', '-6']
248    expected_error_substr = "error: invalid offset value -6 for -ftexture-binding-base"
249
250
251@inside_glslc_testsuite('OptionFAutoBindUniforms')
252class FSamplerBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
253    """Tests that -fsampler-binding-base requires an unsigned value."""
254
255    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
256    glslc_args = ['-S', shader, '-fsampler-binding-base', '-6']
257    expected_error_substr = "error: invalid offset value -6 for -fsampler-binding-base"
258
259
260@inside_glslc_testsuite('OptionFAutoBindUniforms')
261class FUboBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
262    """Tests that -fubo-binding-base requires an unsigned value."""
263
264    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
265    glslc_args = ['-S', shader, '-fubo-binding-base', '-6']
266    expected_error_substr = "error: invalid offset value -6 for -fubo-binding-base"
267
268
269@inside_glslc_testsuite('OptionFAutoBindUniforms')
270class FImageBindingBaseForVertOptionRespectedOnImageCompileAsVert(expect.ValidAssemblyFileWithSubstr):
271    """Tests that -fimage-binding-base with vert stage value is respected on images."""
272
273    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
274    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'vert', '44']
275    expected_assembly_substr = "OpDecorate %my_img Binding 44"
276
277
278@inside_glslc_testsuite('OptionFAutoBindUniforms')
279class FImageBindingBaseForVertOptionIgnoredOnImageCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
280    """Tests that -fimage-binding-base with vert stage value is ignored when cmopiled as
281    fragment."""
282
283    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
284    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'vert', '44']
285    expected_assembly_substr = "OpDecorate %my_img Binding 2"
286
287
288@inside_glslc_testsuite('OptionFAutoBindUniforms')
289class FImageBindingBaseForFragOptionRespectedOnImageCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
290    """Tests that -fimage-binding-base with frag stage value is respected on images."""
291
292    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
293    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'frag', '44']
294    expected_assembly_substr = "OpDecorate %my_img Binding 44"
295
296
297@inside_glslc_testsuite('OptionFAutoBindUniforms')
298class FSsboBindingBaseRespectedOnSsboCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
299    """Tests that -fssbo-binding-base with frag stage value is respected on SSBOs."""
300
301    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
302    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', '100']
303    expected_assembly_substr = "OpDecorate %my_ssbo Binding 100"
304
305
306@inside_glslc_testsuite('OptionFAutoBindUniforms')
307class FSsboBindingBaseForFragOptionRespectedOnSsboCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
308    """Tests that -fssbo-binding-base with frag stage value is respected on SSBOs."""
309
310    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
311    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', 'frag', '100']
312    expected_assembly_substr = "OpDecorate %my_ssbo Binding 100"
313
314
315@inside_glslc_testsuite('OptionFAutoBindUniforms')
316class FSsboBindingBaseForFragOptionIgnoredOnSsboCompileAsVert(expect.ValidAssemblyFileWithSubstr):
317    """Tests that -fssbo-binding-base with frag stage value is ignored on SSBOs
318    when compiling as a vertex shader."""
319
320    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
321    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', 'frag', '100']
322    expected_assembly_substr = "OpDecorate %my_ssbo Binding 5"
323
324
325@inside_glslc_testsuite('OptionFAutoBindUniforms')
326class AutomaticHlslIoMapping(expect.ValidAssemblyFileWithSubstr):
327    """Tests that HLSL IO Mapping uses the register values in the source code."""
328
329    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
330    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap',
331                  '-fauto-bind-uniforms', shader]
332    expected_assembly_substr = "OpDecorate %u8 Binding 28"
333
334
335@inside_glslc_testsuite('OptionFAutoBindUniforms')
336class HlslFSamplerBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
337    """Tests that -fsampler-binding-base sets binding base for samplers in HLSL
338    compilation."""
339
340    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
341    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
342                  '-fauto-bind-uniforms', '-fsampler-binding-base', '100']
343    expected_assembly_substr = "OpDecorate %s2 Binding 102"
344
345
346@inside_glslc_testsuite('OptionFAutoBindUniforms')
347class HlslFSamplerBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
348    """Tests that -fsampler-binding-base for frag sets binding base for samplers
349    in HLSL compilation."""
350
351    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
352    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
353                  '-fauto-bind-uniforms', '-fsampler-binding-base', 'frag', '100']
354    expected_assembly_substr = "OpDecorate %s2 Binding 102"
355
356
357@inside_glslc_testsuite('OptionFAutoBindUniforms')
358class HlslFSamplerBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
359    """Tests that -fsampler-binding-base for compute is ignored when compiling
360    as a fragment shader."""
361
362    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
363    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
364                  '-fauto-bind-uniforms', '-fsampler-binding-base', 'compute', '100']
365    expected_assembly_substr = "OpDecorate %s2 Binding 2"
366
367
368@inside_glslc_testsuite('OptionFAutoBindUniforms')
369class HlslFTextureBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
370    """Tests that -ftexture-binding-base sets binding base for textures in HLSL
371    compilation."""
372
373    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
374    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
375                  '-fauto-bind-uniforms', '-ftexture-binding-base', '100']
376    expected_assembly_substr = "OpDecorate %t6 Binding 116"
377
378
379@inside_glslc_testsuite('OptionFAutoBindUniforms')
380class HlslFTextureBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
381    """Tests that -ftexture-binding-base for frag sets binding base for textures
382    in HLSL compilation."""
383
384    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
385    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
386                  '-fauto-bind-uniforms', '-ftexture-binding-base', 'frag', '100']
387    expected_assembly_substr = "OpDecorate %t6 Binding 116"
388
389
390@inside_glslc_testsuite('OptionFAutoBindUniforms')
391class HlslFTextureBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
392    """Tests that -ftexture-binding-base for compute is ignored when compiling
393    as a fragment shader."""
394
395    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
396    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
397                  '-fauto-bind-uniforms', '-ftexture-binding-base', 'compute', '100']
398    expected_assembly_substr = "OpDecorate %t6 Binding 16"
399
400
401@inside_glslc_testsuite('OptionFAutoBindUniforms')
402class HlslFUavBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
403    """Tests that -fuav-binding-base sets binding base for UAVs in HLSL
404    compilation."""
405
406    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
407    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
408                  '-fauto-bind-uniforms', '-fuav-binding-base', '100']
409    expected_assembly_substr = "OpDecorate %u8 Binding 128"
410
411
412@inside_glslc_testsuite('OptionFAutoBindUniforms')
413class HlslFUavBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
414    """Tests that -fuav-binding-base for frag sets binding base for UAVs in HLSL
415    compilation."""
416
417    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
418    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
419                  '-fauto-bind-uniforms', '-fuav-binding-base', 'frag', '100']
420    expected_assembly_substr = "OpDecorate %u8 Binding 128"
421
422
423@inside_glslc_testsuite('OptionFAutoBindUniforms')
424class HlslFUavBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
425    """Tests that -fuav-binding-base for compute is ignored when compiling
426    as a fragment shader."""
427
428    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
429    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
430                  '-fauto-bind-uniforms', '-fuav-binding-base', 'compute', '100']
431    expected_assembly_substr = "OpDecorate %u8 Binding 28"
432