1# Copyright 2019 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
20def vulkan_vertex_shader():
21    return """#version 310 es
22void main() { int t = gl_VertexIndex; }"""
23
24
25def vulkan_compute_subgroup_shader():
26    """Returns a compute shader that requires Vulkan 1.1 and SPIR-V 1.3"""
27    return """#version 450
28              #extension GL_KHR_shader_subgroup_basic : enable
29              void main() { subgroupBarrier(); }"""
30
31
32@inside_glslc_testsuite('OptionTargetSpv')
33class TestDefaultTargetSpvWithVulkanShader(expect.ValidObjectFile):
34    """Tests that compiling a Vulkan-specific shader with a default
35    target environment succeeds"""
36    shader = FileShader(vulkan_vertex_shader(), '.vert')
37    glslc_args = ['-c', shader]
38
39
40@inside_glslc_testsuite('OptionTargetSpv')
41class TestDefaultTargetSpvWithShaderRequiringSpv1p3Fails(expect.ErrorMessageSubstr):
42    """Tests that compiling a shader requiring SPIR-V 1.3 with default SPIR-V
43    target should fail.
44    """
45    shader = FileShader(vulkan_compute_subgroup_shader(), '.comp')
46    glslc_args = ['-c', shader]
47    expected_error_substr = ["error: 'subgroup op' : requires SPIR-V 1.3\n"]
48
49
50@inside_glslc_testsuite('OptionTargetSpv')
51class TestTargetSpv1p2WithShaderRequiringSpv1p3Fails(expect.ErrorMessageSubstr):
52    """Tests that compiling a shader requiring SPIR-V 1.3 but targeting 1.2
53    should fail.
54    """
55    shader = FileShader(vulkan_compute_subgroup_shader(), '.comp')
56    glslc_args = ['--target-spv=spv1.2', '-c', shader]
57    expected_error_substr = ["error: 'subgroup op' : requires SPIR-V 1.3\n"]
58
59
60@inside_glslc_testsuite('OptionTargetSpv')
61class TestTargetSpv1p3(expect.ValidObjectFile1_3):
62    """Tests that compiling to spv1.3 succeeds and generates SPIR-V 1.3 binary."""
63    shader = FileShader(vulkan_compute_subgroup_shader(), '.comp')
64    glslc_args = ['--target-spv=spv1.3', '-c', shader]
65
66
67@inside_glslc_testsuite('OptionTargetSpv')
68class TestTargetSpv1p4(expect.ValidObjectFile1_4):
69    """Tests that compiling to spv1.4 succeeds and generates SPIR-V 1.4 binary."""
70    shader = FileShader(vulkan_vertex_shader(), '.vert')
71    glslc_args = ['--target-spv=spv1.4', '-c', shader]
72
73
74@inside_glslc_testsuite('OptionTargetSpv')
75class TestTargetSpv1p5(expect.ValidObjectFile1_5):
76    """Tests that compiling to spv1.5 succeeds and generates SPIR-V 1.5 binary."""
77    shader = FileShader(vulkan_vertex_shader(), '.vert')
78    glslc_args = ['--target-spv=spv1.5', '-c', shader]
79
80
81### Option parsing error cases
82
83@inside_glslc_testsuite('OptionTargetSpv')
84class TestTargetSpvNoArg(expect.ErrorMessage):
85    """Tests the error message of assigning empty string to --target-spv"""
86    shader = FileShader(vulkan_vertex_shader(), '.vert')
87    glslc_args = ['--target-spv=', shader]
88    expected_error = ["glslc: error: invalid value ",
89                      "'' in '--target-spv='\n"]
90
91
92@inside_glslc_testsuite('OptionTargetSpv')
93class TestTargetSpvNoEqNoArg(expect.ErrorMessage):
94    """Tests the error message of using --target-spv without equal sign and
95    arguments"""
96    shader = FileShader(vulkan_vertex_shader(), '.vert')
97    glslc_args = ['--target-spv', shader]
98    expected_error = ["glslc: error: unsupported option: ",
99                      "'--target-spv'\n"]
100
101
102@inside_glslc_testsuite('OptionTargetSpv')
103class TestTargetSpvNoEqWithArg(expect.ErrorMessage):
104    """Tests the error message of using --target-spv without equal sign but
105    arguments"""
106    shader = FileShader(vulkan_vertex_shader(), '.vert')
107    glslc_args = ['--target-spv', 'spv1.3', shader]
108    expected_error = ["glslc: error: unsupported option: ",
109                      "'--target-spv'\n"]
110
111
112@inside_glslc_testsuite('OptionTargetSpv')
113class TestTargetSpvEqWrongArg(expect.ErrorMessage):
114    """Tests the error message of using --target-spv with wrong argument"""
115    shader = FileShader(vulkan_vertex_shader(), '.vert')
116    glslc_args = ['--target-spv=wrong_arg', shader]
117    expected_error = ["glslc: error: invalid value ",
118                      "'wrong_arg' in '--target-spv=wrong_arg'\n"]
119