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