1# 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
16from glslc_test_framework import inside_glslc_testsuite
17from placeholder import FileShader
18
19
20def assembly_comments():
21    return """
22    ; SPIR-V
23    ; Version: 1.0
24    ; Generator: Google Shaderc over Glslang; 10
25    ; Bound: 6
26    ; Schema: 0"""
27
28
29def empty_main_assembly():
30    return assembly_comments() + """
31         OpCapability Shader
32    %1 = OpExtInstImport "GLSL.std.450"
33         OpMemoryModel Logical GLSL450
34         OpEntryPoint Vertex %4 "main"
35         OpSource ESSL 310
36         OpName %4 "main"
37    %2 = OpTypeVoid
38    %3 = OpTypeFunction %2
39    %4 = OpFunction %2 None %3
40    %5 = OpLabel
41         OpReturn
42         OpFunctionEnd"""
43
44
45def empty_main():
46    return '#version 310 es\nvoid main() {}'
47
48
49@inside_glslc_testsuite('SpirvAssembly')
50class TestAssemblyFileAsOnlyParameter(expect.ValidNamedObjectFile):
51    """Tests that glslc accepts a SPIR-V assembly file as the only parameter."""
52
53    shader = FileShader(empty_main_assembly(), '.spvasm')
54    glslc_args = [shader]
55    expected_object_filenames = ('a.spv',)
56
57
58@inside_glslc_testsuite('SpirvAssembly')
59class TestDashCAssemblyFile(expect.ValidObjectFile):
60    """Tests that -c works with SPIR-V assembly file."""
61
62    shader = FileShader(empty_main_assembly(), '.spvasm')
63    glslc_args = ['-c', shader]
64
65
66@inside_glslc_testsuite('SpirvAssembly')
67class TestAssemblyFileWithOnlyComments(expect.ValidObjectFile):
68    """Tests that glslc accepts an assembly file with only comments inside."""
69
70    shader = FileShader(assembly_comments(), '.spvasm')
71    glslc_args = ['-c', shader]
72
73
74@inside_glslc_testsuite('SpirvAssembly')
75class TestEmptyAssemblyFile(expect.ValidObjectFile):
76    """Tests that glslc accepts an empty assembly file."""
77
78    shader = FileShader('', '.spvasm')
79    glslc_args = ['-c', shader]
80
81
82@inside_glslc_testsuite('SpirvAssembly')
83class TestDashEAssemblyFile(expect.SuccessfulReturn, expect.NoGeneratedFiles):
84    """Tests that -E works with SPIR-V assembly file."""
85
86    shader = FileShader(empty_main_assembly(), '.spvasm')
87    glslc_args = ['-E', shader]
88
89
90@inside_glslc_testsuite('SpirvAssembly')
91class TestDashSAssemblyFile(expect.SuccessfulReturn, expect.NoGeneratedFiles):
92    """Tests that -S works with SPIR-V assembly file."""
93
94    shader = FileShader(empty_main_assembly(), '.spvasm')
95    glslc_args = ['-S', shader]
96
97
98@inside_glslc_testsuite('SpirvAssembly')
99class TestMultipleAssemblyFiles(expect.ValidObjectFile):
100    """Tests that glslc accepts multiple SPIR-V assembly files."""
101
102    shader1 = FileShader(empty_main_assembly(), '.spvasm')
103    shader2 = FileShader(empty_main_assembly(), '.spvasm')
104    shader3 = FileShader(empty_main_assembly(), '.spvasm')
105    glslc_args = ['-c', shader1, shader2, shader3]
106
107
108@inside_glslc_testsuite('SpirvAssembly')
109class TestHybridInputFiles(expect.ValidObjectFile):
110    """Tests that glslc accepts a mix of SPIR-V assembly files and
111    GLSL source files."""
112
113    shader1 = FileShader(empty_main_assembly(), '.spvasm')
114    shader2 = FileShader(empty_main(), '.vert')
115    shader3 = FileShader(empty_main(), '.frag')
116    glslc_args = ['-c', shader1, shader2, shader3]
117
118
119@inside_glslc_testsuite('SpirvAssembly')
120class TestShaderStageWithAssemblyFile(expect.ErrorMessage):
121    """Tests that assembly files don't work with -fshader-stage"""
122
123    shader = FileShader(empty_main_assembly(), '.spvasm')
124    glslc_args = ['-c', '-fshader-stage=vertex', shader]
125
126    expected_error = [
127        shader, ": error: #version: Desktop shaders for Vulkan SPIR-V require "
128        "version 140 or higher\n",
129        shader, ":2: error: 'extraneous semicolon' :",
130        " not supported for this version or the enabled extensions\n",
131        shader, ":2: error: '' :  syntax error, unexpected IDENTIFIER\n",
132        '3 errors generated.\n']
133
134
135@inside_glslc_testsuite('SpirvAssembly')
136class TestStdWithAssemblyFile(expect.ValidObjectFile):
137    """Tests that --std= doesn't affect the processing of assembly files."""
138
139    shader = FileShader(empty_main_assembly(), '.spvasm')
140    glslc_args = ['-c', '-std=310es', shader]
141