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